diff --git a/src/signal_handler.c b/src/signal_handler.c
index d2509cac2341ced785691f4dae0288f648101ef9..4a93147a73de244875195ea4e1ef01b7b3aafd00 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -610,11 +610,13 @@ static HANDLE get_inheritable_handle(struct mapping *optional,
 struct passwd *getpwnam(char *name)
 {
   struct passwd *pw;
+  THREADS_ALLOW_UID();
   setpwent();
   while(pw=getpwent())
     if(strcmp(pw->pw_name,name))
       break;
   endpwent();
+  THREADS_DISALLOW_UID();
   return pw;
 }
 #define HAVE_GETPWNAM
@@ -624,11 +626,13 @@ struct passwd *getpwnam(char *name)
 struct passwd *getpwiod(int uid)
 {
   struct passwd *pw;
+  THREADS_ALLOW_UID();
   setpwent();
   while(pw=getpwent())
     if(pw->pw_uid == uid)
       break;
   endpwent();
+  THREADS_DISALLOW_UID();
   return 0;
 }
 #define HAVE_GETPWUID
@@ -640,11 +644,13 @@ struct passwd *getpwiod(int uid)
 struct group *getgrnam(char *name)
 {
   struct group *gr;
+  THREADS_ALLOW_UID();
   setgrent();
   while(pw=getgrent())
     if(strcmp(gr->gr_name,name))
       break;
   endgrent();
+  THREADS_DISALLOW_UID();
   return gr;
 }
 #define HAVE_GETGRNAM
@@ -785,7 +791,7 @@ void f_create_process(INT32 args)
       /* FIX: env, cleanup */
     }
 
-    THREADS_ALLOW();
+    THREADS_ALLOW_UID();
     ret=CreateProcess(filename,
 		      command_line,
 		      NULL,  /* process security attribute */
@@ -796,7 +802,7 @@ void f_create_process(INT32 args)
 		      dir,   /* current dir */
 		      &info,
 		      &proc);
-    THREADS_DISALLOW();
+    THREADS_DISALLOW_UID();
     
     if(dir) free((char *)dir);
     if(command_line) free((char *)command_line);
@@ -821,11 +827,13 @@ void f_create_process(INT32 args)
 #else /* __NT__ */
   {
     pid_t pid;
+    THREADS_ALLOW_UID();
 #if defined(HAVE_FORK1) && defined(_REENTRANT)
     pid=fork1();
 #else
     pid=fork();
 #endif
+    THREADS_DISALLOW_UID();
     if(pid==-1) error("Failed to start process.\n");
     if(pid)
     {
@@ -1160,11 +1168,15 @@ void f_fork(INT32 args)
   struct object *o;
   pid_t pid;
   pop_n_elems(args);
+
+  THREADS_ALLOW_UID();
 #if defined(HAVE_FORK1) && defined(_REENTRANT)
   pid=fork1();
 #else
   pid=fork();
 #endif
+  THREADS_DISALLOW_UID();
+
   if(pid==-1) error("Fork failed\n");
 
   if(pid)
@@ -1199,26 +1211,26 @@ void f_fork(INT32 args)
 #ifdef HAVE_KILL
 static void f_kill(INT32 args)
 {
+  int signum;
+  int pid;
+  int res;
+
   if(args < 2)
     error("Too few arguments to kill().\n");
 
   switch(sp[-args].type)
   {
   case T_INT:
+    pid = sp[-args].u.integer;
     break;
 
   case T_OBJECT:
   {
-    INT32 pid;
     struct pid_status *p;
     if((p=(struct pid_status *)get_storage(sp[-args].u.object,
 					  pid_status_program)))
     {
       pid=p->pid;
-      free_svalue(sp-args);
-      sp[-args].type=T_INT;
-      sp[-args].subtype=NUMBER_NUMBER;
-      sp[-args].u.integer=pid;
       break;
     }
   }
@@ -1229,10 +1241,15 @@ static void f_kill(INT32 args)
   if(sp[1-args].type != T_INT)
     error("Bad argument 1 to kill().\n");
 
-  sp[-args].u.integer=!kill(sp[-args].u.integer,
-			    sp[1-args].u.integer);
+  signum = sp[1-args].u.integer;
+
+  THREADS_ALLOW_UID();
+  res = !kill(pid, signum);
+  THREADS_DISALLOW_UID();
+
   check_signals(0,0,0);
-  pop_n_elems(args-1);
+  pop_n_elems(args);
+  push_int(res);
 }
 
 #else