s3: Move basic SMB checking to a much earlier point
authorVolker Lendecke <vl@samba.org>
Thu, 5 Jan 2012 10:58:17 +0000 (11:58 +0100)
committerVolker Lendecke <vl@samba.org>
Thu, 5 Jan 2012 12:09:35 +0000 (13:09 +0100)
source3/smbd/process.c

index bf161bbdba3a725e7ffe0f8bbde3cee4ec73932b..2f8f88fa2acb3589022424b524e532d306cedbef 100644 (file)
@@ -1407,25 +1407,6 @@ static connection_struct *switch_message(uint8 type, struct smb_request *req, in
 
        errno = 0;
 
-       /* Make sure this is an SMB packet. smb_size contains NetBIOS header
-        * so subtract 4 from it. */
-       if ((size < (smb_size - 4)) || !valid_smb_header(sconn, req->inbuf)) {
-               DEBUG(2,("Non-SMB packet of length %d. Terminating server\n",
-                        smb_len(req->inbuf)));
-
-               /* special magic for immediate exit */
-               if ((size == smb_size) &&
-                   (IVAL(req->inbuf, 4) == 0x74697865) &&
-                   lp_parm_bool(-1, "smbd", "suicide mode", false)) {
-                       uint8_t exitcode = CVAL(req->inbuf, 8);
-                       DEBUG(1, ("Exiting immediately with code %d\n",
-                                 (int)exitcode));
-                       exit(exitcode);
-               }
-
-               exit_server_cleanly("Non-SMB packet");
-       }
-
        if (smb_messages[type].fn == NULL) {
                DEBUG(0,("Unknown message type %d!\n",type));
                smb_dump("Unknown", 1, (const char *)req->inbuf, size);
@@ -1667,6 +1648,25 @@ static void process_smb(struct smbd_server_connection *sconn,
                }
        }
 
+       /* Make sure this is an SMB packet. smb_size contains NetBIOS header
+        * so subtract 4 from it. */
+       if ((nread < (smb_size - 4)) || !valid_smb_header(sconn, inbuf)) {
+               DEBUG(2,("Non-SMB packet of length %d. Terminating server\n",
+                        smb_len(inbuf)));
+
+               /* special magic for immediate exit */
+               if ((nread == 9) &&
+                   (IVAL(inbuf, 4) == 0x74697865) &&
+                   lp_parm_bool(-1, "smbd", "suicide mode", false)) {
+                       uint8_t exitcode = CVAL(inbuf, 8);
+                       DEBUG(1, ("Exiting immediately with code %d\n",
+                                 (int)exitcode));
+                       exit(exitcode);
+               }
+
+               exit_server_cleanly("Non-SMB packet");
+       }
+
        show_msg((char *)inbuf);
 
        construct_reply(sconn, (char *)inbuf, nread, unread_bytes, seqnum,