[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    Re: Bug in KServerSocket
From:       Matthias Welwarsky <matze () stud ! fbi ! fh-darmstadt ! de>
Date:       2001-06-24 14:39:45
[Download RAW message or body]

On Saturday 23 June 2001 15:46, Dawit Alemayehu wrote:
> On Friday 22 June 2001 18:52, Matthias Welwarsky wrote:
> > This bug should be fixed by the patch I sent to the list about a week
> > ago. http://lists.kde.org/?l=kde-devel&m=99285500522803&w=2
> >
> > Can someony please review this patch and decide if it's worth to become
> > included?
>
> Looks good to me, but I forwarded this message to the maintainer just the
> same.  If he does not respond, I will commit it.

Just noticed that the patch introduces a bug (or at least changes the 
behaviour of KSocket/KServerSocket::ipv4_addr()). Revised patch attached.
However ipv4_addr() is marked deprecated, according to the documentation, 
still it used to return an ip address as long int in host byte order.

regards,
	Matze

["ksock.cpp.patch" (text/x-c++)]

Index: ksock.cpp
===================================================================
RCS file: /cvs/kdelibs/kdecore/ksock.cpp,v
retrieving revision 1.79
diff -u -r1.79 ksock.cpp
--- ksock.cpp	2001/06/11 00:32:41	1.79
+++ ksock.cpp	2001/06/24 14:38:04
@@ -214,22 +214,19 @@
 unsigned long KSocket::ipv4_addr()
 {
   unsigned long retval = 0;
-  KSocketAddress *sa = KExtendedSocket::peerAddress(sock);
-  if (sa == NULL)
+
+  // MW use KInetSocketAddress, no need to duplicate code
+  KInetSocketAddress *sa = dynamic_cast<KInetSocketAddress*>(KExtendedSocket::peerAddress(sock));
+  if (sa == NULL) // MW not a KInetSocketAddress or empty
     return 0;
 
-  if (sa->address() != NULL && (sa->address()->sa_family == PF_INET
-#ifdef PF_INET6
-				|| sa->address()->sa_family == PF_INET6
-#endif
-      ))
-    {
-      KInetSocketAddress *ksin = (KInetSocketAddress*)sa;
-      const sockaddr_in *sin = ksin->addressV4();
-      if (sin != NULL)
-	retval = *(unsigned long*)&sin->sin_addr; // I told you this was dumb
-    }
-  delete sa;
+  const sockaddr_in *sin = sa->addressV4();
+  if (sin != NULL) // MW V4 or convertible V6
+    retval = ntohl(sin->sin_addr.s_addr);
+
+  kdDebug() << "KSocket::ipv4_addr() = " << inet_ntoa(sin->sin_addr) << endl;
+
+  delete sa; // KExtendedSocket::peerAddress() allocates a new object, needs to be freed
   return retval;
 }
 
@@ -382,47 +379,33 @@
 {
   if (d == NULL || d->ks == NULL || sock == -1)
     return 0;
-  const KSocketAddress *sa = d->ks->localAddress();
-  if (sa == NULL)
+
+  // MW use KInetSocketAddress
+  // why would we want to duplicate code?
+  const KInetSocketAddress *sa = dynamic_cast<const KInetSocketAddress*>(d->ks->localAddress());
+  if (sa == NULL) // MW not a KInetSocketAddress or empty
     return 0;
 
-  // we can use sockaddr_in here even if it isn't IPv4
-  sockaddr_in *sin = (sockaddr_in*)sa->address();
+  return sa->port();
 
-  if (sin->sin_family == PF_INET)
-    // correct family
-    return sin->sin_port;
-#ifdef PF_INET6
-  else if (sin->sin_family == PF_INET6)
-    {
-      kde_sockaddr_in6 *sin6 = (kde_sockaddr_in6*)sin;
-      return sin6->sin6_port;
-    }
-#endif
-  return 0;			// not a port we know
 }
 
 unsigned long KServerSocket::ipv4_addr()
 {
   if (d == NULL || d->ks == NULL || sock == -1)
     return 0;
-  const KSocketAddress *sa = d->ks->localAddress();
-  
-  const sockaddr_in *sin = (sockaddr_in*)sa->address();
 
-  if (sin->sin_family == PF_INET)
-    // correct family
-    return ntohl(*(unsigned long*)&sin->sin_addr);
-#ifdef PF_INET6
-  else if (sin->sin_family == PF_INET6)
-    {
-      KInetSocketAddress *ksin = (KInetSocketAddress*)sa;
-      sin = ksin->addressV4();
-      if (sin != NULL)
-	return *(unsigned long*)&sin->sin_addr;
-    }
-#endif
-  return 0;			// this is dumb, isn't it?
+  const KInetSocketAddress *sa = dynamic_cast<const KInetSocketAddress*>(d->ks->localAddress());
+  if (sa == NULL) // MW not a KInetSocketAddress or empty
+    return 0;
+
+  const sockaddr_in *sin = sa->addressV4();
+  if (sin == NULL) // MW not convertible
+    return 0;
+
+  kdDebug() << "KServerSocket::ipv4_addr() = " << inet_ntoa(sin->sin_addr) << endl;
+
+  return ntohl(sin->sin_addr.s_addr);
 }
 
 void KServerSocket::slotAccept( int )
@@ -436,7 +419,7 @@
         kdWarning(170) << "Error accepting\n";
         return;
     }
-  
+
   int new_sock = s->fd();
   s->release();			// we're getting rid of the KExtendedSocket
   delete s;

>> Visit http://master.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic