"Fixing my FORTRAN". Ensure we always have some valid char converter for the
[tprouty/samba.git] / source / lib / util_sock.c
index 328ca92727731f34f8deb5749d13c04940cc6f0e..845aaa4b13acc506aea57fb58d82da3ee48f7bdd 100644 (file)
@@ -29,6 +29,29 @@ int lastport=0;
 
 int smb_read_error = 0;
 
+static char *get_socket_addr(int fd)
+{
+       struct sockaddr sa;
+       struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
+       int     length = sizeof(sa);
+       static fstring addr_buf;
+
+       fstrcpy(addr_buf,"0.0.0.0");
+
+       if (fd == -1) {
+               return addr_buf;
+       }
+       
+       if (getsockname(fd, &sa, &length) < 0) {
+               DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
+               return addr_buf;
+       }
+       
+       fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
+       
+       return addr_buf;
+}
+
 /****************************************************************************
  Determine if a file descriptor is in fact a socket.
 ****************************************************************************/
@@ -552,6 +575,10 @@ BOOL receive_smb_raw(int fd,char *buffer, unsigned int timeout)
                                smb_read_error = READ_ERROR;
                        return False;
                }
+               
+               /* not all of samba3 properly checks for packet-termination of strings. This
+                  ensures that we don't run off into empty space. */
+               SSVAL(buffer+4,len, 0);
        }
 
        return True;
@@ -569,7 +596,7 @@ BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
        }
 
        /* Check the incoming SMB signature. */
-       if (!srv_check_sign_mac(buffer)) {
+       if (!srv_check_sign_mac(buffer, True)) {
                DEBUG(0, ("receive_smb: SMB Signature verification failed on incoming packet!\n"));
                if (smb_read_error == 0)
                        smb_read_error = READ_BAD_SIG;
@@ -687,7 +714,7 @@ int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
        /* create a socket to write to */
        res = socket(PF_INET, type, 0);
        if (res == -1) {
-               DEBUG(0,("socket error\n"));
+                DEBUG(0,("socket error (%s)\n", strerror(errno)));
                return -1;
        }
 
@@ -713,7 +740,7 @@ int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
        /* Some systems return EAGAIN when they mean EINPROGRESS */
        if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
                        errno == EAGAIN) && (connect_loop < timeout) ) {
-               msleep(connect_loop);
+               smb_msleep(connect_loop);
                connect_loop += increment;
                if (increment < 250) {
                        /* After 8 rounds we end up at a max of 255 msec */
@@ -954,29 +981,6 @@ char *get_peer_addr(int fd)
        return addr_buf;
 }
 
-char *get_socket_addr(int fd)
-{
-       struct sockaddr sa;
-       struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
-       int     length = sizeof(sa);
-       static fstring addr_buf;
-
-       fstrcpy(addr_buf,"0.0.0.0");
-
-       if (fd == -1) {
-               return addr_buf;
-       }
-       
-       if (getsockname(fd, &sa, &length) < 0) {
-               DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
-               return addr_buf;
-       }
-       
-       fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
-       
-       return addr_buf;
-}
-
 /*******************************************************************
  Create protected unix domain socket.