- fix the EALREADY bug so connections to slow hosts with smbclient get
authorAndrew Tridgell <tridge@samba.org>
Wed, 2 Oct 1996 16:16:16 +0000 (16:16 +0000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 2 Oct 1996 16:16:16 +0000 (16:16 +0000)
through

- add workarounds to handle the win95 and WinNT bugs in handling
password lengths in sessionsetup
(This used to be commit 671b3a3a770c824ae77fcb83dc551054a880edad)

source3/lib/util.c
source3/smbd/reply.c

index 86b0016dd286a4ee5c3005282100c8f65c95fd4c..c6a808ce830d254944093d8af62c56e670b6ab76 100644 (file)
@@ -2877,12 +2877,12 @@ int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
 connect_again:
   ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
 
-  if (ret < 0 && errno == EINPROGRESS && loops--) {
+  if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY) && loops--) {
     msleep(connect_loop);
     goto connect_again;
   }
 
-  if (ret < 0 && errno == EINPROGRESS) {
+  if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY)) {
       DEBUG(2,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
       close(res);
       return -1;
index b6c2313bf46b5415612d67a4871f9d46d20de6cf..6cf1b031e8337e1919325c250b5076762a27287c 100644 (file)
@@ -335,10 +335,8 @@ int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize)
     uint16 passlen1 = SVAL(inbuf,smb_vwv7);
     uint16 passlen2 = SVAL(inbuf,smb_vwv8);
     BOOL doencrypt = SMBENCRYPT();
-    char *p = smb_buf(inbuf);
-    if (passlen1 > 256) passlen1 = 0;
-    if (passlen2 > 256) passlen2 = 0; /* I don't know why NT gives weird 
-                                       lengths sometimes */
+    char *p = smb_buf(inbuf);    
+
     if(doencrypt) {
       /* Save the lanman2 password and the NT md4 password. */
       smb_apasslen = passlen1;
@@ -346,26 +344,33 @@ int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize)
       smb_ntpasslen = passlen2;
       memcpy(smb_ntpasswd,p+passlen1,smb_ntpasslen);
     } else {
-      /* for Win95 */
-      if (passlen1 > passlen2) {
-       smb_apasslen = passlen1;
-       StrnCpy(smb_apasswd,p,smb_apasslen);
-      } else {
-       smb_apasslen = passlen2;
-       StrnCpy(smb_apasswd,p + passlen1,smb_apasslen);
+      /* both Win95 and WinNT stuff up the password lengths for
+        non-encrypting systems. Uggh. 
+      
+        if passlen1==24 its a win95 system, and its setting the
+        password length incorrectly. Luckily it still works with the
+        default code because Win95 will null terminate the password
+        anyway 
+
+        if passlen1>0 and passlen2>0 then its a NT box and its
+        setting passlen2 to some random value which really stuffs
+        things up. we need to fix that one.  */
+      if (passlen1 > 0 && passlen2 > 0) {
+       passlen2 = 0;
       }
+      /* we use the first password that they gave */
+      smb_apasslen = passlen1;
+      StrnCpy(smb_apasswd,p,smb_apasslen);
     }
-#if NT_WORKAROUND
-    if (passlen2 == 1) {
-      /* apparently NT sometimes sets passlen2 to 1 when it means 0. This
-        tries to work around that problem */
-      passlen2 = 0;
-    }
-#endif
+    
     p += passlen1 + passlen2;
     strcpy(user,p); p = skip_string(p,1);
     DEBUG(3,("Domain=[%s]  NativeOS=[%s] NativeLanMan=[%s]\n",
             p,skip_string(p,1),skip_string(p,2)));
+
+    /* now work around the Win95 bug */
+    if(!doencrypt && smb_apasslen==24)
+      smb_apasslen = strlen(smb_apasswd);
   }