]> andersk Git - moira.git/blobdiff - server/mr_glue.c
Fix another freeing-memory-we-didn't-malloc bug in AddMachine. This
[moira.git] / server / mr_glue.c
index 2ce97b99dd215260355b159cc805e74839b59d27..6643a24c84b390c25d4b2932124409bc8259c0a9 100644 (file)
@@ -16,12 +16,12 @@ static char *rcsid_mr_glue_c = "$Header$";
 #endif lint
 
 #include <mit-copyright.h>
-#include "mr_server.h"
 #include <sys/types.h>
 #include <sys/signal.h>
 #include <sys/wait.h>
 #include <krb_et.h>
 #include <pwd.h>
+#include "mr_server.h"
 #include "query.h"
 
 static int already_connected = 0;
@@ -30,7 +30,7 @@ static int already_connected = 0;
 
 static client pseudo_client;
 extern int errno;
-extern char *malloc(), *whoami;
+extern char *whoami;
 extern time_t now;
 void reapchild();
 
@@ -39,18 +39,26 @@ char *server;
 {
     register int status;
     extern int query_timeout;
+    struct sigaction action;
 
     if (already_connected) return MR_ALREADY_CONNECTED;
 
     initialize_sms_error_table();
     initialize_krb_error_table();
-    bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
+    memset((char *)&pseudo_client, 0, sizeof(pseudo_client)); /* XXX */
 
     query_timeout = 0;
     status =  mr_open_database();
     if (!status) already_connected = 1;
 
-    signal(SIGCHLD, reapchild);
+    action.sa_flags = 0;
+    sigemptyset(&action.sa_mask);
+    sigaddset(&action.sa_mask, SIGCHLD);
+    action.sa_handler = reapchild;
+    if (sigaction(SIGCHLD, &action, NULL) < 0) {
+      com_err(whoami, errno, "Unable to establish signal handlers.");
+      exit(1);
+    }
     return status;
 }
 
@@ -92,9 +100,9 @@ char *prog;
     strcat(buf, pseudo_client.kname.realm);
     strcpy(pseudo_client.clname, buf);
     pseudo_client.users_id = 0;
-    name_to_id(pseudo_client.kname.name, "USER", &pseudo_client.users_id);
+    name_to_id(pseudo_client.kname.name, USERS_TABLE, &pseudo_client.users_id);
     pseudo_client.client_id = pseudo_client.users_id;
-    strcpy(pseudo_client.entity, prog);
+    strncpy(pseudo_client.entity, prog, 8);
     pseudo_client.args = (mr_params *) malloc(sizeof(mr_params));
     pseudo_client.args->mr_version_no = MR_VERSION_2;
     return 0;
@@ -130,8 +138,9 @@ int mr_query(name, argc, argv, callproc, callarg)
     hints.proc = callproc;
     hints.hint = callarg;
     next_incremental();
-    return mr_process_query(&pseudo_client, name, argc, argv,
-                            callback, &hints);
+    return mr_process_query(&pseudo_client, name, argc,
+                           mr_copy_args(argv, argc), callback,
+                           (char *)&hints);
 
 }
 
@@ -141,7 +150,8 @@ int mr_access(name, argc, argv)
     char **argv;               /* Args */
 {
     time(&now);
-    return mr_check_access(&pseudo_client, name, argc, argv);
+    return mr_check_access(&pseudo_client, name, argc,
+                          mr_copy_args(argv, argc));
 }
 
 int mr_query_internal(argc, argv, callproc, callarg)
@@ -156,8 +166,9 @@ int mr_query_internal(argc, argv, callproc, callarg)
     hints.proc = callproc;
     hints.hint = callarg;
     next_incremental();
-    return mr_process_query(&pseudo_client, argv[0], argc-1, argv+1,
-                            callback, &hints);
+    return mr_process_query(&pseudo_client, argv[0], argc-1,
+                           mr_copy_args(argv+1, argc-1), callback,
+                           (char *)&hints);
 }
 
 int mr_access_internal(argc, argv)
@@ -165,7 +176,8 @@ int mr_access_internal(argc, argv)
     char **argv;
 {
     time(&now);
-    return mr_check_access(&pseudo_client, argv[0], argc-1, argv+1);
+    return mr_check_access(&pseudo_client, argv[0], argc-1,
+                          mr_copy_args(argv+1, argc-1));
 }
 
 mr_shutdown(why)
@@ -212,16 +224,15 @@ trigger_dcm(dummy0, dummy1, cl)
 
 void reapchild()
 {
-    union wait status;
-    int pid;
+    int status, pid;
 
-    while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
+    while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
        if (pid == inc_pid) {
            inc_running = 0;
            next_incremental();
        }
-       if  (status.w_termsig != 0 || status.w_retcode != 0)
+       if  (WTERMSIG(status) != 0 || WEXITSTATUS(status) != 0)
          com_err(whoami, 0, "%d: child exits with signal %d status %d",
-                 pid, status.w_termsig, status.w_retcode);
+                 pid, WTERMSIG(status), WEXITSTATUS(status));
     }
 }
This page took 0.035671 seconds and 4 git commands to generate.