always align both the parameter and data bytes on a 4 byte boundary in
authorAndrew Tridgell <tridge@samba.org>
Sun, 25 Jan 1998 15:36:11 +0000 (15:36 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 25 Jan 1998 15:36:11 +0000 (15:36 +0000)
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!

source/smbd/trans2.c

index eb8356cc5374751b200acd1f1256f38e6d1b1aca..139ded57b24b5ccebb623ee217dea3107bec0ef0 100644 (file)
@@ -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));
+
 
-  whileparams_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));