fix
[oweals/gnunet.git] / src / util / service.c
index 99a364f15cb3e52881546a131c03a7292f91c3cc..48fb59e28e4647119e2f73459ef287b7650b3fe4 100644 (file)
@@ -917,6 +917,7 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName,
       saddrlens = GNUNET_malloc (2 * sizeof (socklen_t));
       add_unixpath (saddrs, saddrlens, unixpath);
       GNUNET_free_non_null (unixpath);
+      GNUNET_free_non_null(hostname);
       *addrs = saddrs;
       *addr_lens = saddrlens;
       return 1;
@@ -1143,7 +1144,9 @@ setup_service (struct GNUNET_SERVICE_Context *sctx)
        (getpid () == (pid_t) pid) &&
        (NULL != (nfds = getenv ("LISTEN_FDS"))) &&
        (1 == sscanf (nfds, "%u", &cnt)) &&
-       (cnt > 0) )
+       (cnt > 0) &&
+       (cnt < FD_SETSIZE) &&
+       (cnt + 4 < FD_SETSIZE) )
     {
       sctx->lsocks = GNUNET_malloc (sizeof(struct GNUNET_NETWORK_Handle*) * (cnt+1));
       while (0 < cnt--)
@@ -1413,10 +1416,12 @@ detach_terminal (struct GNUNET_SERVICE_Context *sctx)
     return GNUNET_SYSERR;
   /* set stdin/stdout to /dev/null */
   if ((dup2 (nullfd, 0) < 0) || (dup2 (nullfd, 1) < 0))
-    {
+    {      
       GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "dup2");
+      (void) CLOSE (nullfd);
       return GNUNET_SYSERR;
     }
+  (void) CLOSE (nullfd);
   /* Detach from controlling terminal */
   pid = setsid ();
   if (pid == -1)
@@ -1543,6 +1548,7 @@ GNUNET_SERVICE_run (int argc,
   sctx.ret = GNUNET_OK;
   sctx.timeout = GNUNET_TIME_UNIT_FOREVER_REL;
   sctx.task = task;
+  sctx.task_cls = task_cls;
   sctx.serviceName = serviceName;
   sctx.cfg = cfg = GNUNET_CONFIGURATION_create ();
   /* setup subsystems */