Browse Source

Fix for getsockname() crash and other address size issues.

Adam Ierymenko 9 years ago
parent
commit
3137f43da9
3 changed files with 28 additions and 23 deletions
  1. 19 12
      netcon/Intercept.c
  2. 4 4
      netcon/Intercept.h
  3. 5 7
      netcon/NetconEthernetTap.cpp

+ 19 - 12
netcon/Intercept.c

@@ -590,7 +590,7 @@ int connect(CONNECT_SIG)
   struct connect_st rpc_st;
   struct connect_st rpc_st;
   rpc_st.__tid = syscall(SYS_gettid);
   rpc_st.__tid = syscall(SYS_gettid);
   rpc_st.__fd = __fd;
   rpc_st.__fd = __fd;
-  memcpy(&rpc_st.__addr, __addr, sizeof(struct sockaddr));
+  memcpy(&rpc_st.__addr, __addr, sizeof(struct sockaddr_storage));
   memcpy(&rpc_st.__len, &__len, sizeof(socklen_t));
   memcpy(&rpc_st.__len, &__len, sizeof(socklen_t));
   cmd[0] = RPC_CONNECT;
   cmd[0] = RPC_CONNECT;
   memcpy(&cmd[1], &rpc_st, sizeof(struct connect_st));
   memcpy(&cmd[1], &rpc_st, sizeof(struct connect_st));
@@ -648,7 +648,7 @@ int bind(BIND_SIG)
   struct bind_st rpc_st;
   struct bind_st rpc_st;
   rpc_st.sockfd = sockfd;
   rpc_st.sockfd = sockfd;
   rpc_st.__tid = syscall(SYS_gettid);
   rpc_st.__tid = syscall(SYS_gettid);
-  memcpy(&rpc_st.addr, addr, sizeof(struct sockaddr));
+  memcpy(&rpc_st.addr, addr, sizeof(struct sockaddr_storage));
   memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
   memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
   cmd[0]=RPC_BIND;
   cmd[0]=RPC_BIND;
   memcpy(&cmd[1], &rpc_st, sizeof(struct bind_st));
   memcpy(&cmd[1], &rpc_st, sizeof(struct bind_st));
@@ -924,7 +924,7 @@ int dup3(DUP3_SIG)
                    and preventing us from debugging */
                    and preventing us from debugging */
   else
   else
 #endif
 #endif
-    return realdup3(oldfd, newfd, flags);
+  return realdup3(oldfd, newfd, flags);
 }
 }
 
 
 /*------------------------------------------------------------------------------
 /*------------------------------------------------------------------------------
@@ -938,36 +938,43 @@ int getsockname(GETSOCKNAME_SIG)
     dwr(MSG_ERROR, "getsockname(): SYMBOL NOT FOUND. \n");
     dwr(MSG_ERROR, "getsockname(): SYMBOL NOT FOUND. \n");
     return -1;
     return -1;
   }
   }
+
   /* return realgetsockname(sockfd, addr, addrlen); */
   /* return realgetsockname(sockfd, addr, addrlen); */
+
+  /* This is kind of a hack as it stands -- assumes sockaddr is sockaddr_in
+   * and is an IPv4 address. */
+
   /* assemble command */
   /* assemble command */
   char cmd[BUF_SZ];
   char cmd[BUF_SZ];
   struct getsockname_st rpc_st;
   struct getsockname_st rpc_st;
   rpc_st.sockfd = sockfd;
   rpc_st.sockfd = sockfd;
-  memcpy(&rpc_st.addr, addr, sizeof(struct sockaddr));
+  memcpy(&rpc_st.addr, addr, *addrlen);
   memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
   memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
   cmd[0] = RPC_GETSOCKNAME;
   cmd[0] = RPC_GETSOCKNAME;
   memcpy(&cmd[1], &rpc_st, sizeof(struct getsockname_st));
   memcpy(&cmd[1], &rpc_st, sizeof(struct getsockname_st));
 
 
   send_cmd(fdret_sock, cmd);
   send_cmd(fdret_sock, cmd);
 
 
-  char addrbuf[sizeof(struct sockaddr)];
-  memset(addrbuf, '\0', sizeof(struct sockaddr));
-  read(fdret_sock, &addrbuf, sizeof(struct sockaddr)); /* read address from service */
-  memcpy(addr, addrbuf, sizeof(struct sockaddr));
-  *addrlen = sizeof(struct sockaddr);
+  char addrbuf[sizeof(struct sockaddr_storage)];
+  memset(addrbuf, 0, sizeof(struct sockaddr_storage));
+  read(fdret_sock, &addrbuf, sizeof(struct sockaddr_storage)); /* read address from service */
+
+  memcpy(addr, addrbuf, sizeof(struct sockaddr_in));
+  addr->sa_family = AF_INET;
+  *addrlen = sizeof(struct sockaddr_in);
 
 
   struct sockaddr_in *connaddr;
   struct sockaddr_in *connaddr;
-  connaddr = (struct sockaddr_in *) &addr;
+  connaddr = (struct sockaddr_in *)&addr;
 
 
-  int ip = connaddr->sin_addr.s_addr;
+  unsigned int ip = connaddr->sin_addr.s_addr;
   unsigned char d[4];
   unsigned char d[4];
   d[0] = ip & 0xFF;
   d[0] = ip & 0xFF;
   d[1] = (ip >>  8) & 0xFF;
   d[1] = (ip >>  8) & 0xFF;
   d[2] = (ip >> 16) & 0xFF;
   d[2] = (ip >> 16) & 0xFF;
   d[3] = (ip >> 24) & 0xFF;
   d[3] = (ip >> 24) & 0xFF;
-
   int port = connaddr->sin_port;
   int port = connaddr->sin_port;
   dwr(MSG_ERROR, " handle_getsockname(): returning address: %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], port);
   dwr(MSG_ERROR, " handle_getsockname(): returning address: %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], port);
+
   return 0;
   return 0;
 }
 }
 
 

+ 4 - 4
netcon/Intercept.h

@@ -96,7 +96,7 @@
 struct bind_st
 struct bind_st
 {
 {
 	int sockfd;
 	int sockfd;
-	struct sockaddr addr;
+	struct sockaddr_storage addr;
 	socklen_t addrlen;
 	socklen_t addrlen;
 	int __tid;
 	int __tid;
 };
 };
@@ -106,7 +106,7 @@ struct bind_st
 struct connect_st
 struct connect_st
 {
 {
 	int __fd;
 	int __fd;
-	struct sockaddr __addr;
+	struct sockaddr_storage __addr;
 	socklen_t __len;
 	socklen_t __len;
 	int __tid;
 	int __tid;
 };
 };
@@ -162,7 +162,7 @@ struct socket_st
 struct accept_st
 struct accept_st
 {
 {
 	int sockfd;
 	int sockfd;
-	struct sockaddr addr;
+	struct sockaddr_storage addr;
 	socklen_t addrlen;
 	socklen_t addrlen;
 	int __tid;
 	int __tid;
 };
 };
@@ -177,7 +177,7 @@ struct shutdown_st
 struct getsockname_st
 struct getsockname_st
 {
 {
 	int sockfd;
 	int sockfd;
-	struct sockaddr addr;
+	struct sockaddr_storage addr;
 	socklen_t addrlen;
 	socklen_t addrlen;
 };
 };
 
 

+ 5 - 7
netcon/NetconEthernetTap.cpp

@@ -1159,14 +1159,12 @@ void NetconEthernetTap::handle_getsockname(PhySocket *sock, void **uptr, struct
 */
 */
 
 
 	// Assemble address "command" to send to intercept
 	// Assemble address "command" to send to intercept
-	char retmsg[sizeof(struct sockaddr)];
-	memset(&retmsg, '\0', sizeof(retmsg));
+	char retmsg[sizeof(struct sockaddr_storage)];
+	memset(&retmsg, 0, sizeof(retmsg));
 	dwr(MSG_ERROR, " handle_getsockname(): %d\n", sizeof(retmsg));
 	dwr(MSG_ERROR, " handle_getsockname(): %d\n", sizeof(retmsg));
-	if(conn == NULL) return;
-	memcpy(&retmsg, conn->addr, 1);
-	// Get connection's RPC fd and send structure containing bound address
-	int fd = _phy.getDescriptor(conn->rpcSock);
-	write(fd, &retmsg, sizeof(struct sockaddr));
+	if ((conn)&&(conn->addr))
+    memcpy(&retmsg, conn->addr, sizeof(struct sockaddr_in));
+	write(_phy.getDescriptor(conn->rpcSock), &retmsg, sizeof(struct sockaddr_storage));
 }
 }
 
 
 /*
 /*