diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-01-25 15:36:11 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-01-25 15:36:11 +0000 |
commit | db5e1e646c9616db5a3f5fe224153176cd556c01 (patch) | |
tree | 354301b6cea26370c99bca720ec892cb8836e500 | |
parent | 40dfc7e6de4423a1b66f68ccb39f8d74b0257682 (diff) | |
download | samba-db5e1e646c9616db5a3f5fe224153176cd556c01.tar.gz samba-db5e1e646c9616db5a3f5fe224153176cd556c01.tar.bz2 samba-db5e1e646c9616db5a3f5fe224153176cd556c01.zip |
always align both the parameter and data bytes on a 4 byte boundary in
trans2 responses.
I'm not at all convinced this was causing problems, because
observations of Win95 show that it produces totally non-aligned
paramater bytes and 2 byte aligned data bytes. We were previously
always producing 2 byte aligned data and parameter bytes so we already
had "better" alignment than Win95.
lets hope no clients rely on servers producing unaligned data or
parameters!
(This used to be commit 68ad11a7352824fea46ecbe67a3827a7ba3bcbab)
-rw-r--r-- | source3/smbd/trans2.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index eb8356cc53..139ded57b2 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -55,7 +55,8 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, char *pp = params; char *pd = pdata; int params_sent_thistime, data_sent_thistime, total_sent_thistime; - int alignment_offset = 1; + int alignment_offset = 3; + int data_alignment_offset = 0; /* Initially set the wcnt area to be 10 - this is true for all trans2 replies */ @@ -69,18 +70,28 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, return 0; } + /* when sending params and data ensure that both are nicely aligned */ + if ((params_to_send % 4) != 0) + data_alignment_offset = 4 - (params_to_send % 4); + /* Space is bufsize minus Netbios over TCP header minus SMB header */ - /* The alignment_offset is to align the param and data bytes on an even byte + /* The alignment_offset is to align the param bytes on an even byte boundary. NT 4.0 Beta needs this to work correctly. */ - useable_space = bufsize - ((smb_buf(outbuf)+alignment_offset) - outbuf); + useable_space = bufsize - ((smb_buf(outbuf)+ + alignment_offset+data_alignment_offset) - + outbuf); + /* useable_space can never be more than max_send minus the alignment offset. */ - useable_space = MIN(useable_space, max_send - alignment_offset); + useable_space = MIN(useable_space, + max_send - (alignment_offset+data_alignment_offset)); + - while( params_to_send || data_to_send) + while (params_to_send || data_to_send) { /* Calculate whether we will totally or partially fill this packet */ - total_sent_thistime = params_to_send + data_to_send + alignment_offset; + total_sent_thistime = params_to_send + data_to_send + + alignment_offset + data_alignment_offset; /* We can never send more than useable_space */ total_sent_thistime = MIN(total_sent_thistime, useable_space); @@ -121,7 +132,8 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, /* The offset of the data bytes is the offset of the parameter bytes plus the number of parameters being sent this time */ SSVAL(outbuf,smb_droff,((smb_buf(outbuf)+alignment_offset) - - smb_base(outbuf)) + params_sent_thistime); + smb_base(outbuf)) + + params_sent_thistime + data_alignment_offset); SSVAL(outbuf,smb_drdisp, pd - pdata); } @@ -130,7 +142,7 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, memcpy((smb_buf(outbuf)+alignment_offset),pp,params_sent_thistime); /* Copy in the data bytes */ if(data_sent_thistime) - memcpy(smb_buf(outbuf)+alignment_offset+params_sent_thistime,pd,data_sent_thistime); + memcpy(smb_buf(outbuf)+alignment_offset+params_sent_thistime+data_alignment_offset,pd,data_sent_thistime); DEBUG(9,("t2_rep: params_sent_thistime = %d, data_sent_thistime = %d, useable_space = %d\n", params_sent_thistime, data_sent_thistime, useable_space)); |