Browse Source

getsockname() fix

Joseph Henry 9 years ago
parent
commit
9063209124
1 changed files with 5 additions and 21 deletions
  1. 5 21
      netcon/Intercept.c

+ 5 - 21
netcon/Intercept.c

@@ -953,7 +953,6 @@ int getsockname(GETSOCKNAME_SIG)
   if(!is_mapped_to_service(sockfd))
     return realgetsockname(sockfd, addr, addrlen); 
 
-  dwr(MSG_DEBUG, "getsockname(): sockfd = %d is mapped\n", sockfd);
   /* This is kind of a hack as it stands -- assumes sockaddr is sockaddr_in
    * and is an IPv4 address. */
 
@@ -967,30 +966,15 @@ int getsockname(GETSOCKNAME_SIG)
   memcpy(&cmd[1], &rpc_st, sizeof(struct getsockname_st));
   send_cmd(fdret_sock, cmd);
 
-  //pthread_mutex_lock(&lock);
   /* read address info from service */
   char addrbuf[sizeof(struct sockaddr_storage)];
-  memset(&addrbuf, '\0', sizeof(struct sockaddr_storage));
-  int n = read(fdret_sock, &addrbuf, sizeof(struct sockaddr_storage));
-  dwr(MSG_DEBUG, "getsockname(): read %d bytes\n", n);
+  memset(&addrbuf, 0, sizeof(struct sockaddr_storage));
+  read(fdret_sock, &addrbuf, sizeof(struct sockaddr_storage));
   struct sockaddr_storage sock_storage;
-  memcpy(&sock_storage, &addrbuf, sizeof(struct sockaddr_storage));
-
-  struct sockaddr_in *connaddr = (struct sockaddr_in *)&sock_storage;
-  //addr = (struct sockaddr *)&sock_storage;
-
-  unsigned int ip = connaddr->sin_addr.s_addr;
-  unsigned char d[4];
-  d[0] = ip & 0xFF;
-  d[1] = (ip >>  8) & 0xFF;
-  d[2] = (ip >> 16) & 0xFF;
-  d[3] = (ip >> 24) & 0xFF;
-  int port = connaddr->sin_port;
-  dwr(MSG_ERROR, "getsockname(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], ntohs(port));
-
-  //pthread_mutex_unlock(&lock);
-  addr->sa_family = AF_INET;
+  memcpy(&sock_storage, addrbuf, sizeof(struct sockaddr_storage));
   *addrlen = sizeof(struct sockaddr_in);
+  memcpy(addr, &sock_storage, (*addrlen > sizeof(sock_storage)) ? sizeof(sock_storage) : *addrlen);
+  addr->sa_family = AF_INET;
   return 0;
 }