Re: getpeername broken? ( was Re: probably problem with "lo" interface (Re: Strange problem with 2.3.42) )

From: David S. Miller (davem@redhat.com)
Date: Fri Feb 04 2000 - 20:43:54 EST


   Date: Fri, 4 Feb 2000 17:11:00 +0200
   From: Craig Schlenter <craig@qualica.com>

   Me again ...

   The socket seems to have been in TCP_CLOSE. The following patch works for
   me with no immediately obvious bad side effects:

Ok, can you try this patch instead? It's the fix we'd like to
use and what I intend to send off to Linus.

--- vanilla/linux/net/socket.c Wed Jan 26 09:40:08 2000
+++ linux/net/socket.c Fri Feb 4 17:14:15 2000
@@ -929,7 +929,7 @@
                 goto out_release;
 
         if (upeer_sockaddr) {
- if(newsock->ops->getname(newsock, (struct sockaddr *)address, &len, 1)<0) {
+ if(newsock->ops->getname(newsock, (struct sockaddr *)address, &len, 2)<0) {
                         err = -ECONNABORTED;
                         goto out_release;
                 }
--- vanilla/linux/net/ipv4/af_inet.c Sat Jan 22 11:54:57 2000
+++ linux/net/ipv4/af_inet.c Fri Feb 4 13:04:06 2000
@@ -5,7 +5,7 @@
  *
  * PF_INET protocol family socket handler.
  *
- * Version: $Id: af_inet.c,v 1.104 2000/01/18 08:24:14 davem Exp $
+ * Version: $Id: af_inet.c,v 1.106 2000/02/04 21:04:06 davem Exp $
  *
  * Authors: Ross Biro, <bir7@leland.Stanford.Edu>
  * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -675,7 +675,9 @@
   
         sin->sin_family = AF_INET;
         if (peer) {
- if (!sk->dport)
+ if (!sk->dport)
+ return -ENOTCONN;
+ if (((1<<sk->state)&(TCPF_CLOSE|TCPF_SYN_SENT)) && peer == 1)
                         return -ENOTCONN;
                 sin->sin_port = sk->dport;
                 sin->sin_addr.s_addr = sk->daddr;
--- vanilla/linux/net/ipv6/af_inet6.c Sat Jan 22 11:54:58 2000
+++ linux/net/ipv6/af_inet6.c Fri Feb 4 13:04:08 2000
@@ -7,7 +7,7 @@
  *
  * Adapted from linux/net/ipv4/af_inet.c
  *
- * $Id: af_inet6.c,v 1.52 2000/01/18 08:24:21 davem Exp $
+ * $Id: af_inet6.c,v 1.53 2000/02/04 21:04:08 davem Exp $
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -340,6 +340,8 @@
         sin->sin6_flowinfo = 0;
         if (peer) {
                 if (!sk->dport)
+ return -ENOTCONN;
+ if (((1<<sk->state)&(TCPF_CLOSE|TCPF_SYN_SENT)) && peer == 1)
                         return -ENOTCONN;
                 sin->sin6_port = sk->dport;
                 memcpy(&sin->sin6_addr, &sk->net_pinfo.af_inet6.daddr,

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Feb 07 2000 - 21:00:12 EST