diff options
author | Christof Schmitt <cs@samba.org> | 2014-08-14 22:04:33 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-08-30 00:27:13 +0200 |
commit | 2132acb4d99d01834f1ed8900f1db45bb1253922 (patch) | |
tree | a258f58041914c69a9dd3e72ce3f623c742f9849 /source3/smbd/aio.c | |
parent | 52630eb78fe202f0060ff6c8772f26bdcc9175ff (diff) | |
download | samba-2132acb4d99d01834f1ed8900f1db45bb1253922.tar.gz samba-2132acb4d99d01834f1ed8900f1db45bb1253922.tar.xz samba-2132acb4d99d01834f1ed8900f1db45bb1253922.zip |
smbd: Add padding byte to readx response
MS-CIFS 2.2.4.42.2 states: "Pad (1 byte): This field is optional. When
using the NT LAN Manager dialect, this field can be used to align the
Data field to a 16-bit boundary relative to the start of the SMB Header.
If Unicode strings are being used, this field MUST be present. When
used, this field MUST be one padding byte long."
Always add the padding byte to all readx responses to avoid additional
complexity.
Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/smbd/aio.c')
-rw-r--r-- | source3/smbd/aio.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index 2235c32eef..f5e4cc6837 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -196,7 +196,7 @@ NTSTATUS schedule_aio_read_and_X(connection_struct *conn, /* The following is safe from integer wrap as we've already checked smb_maxcnt is 128k or less. Wct is 12 for read replies */ - bufsize = smb_size + 12 * 2 + smb_maxcnt; + bufsize = smb_size + 12 * 2 + smb_maxcnt + 1 /* padding byte */; if ((aio_ex = create_aio_extra(NULL, fsp, bufsize)) == NULL) { DEBUG(10,("schedule_aio_read_and_X: malloc fail.\n")); @@ -206,6 +206,7 @@ NTSTATUS schedule_aio_read_and_X(connection_struct *conn, construct_reply_common_req(smbreq, (char *)aio_ex->outbuf.data); srv_set_message((char *)aio_ex->outbuf.data, 12, 0, True); SCVAL(aio_ex->outbuf.data,smb_vwv0,0xFF); /* Never a chained reply. */ + SCVAL(smb_buf(aio_ex->outbuf.data), 0, 0); /* padding byte */ init_strict_lock_struct(fsp, (uint64_t)smbreq->smbpid, (uint64_t)startpos, (uint64_t)smb_maxcnt, READ_LOCK, @@ -221,7 +222,8 @@ NTSTATUS schedule_aio_read_and_X(connection_struct *conn, aio_ex->offset = startpos; req = SMB_VFS_PREAD_SEND(aio_ex, fsp->conn->sconn->ev_ctx, - fsp, smb_buf(aio_ex->outbuf.data), + fsp, + smb_buf(aio_ex->outbuf.data) + 1 /* pad */, smb_maxcnt, startpos); if (req == NULL) { DEBUG(0,("schedule_aio_read_and_X: aio_read failed. " @@ -256,7 +258,7 @@ static void aio_pread_smb1_done(struct tevent_req *req) files_struct *fsp = aio_ex->fsp; int outsize; char *outbuf = (char *)aio_ex->outbuf.data; - char *data = smb_buf(outbuf); + char *data = smb_buf(outbuf) + 1 /* padding byte */; ssize_t nread; int err; @@ -285,7 +287,8 @@ static void aio_pread_smb1_done(struct tevent_req *req) ERROR_NT(map_nt_error_from_unix(err)); outsize = srv_set_message(outbuf,0,0,true); } else { - outsize = srv_set_message(outbuf, 12, nread, False); + outsize = srv_set_message(outbuf, 12, + nread + 1 /* padding byte */, false); SSVAL(outbuf,smb_vwv2, 0xFFFF); /* Remaining - must be * -1. */ SSVAL(outbuf,smb_vwv5, nread); SSVAL(outbuf,smb_vwv6, smb_offset(data,outbuf)); |