gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r18417 - in libmwmodem: . src/main


From: gnunet
Subject: [GNUnet-SVN] r18417 - in libmwmodem: . src/main
Date: Thu, 1 Dec 2011 13:02:04 +0100

Author: grothoff
Date: 2011-12-01 13:02:04 +0100 (Thu, 01 Dec 2011)
New Revision: 18417

Modified:
   libmwmodem/configure.ac
   libmwmodem/src/main/libmwmodem.c
Log:
comments

Modified: libmwmodem/configure.ac
===================================================================
--- libmwmodem/configure.ac     2011-12-01 11:33:37 UTC (rev 18416)
+++ libmwmodem/configure.ac     2011-12-01 12:02:04 UTC (rev 18417)
@@ -21,6 +21,17 @@
 AC_TYPE_UINT8_T 
 AC_PROG_LIBTOOL
 
+AC_CHECK_MEMBER([struct sockaddr_in.sin_len],
+   [ AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1, [Do we have sockaddr_in.sin_len?])
+   ],
+   [],
+   [
+      #include <sys/types.h>
+      #include <sys/socket.h>
+      #include <netinet/in.h>
+   ])
+
+
 AC_LIBTOOL_WIN32_DLL
 
 AC_CONFIG_FILES([

Modified: libmwmodem/src/main/libmwmodem.c
===================================================================
--- libmwmodem/src/main/libmwmodem.c    2011-12-01 11:33:37 UTC (rev 18416)
+++ libmwmodem/src/main/libmwmodem.c    2011-12-01 12:02:04 UTC (rev 18417)
@@ -25,19 +25,23 @@
 #include <netinet/in.h>
 #include <string.h>
 #include <sys/ioctl.h>
+#include <errno.h>
 
+// TESTCASE!???
+
 struct MWMODEM_Context * MWMODEM_init (uint16_t port, int af_int, 
MWMODEM_InformationCallback *cb, void *cb_cls)
 {
     struct MWMODEM_Context *context;
     const struct sockaddr *address;
     struct sockaddr_in address4;
     struct sockaddr_in6 address6;
+    socklen_t alen;
 
        if ( (af_int!=AF_INET) && (af_int!=AF_INET6) )
        {
                fprintf(stderr,
-                       "Error no correct AF_INET or AF_INET6 value!"); 
-               return;
+                       "Error, expected af_int to be AF_INET or AF_INET6!"); 
+               return NULL;
        }
 
        context = malloc(sizeof(struct MWMODEM_Context)); // CHECK RETURN VALUE!
@@ -47,9 +51,9 @@
 
        if (-1 == context->socket)
        {
-               fprintf(stderr, "Error no socket created: %s", strerror(0));
+               fprintf(stderr, "Error: failed to create socket: %s", 
strerror(errno));
                free (context);
-               return;
+               return NULL;
        }       
        
        if (af_int==AF_INET)
@@ -57,7 +61,10 @@
 
                memset (&address4, 0, sizeof(address4));
                address4.sin_family = af_int;
-               if (port == 0)
+#if HAVE_SOCKADDR_IN_SIN_LEN
+               address4.sin_len = (u_char) sizeof (struct sockaddr_in);
+#endif
+       if (port == 0)
                        {
                                address4.sin_port = htons(MWMODEM_PORT);
                        }
@@ -66,12 +73,16 @@
                                address4.sin_port = htons(port);
                        }
                address =(const struct sockaddr *) &address4;
+               alen = sizeof (address4);
        }
        else
        {
 
                memset( &address6, 0, sizeof (address6));
                address6.sin6_family = af_int;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+               address6.sin_len = (u_char) sizeof (struct sockaddr_in6);
+#endif
                if (port == 0)
                        {
                                address6.sin6_port = htons(MWMODEM_PORT);
@@ -81,13 +92,16 @@
                                address6.sin6_port = htons(port);
                        }
                address =(const struct sockaddr *) &address6;
+               alen = sizeof (address6);
        }
 
-       if (-1==bind(context->socket, address, sizeof(address4)))// check 
return value!
+       if (-1==bind(context->socket, address, alen))
        {
-               fprintf(stderr, "The port bind have produced a 
failure!");//Failure messafe TODO
+                fprintf(stderr, "Error: failed to bind to port %u: %s\n",
+                        port,
+                        strerror (errno));
                free(context);
-               return;
+               return NULL;
        }
 
        return context;
@@ -141,17 +155,18 @@
        struct MWChannel *chl;
        int package_length;
 
-       octl(fc->socket, FIONREAD, &package_length);
+       ioctl(fc->socket, FIONREAD, &package_length); // CHECK RETURN VALUE!
 
        if (package_length==0)
        {
-               fprintf(stderr, "Error no message to receive!");
+         fprintf(stderr, "Error no message to receive!"); // READ UP on IOCTL 
FIONREAD SECURITY PROBLEMS! (Denial-of-Service)
                return;
        }
 
-       package = malloc(sizeof(struct MWMODEM_Package));
-       buffer = malloc(package_length);
+       package = malloc(sizeof(struct MWMODEM_Package)); // NO MALLOC! Stack 
allocate!
+       buffer = malloc(package_length); // NO MALLOC! Stack allocate!
        
+       // man recvfrom! from/fromlength NOT allocated by recvfrom!!!
        if (recvfrom(fc->socket, buffer, sizeof(buffer), 0, from, 
from_length)==-1)
        {
                fprintf(stderr, "Error no message received!");
@@ -159,17 +174,17 @@
                free (buffer);
                return;
        }
-       free(from);
-       free(from_length);
+       free(from); // free uninitialized variable!
+       free(from_length);  // free uninitialized variable!
 
        hdr = (struct MWHeader*) buffer;
 
        if (1!=1)//TODO deklination der Erkennungsmerkmale der Message
        {
-               printf("No MWModem compatible message received!");
-               free(hdr);
+         printf("No MWModem compatible message received!"); // fprintf 
(stderr!!!
+               free(hdr); 
                free(package);
-               free(buffer);
+               free(buffer); // double-free! (hdr == buffer)
                return;
        }
        else
@@ -184,7 +199,7 @@
                struct MWMODEM_Channel list2[package->num_channels];
                list = list2;
 
-               int i, currentBufferZelle;
+               int i, currentBufferZelle; // signed or unsigned int?
                currentBufferZelle = 13;
                for(i=0;i<=package->num_channels; i++)
                {
@@ -202,7 +217,7 @@
                                else
                                {
                                        fprintf(stderr, "Error no correct 
satellite modcode!");
-                                       free(list);
+                                       free(list); // quadruple-free 
uninitialized crash me now!
                                        free(buffer);
                                        free(hdr);
                                        free(chl);
@@ -224,11 +239,11 @@
        
        package->channel = list;
 
-       (*fc->cb)(fc->cls, package);
+       fc->cb(fc->cls, package);
 }
 
 void MWMODEM_free (struct MWMODEM_Context *fc)
 {
-       close(fc->socket);
+        (void) close(fc->socket);
        free(fc);
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]