gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r18651 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r18651 - gnunet/src/transport
Date: Fri, 16 Dec 2011 23:18:10 +0100

Author: grothoff
Date: 2011-12-16 23:18:10 +0100 (Fri, 16 Dec 2011)
New Revision: 18651

Modified:
   gnunet/src/transport/gnunet-helper-transport-wlan.c
Log:
-also minimizing SUID code here

Modified: gnunet/src/transport/gnunet-helper-transport-wlan.c
===================================================================
--- gnunet/src/transport/gnunet-helper-transport-wlan.c 2011-12-16 22:13:31 UTC 
(rev 18650)
+++ gnunet/src/transport/gnunet-helper-transport-wlan.c 2011-12-16 22:18:10 UTC 
(rev 18651)
@@ -1412,12 +1412,6 @@
   struct stat sbuf;
   int ret;
 
-  dev->fd_raw = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL));
-  if (0 > dev->fd_raw)
-  {
-    fprintf (stderr, "Failed to create raw socket: %s\n", strerror (errno));
-    return 1;
-  }
   if (dev->fd_raw >= FD_SETSIZE)
   {
     fprintf (stderr, "File descriptor too large for select (%d > %d)\n",
@@ -1559,22 +1553,46 @@
   int retval;
   int stdin_open;
   struct MessageStreamTokenizer *stdin_mst;
+  int raw_eno;
 
+  dev.fd_raw = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL));
+  raw_eno = errno; /* remember for later */
+  uid = getuid ();
+#ifdef HAVE_SETRESUID
+  if (0 != setresuid (uid, uid, uid))
+  {
+    fprintf (stderr, "Failed to setresuid: %s\n", strerror (errno));
+    if (-1 != dev.fd_raw)
+      (void) close (dev.fd_raw);
+    return 1;
+  }
+#else
+  if (0 != (setuid (uid) | seteuid (uid)))
+  {
+    fprintf (stderr, "Failed to setuid: %s\n", strerror (errno));
+    if (-1 != dev.fd_raw)
+      (void) close (dev.fd_raw);
+    return 1;
+  }
+#endif
+
+  /* now that we've dropped root rights, we can do error checking */
   if (2 != argc)
   {
     fprintf (stderr,
              "You must specify the name of the interface as the first and only 
argument to this program.\n");
+    if (-1 != dev.fd_raw)
+      (void) close (dev.fd_raw);
     return 1;
   }
+
+  if (-1 == dev.fd_raw)
+  {
+    fprintf (stderr, "Failed to create raw socket: %s\n", strerror (raw_eno));
+    return 1;
+  }
   if (0 != wlan_initialize (&dev, argv[1]))
     return 1;
-  uid = getuid ();
-  if (0 != setresuid (uid, uid, uid))
-  {
-    fprintf (stderr, "Failed to setresuid: %s\n", strerror (errno));
-    /* not critical, continue anyway */
-  }
-
   dev.write_pout.size = 0;
   dev.write_pout.pos = 0;
   stdin_mst = mst_create (&stdin_send_hw, &dev);  
@@ -1705,7 +1723,7 @@
   }
   /* Error handling, try to clean up a bit at least */
   mst_destroy (stdin_mst);
-  close (dev.fd_raw);
+  (void) close (dev.fd_raw);
   return 1;                     /* we never exit 'normally' */
 }
 




reply via email to

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