-dce
[oweals/gnunet.git] / src / util / os_installation.c
index c0b7c8583638c5b13692c66ea098f327965e4cd4..b82813d74dccc1efc70bf21551d0e95122fd07c9 100644 (file)
@@ -471,7 +471,7 @@ GNUNET_OS_check_helper_binary (const char *binary)
     GNUNET_free (p);
     p = pf;
   }
-  free (binaryexe);
+  GNUNET_free (binaryexe);
 #else
   p = get_path_from_PATH (binary);
   if (p != NULL)
@@ -487,6 +487,21 @@ GNUNET_OS_check_helper_binary (const char *binary)
          binary);
     return GNUNET_SYSERR;
   }
+  if (0 != ACCESS (p, X_OK))
+  {
+    LOG (GNUNET_ERROR_TYPE_WARNING, _("access (%s, X_OK) failed: %s\n"), p,
+         STRERROR (errno));
+    GNUNET_free (p);
+    return GNUNET_SYSERR;
+  }
+#ifndef MINGW
+  if (0 == getuid ())
+  {
+    /* as we run as root, we don't insist on SUID */
+    GNUNET_free (p);
+    return GNUNET_OK;
+  }
+#endif
   if (0 != STAT (p, &statbuf))
   {
     LOG (GNUNET_ERROR_TYPE_WARNING, _("stat (%s) failed: %s\n"), p,
@@ -500,13 +515,9 @@ GNUNET_OS_check_helper_binary (const char *binary)
     GNUNET_free (p);
     return GNUNET_YES;
   }
-  if (0 == ACCESS (p, X_OK))
-  {
-    GNUNET_free (p);
-    return GNUNET_NO;
-  }
+  /* binary exists, but not SUID */
   GNUNET_free (p);
-  return GNUNET_SYSERR;
+  return GNUNET_NO;
 #else
   GNUNET_free (p);
   rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);