Imported Upstream version 1.8.7
[debian/sudo] / plugins / sudoers / group_plugin.c
index bd5203af98dfc9ea0574f9941aa77cbdbb5658bb..fcb1eecc21b13f9be6e9123bccf8c4be978e6d82 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2010-2013 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
 
 #include <config.h>
 
-#if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD)
-
 #include <sys/types.h>
-#include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <stdio.h>
 
 #include "sudoers.h"
 
-#ifndef RTLD_LOCAL
-# define RTLD_LOCAL    0
+#ifndef RTLD_GLOBAL
+# define RTLD_GLOBAL   0
 #endif
 
+#if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD)
+
 static void *group_handle;
 static struct sudoers_group_plugin *group_plugin;
 
@@ -73,11 +72,11 @@ group_plugin_load(char *plugin_info)
     char *args, path[PATH_MAX];
     char **argv = NULL;
     int len, rc = -1;
+    debug_decl(group_plugin_load, SUDO_DEBUG_UTIL)
 
     /*
      * Fill in .so path and split out args (if any).
      */
-    args = strpbrk(plugin_info, " \t");
     if ((args = strpbrk(plugin_info, " \t")) != NULL) {
        len = snprintf(path, sizeof(path), "%s%.*s",
            (*plugin_info != '/') ? _PATH_SUDO_PLUGIN_DIR : "",
@@ -88,9 +87,9 @@ group_plugin_load(char *plugin_info)
            (*plugin_info != '/') ? _PATH_SUDO_PLUGIN_DIR : "", plugin_info);
     }
     if (len <= 0 || len >= sizeof(path)) {
-       warningx("%s%s: %s",
-           (*plugin_info != '/') ? _PATH_SUDO_PLUGIN_DIR : "", plugin_info,
-           strerror(ENAMETOOLONG));
+       errno = ENAMETOOLONG;
+       warning("%s%s",
+           (*plugin_info != '/') ? _PATH_SUDO_PLUGIN_DIR : "", plugin_info);
        goto done;
     }
 
@@ -100,28 +99,28 @@ group_plugin_load(char *plugin_info)
        goto done;
     }
     if (sb.st_uid != ROOT_UID) {
-       warningx("%s must be owned by uid %d", path, ROOT_UID);
+       warningx(_("%s must be owned by uid %d"), path, ROOT_UID);
        goto done;
     }
     if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) {
-       warningx("%s must be only be writable by owner", path);
+       warningx(_("%s must only be writable by owner"), path);
        goto done;
     }
 
     /* Open plugin and map in symbol. */
-    group_handle = dlopen(path, RTLD_LAZY|RTLD_LOCAL);
+    group_handle = dlopen(path, RTLD_LAZY|RTLD_GLOBAL);
     if (!group_handle) {
-       warningx("unable to dlopen %s: %s", path, dlerror());
+       warningx(_("unable to dlopen %s: %s"), path, dlerror());
        goto done;
     }
     group_plugin = dlsym(group_handle, "group_plugin");
     if (group_plugin == NULL) {
-       warningx("unable to find symbol \"group_plugin\" in %s", path);
+       warningx(_("unable to find symbol \"group_plugin\" in %s"), path);
        goto done;
     }
 
     if (GROUP_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) {
-       warningx("%s: incompatible group plugin major version %d, expected %d",
+       warningx(_("%s: incompatible group plugin major version %d, expected %d"),
            path, GROUP_API_VERSION_GET_MAJOR(group_plugin->version),
            GROUP_API_VERSION_MAJOR);
        goto done;
@@ -131,14 +130,15 @@ group_plugin_load(char *plugin_info)
      * Split args into a vector if specified.
      */
     if (args != NULL) {
-       int ac = 0, wasblank = TRUE;
+       int ac = 0;
+       bool wasblank = true;
        char *cp;
 
         for (cp = args; *cp != '\0'; cp++) {
             if (isblank((unsigned char)*cp)) {
-                wasblank = TRUE;
+                wasblank = true;
             } else if (wasblank) {
-                wasblank = FALSE;
+                wasblank = false;
                 ac++;
             }
         }
@@ -155,7 +155,7 @@ group_plugin_load(char *plugin_info)
 done:
     efree(argv);
 
-    if (rc != TRUE) {
+    if (rc != true) {
        if (group_handle != NULL) {
            dlclose(group_handle);
            group_handle = NULL;
@@ -163,12 +163,14 @@ done:
        }
     }
 
-    return rc;
+    debug_return_bool(rc);
 }
 
 void
 group_plugin_unload(void)
 {
+    debug_decl(group_plugin_unload, SUDO_DEBUG_UTIL)
+
     if (group_plugin != NULL) {
        (group_plugin->cleanup)();
        group_plugin = NULL;
@@ -177,15 +179,18 @@ group_plugin_unload(void)
        dlclose(group_handle);
        group_handle = NULL;
     }
+    debug_return;
 }
 
 int
 group_plugin_query(const char *user, const char *group,
     const struct passwd *pwd)
 {
+    debug_decl(group_plugin_query, SUDO_DEBUG_UTIL)
+
     if (group_plugin == NULL)
-       return FALSE;
-    return (group_plugin->query)(user, group, pwd);
+       debug_return_bool(false);
+    debug_return_bool((group_plugin->query)(user, group, pwd));
 }
 
 #else /* !HAVE_DLOPEN && !HAVE_SHL_LOAD */
@@ -194,29 +199,26 @@ group_plugin_query(const char *user, const char *group,
  * No loadable shared object support.
  */
 
-#ifndef FALSE
-#define FALSE  0
-#endif
-
-struct passwd;
-
 int
 group_plugin_load(char *plugin_info)
 {
-    return FALSE;
+    debug_decl(group_plugin_load, SUDO_DEBUG_UTIL)
+    debug_return_bool(false);
 }
 
 void
 group_plugin_unload(void)
 {
-    return;
+    debug_decl(group_plugin_unload, SUDO_DEBUG_UTIL)
+    debug_return;
 }
 
 int
 group_plugin_query(const char *user, const char *group,
     const struct passwd *pwd)
 {
-    return FALSE;
+    debug_decl(group_plugin_query, SUDO_DEBUG_UTIL)
+    debug_return_bool(false);
 }
 
 #endif /* HAVE_DLOPEN || HAVE_SHL_LOAD */