summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-01-25 15:36:11 +0000
committerAndrew Tridgell <tridge@samba.org>1998-01-25 15:36:11 +0000
commitdb5e1e646c9616db5a3f5fe224153176cd556c01 (patch)
tree354301b6cea26370c99bca720ec892cb8836e500 /source3/smbd
parent40dfc7e6de4423a1b66f68ccb39f8d74b0257682 (diff)
downloadsamba-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)
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/trans2.c28
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));