r23537: Revert the inbuf/outbuf part of r23528: This caused the Solaris CC make test
authorVolker Lendecke <vlendec@samba.org>
Mon, 18 Jun 2007 09:25:31 +0000 (09:25 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:23:26 +0000 (12:23 -0500)
to break. The Solaris CC put the static char InBuffer[TOTAL_BUFFER_SIZE] on an
odd address, the malloc'ed one is always aligned. The problem showed up in
pull_ucs2, ucs2_align uses the address of InBuffer as an indication whether to
bump up the src of the string by one. Unfortunately in the trans calls the
data portion is malloced and thus has different alignment guarantees than a
static variable. This one is bigger....

Volker

source/smbd/process.c

index 0e1ad06ed567d653e954c839dcc25e4e3d3f4a9d..3b922af51fedbf48c83f9a4e304da10a2f5ad509 100644 (file)
@@ -25,10 +25,9 @@ uint16 global_smbpid;
 extern struct auth_context *negprot_global_auth_context;
 extern int smb_echo_count;
 
 extern struct auth_context *negprot_global_auth_context;
 extern int smb_echo_count;
 
-#define TOTAL_BUFFER_SIZE (BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE+SAFETY_MARGIN)
-
-static char InBuffer[TOTAL_BUFFER_SIZE];
-static char OutBuffer[TOTAL_BUFFER_SIZE];
+static char *InBuffer = NULL;
+static char *OutBuffer = NULL;
+static char *current_inbuf = NULL;
 
 /* 
  * Size of data we can send to client. Set
 
 /* 
  * Size of data we can send to client. Set
@@ -209,11 +208,11 @@ BOOL push_deferred_smb_message(uint16 mid,
 
        DEBUG(10,("push_deferred_open_smb_message: pushing message len %u mid %u "
                  "timeout time [%u.%06u]\n",
 
        DEBUG(10,("push_deferred_open_smb_message: pushing message len %u mid %u "
                  "timeout time [%u.%06u]\n",
-                 (unsigned int) smb_len(InBuffer)+4, (unsigned int)mid,
+                 (unsigned int) smb_len(current_inbuf)+4, (unsigned int)mid,
                  (unsigned int)end_time.tv_sec,
                  (unsigned int)end_time.tv_usec));
 
                  (unsigned int)end_time.tv_sec,
                  (unsigned int)end_time.tv_usec));
 
-       return push_queued_message(InBuffer, smb_len(InBuffer)+4,
+       return push_queued_message(current_inbuf, smb_len(current_inbuf)+4,
                                   request_time, end_time,
                                   private_data, priv_len);
 }
                                   request_time, end_time,
                                   private_data, priv_len);
 }
@@ -1008,6 +1007,7 @@ static int switch_message(int type,char *inbuf,char *outbuf,int size,int bufsize
                        return(ERROR_DOS(ERRSRV,ERRaccess));
                }
 
                        return(ERROR_DOS(ERRSRV,ERRaccess));
                }
 
+               current_inbuf = inbuf; /* In case we need to defer this message in open... */
                outsize = smb_messages[type].fn(conn, inbuf,outbuf,size,bufsize);
        }
 
                outsize = smb_messages[type].fn(conn, inbuf,outbuf,size,bufsize);
        }
 
@@ -1441,6 +1441,47 @@ char *get_OutBuffer(void)
        return OutBuffer;
 }
 
        return OutBuffer;
 }
 
+const int total_buffer_size = (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
+
+/****************************************************************************
+ Allocate a new InBuffer. Returns the new and old ones.
+****************************************************************************/
+
+static char *NewInBuffer(char **old_inbuf)
+{
+       char *new_inbuf = (char *)SMB_MALLOC(total_buffer_size);
+       if (!new_inbuf) {
+               return NULL;
+       }
+       if (old_inbuf) {
+               *old_inbuf = InBuffer;
+       }
+       InBuffer = new_inbuf;
+#if defined(DEVELOPER)
+       clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, InBuffer, total_buffer_size);
+#endif
+       return InBuffer;
+}
+
+/****************************************************************************
+ Allocate a new OutBuffer. Returns the new and old ones.
+****************************************************************************/
+
+static char *NewOutBuffer(char **old_outbuf)
+{
+       char *new_outbuf = (char *)SMB_MALLOC(total_buffer_size);
+       if (!new_outbuf) {
+               return NULL;
+       }
+       if (old_outbuf) {
+               *old_outbuf = OutBuffer;
+       }
+       OutBuffer = new_outbuf;
+#if defined(DEVELOPER)
+       clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, OutBuffer, total_buffer_size);
+#endif
+       return OutBuffer;
+}
 
 /****************************************************************************
  Process commands from the client
 
 /****************************************************************************
  Process commands from the client
@@ -1451,6 +1492,11 @@ void smbd_process(void)
        time_t last_timeout_processing_time = time(NULL);
        unsigned int num_smbs = 0;
 
        time_t last_timeout_processing_time = time(NULL);
        unsigned int num_smbs = 0;
 
+       /* Allocate the primary Inbut/Output buffers. */
+
+       if ((NewInBuffer(NULL) == NULL) || (NewOutBuffer(NULL) == NULL)) 
+               return;
+
        max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
 
        while (True) {
        max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
 
        while (True) {
@@ -1474,8 +1520,7 @@ void smbd_process(void)
                run_events(smbd_event_context(), 0, NULL, NULL);
 
 #if defined(DEVELOPER)
                run_events(smbd_event_context(), 0, NULL, NULL);
 
 #if defined(DEVELOPER)
-               clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE,
-                              InBuffer, TOTAL_BUFFER_SIZE);
+               clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, InBuffer, total_buffer_size);
 #endif
 
                while (!receive_message_or_smb(InBuffer,BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE,select_timeout)) {
 #endif
 
                while (!receive_message_or_smb(InBuffer,BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE,select_timeout)) {
@@ -1496,8 +1541,7 @@ void smbd_process(void)
                 */ 
                num_echos = smb_echo_count;
 
                 */ 
                num_echos = smb_echo_count;
 
-               clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE,
-                              OutBuffer, TOTAL_BUFFER_SIZE);
+               clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, OutBuffer, total_buffer_size);
 
                process_smb(InBuffer, OutBuffer);
 
 
                process_smb(InBuffer, OutBuffer);