Don't automatically set nt status code flag unless client tells us it can
authorJeremy Allison <jra@samba.org>
Mon, 1 Dec 2003 02:25:56 +0000 (02:25 +0000)
committerJeremy Allison <jra@samba.org>
Mon, 1 Dec 2003 02:25:56 +0000 (02:25 +0000)
cope.
Jeremy.

source/smbd/process.c
source/smbd/sesssetup.c

index 8a90a15d29741d9f810e8f5eb3899e93b3a97b9a..d93826bc7e2a9f4f3668cba2faa28e059216b525 100644 (file)
@@ -924,11 +924,17 @@ const char *smb_fn_name(int type)
        return(smb_messages[type].name);
 }
 
-
 /****************************************************************************
- Helper function for contruct_reply.
+ Helper functions for contruct_reply.
 ****************************************************************************/
 
+static uint32 common_flags2 = FLAGS2_LONG_PATH_COMPONENTS|FLAGS2_EXTENDED_SECURITY;
+
+void add_to_common_flags2(uint32 v)
+{
+       common_flags2 |= v;
+}
+
 void construct_reply_common(char *inbuf,char *outbuf)
 {
        memset(outbuf,'\0',smb_size);
@@ -941,9 +947,8 @@ void construct_reply_common(char *inbuf,char *outbuf)
        SCVAL(outbuf,smb_reh,0);
        SCVAL(outbuf,smb_flg, FLAG_REPLY | (CVAL(inbuf,smb_flg) & FLAG_CASELESS_PATHNAMES)); 
        SSVAL(outbuf,smb_flg2,
-             (SVAL(inbuf,smb_flg2) & FLAGS2_UNICODE_STRINGS) |
-             FLAGS2_LONG_PATH_COMPONENTS |
-             FLAGS2_32_BIT_ERROR_CODES | FLAGS2_EXTENDED_SECURITY);
+               (SVAL(inbuf,smb_flg2) & FLAGS2_UNICODE_STRINGS) |
+               common_flags2);
 
        SSVAL(outbuf,smb_err,SMB_SUCCESS);
        SSVAL(outbuf,smb_tid,SVAL(inbuf,smb_tid));
index 64c25db2ab0ea6f409b334736cc5ba6cd6e3119b..fb0744bb730ce63a78d08c3d546b20568be9d0a6 100644 (file)
@@ -472,6 +472,11 @@ static int reply_sesssetup_and_X_spnego(connection_struct *conn, char *inbuf,
 
        if (global_client_caps == 0) {
                global_client_caps = IVAL(inbuf,smb_vwv10);
+
+               if (global_client_caps & CAP_STATUS32) {
+                       add_to_common_flags2(FLAGS2_32_BIT_ERROR_CODES);
+               }
+
        }
                
        p = (uint8 *)smb_buf(inbuf);
@@ -615,17 +620,22 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,
                enum remote_arch_types ra_type = get_remote_arch();
                char *p = smb_buf(inbuf);    
 
-               if(global_client_caps == 0)
+               if(global_client_caps == 0) {
                        global_client_caps = IVAL(inbuf,smb_vwv11);
                
-               /* client_caps is used as final determination if client is NT or Win95. 
-                  This is needed to return the correct error codes in some
-                  circumstances.
-               */
+                       if (global_client_caps & CAP_STATUS32) {
+                               add_to_common_flags2(FLAGS2_32_BIT_ERROR_CODES);
+                       }
+
+                       /* client_caps is used as final determination if client is NT or Win95. 
+                          This is needed to return the correct error codes in some
+                          circumstances.
+                       */
                
-               if(ra_type == RA_WINNT || ra_type == RA_WIN2K || ra_type == RA_WIN95) {
-                       if(!(global_client_caps & (CAP_NT_SMBS | CAP_STATUS32))) {
-                               set_remote_arch( RA_WIN95);
+                       if(ra_type == RA_WINNT || ra_type == RA_WIN2K || ra_type == RA_WIN95) {
+                               if(!(global_client_caps & (CAP_NT_SMBS | CAP_STATUS32))) {
+                                       set_remote_arch( RA_WIN95);
+                               }
                        }
                }
 
@@ -686,7 +696,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,
                        ra_lanman_string( native_lanman );
 
        }
-       
+
        if (SVAL(inbuf,smb_vwv4) == 0) {
                setup_new_vc_session();
        }