]> granicus.if.org Git - sudo/commitdiff
Add SUDO_DEBUG_INSTANCE_ERROR return value for sudo_debug_register()
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 21 Nov 2016 16:37:23 +0000 (06:37 -1000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 21 Nov 2016 16:37:23 +0000 (06:37 -1000)
and check for it in places where we check the return value of
sudo_debug_register().

include/sudo_debug.h
lib/util/sudo_debug.c
plugins/sudoers/iolog.c
plugins/sudoers/policy.c
plugins/sudoers/sudoers.h
plugins/sudoers/sudoers_debug.c
plugins/sudoers/visudo.c
src/sudo.c

index 353a8257b60b0a2781abfb50886c0e49340fe564..658e48d05d51c8bf5be261220dbc92ab7ef554db 100644 (file)
@@ -84,6 +84,9 @@ struct sudo_conf_debug_file_list;
 #define SUDO_DEBUG_UTMP                (14<<6)    /* utmp file ops */
 #define SUDO_DEBUG_ALL         0xffff0000 /* all subsystems */
 
+/* Error return for sudo_debug_register().  */
+#define SUDO_DEBUG_INSTANCE_ERROR      -2
+
 /* Initializer for instance index to indicate that debugging is not setup. */
 #define SUDO_DEBUG_INSTANCE_INITIALIZER        -1
 
index 967a762c9a5061460cfed11fbbb04899cfcca251..a65b7ddcf81fd973ae1e21e66db286a56b40c898 100644 (file)
@@ -243,8 +243,9 @@ bad:
  * If subsystem names are specified they override the default values.
  * NOTE: subsystems must not be freed by caller unless deregistered.
  * Sets the active instance to the newly registered instance.
- * Returns instance index on success or SUDO_DEBUG_INSTANCE_INITIALIZER
- * on failure.
+ * Returns instance index on success, SUDO_DEBUG_INSTANCE_INITIALIZER
+ * if no debug files are specified and SUDO_DEBUG_INSTANCE_ERROR
+ * on error.
  */
 int
 sudo_debug_register_v1(const char *program, const char *const subsystems[],
@@ -264,7 +265,7 @@ sudo_debug_register_v1(const char *program, const char *const subsystems[],
        subsystems = sudo_debug_default_subsystems;
     } else if (ids == NULL) {
        /* If subsystems are specified we must have ids[] too. */
-       return SUDO_DEBUG_INSTANCE_INITIALIZER;
+       return SUDO_DEBUG_INSTANCE_ERROR;
     }
 
     /* Search for existing instance. */
@@ -302,17 +303,17 @@ sudo_debug_register_v1(const char *program, const char *const subsystems[],
        if (idx == SUDO_DEBUG_INSTANCE_MAX) {
            /* XXX - realloc? */
            sudo_warnx_nodebug("too many debug instances (max %d)", SUDO_DEBUG_INSTANCE_MAX);
-           return SUDO_DEBUG_INSTANCE_INITIALIZER;
+           return SUDO_DEBUG_INSTANCE_ERROR;
        }
        if (idx != sudo_debug_last_instance + 1 && idx != free_idx) {
            sudo_warnx_nodebug("%s: instance number mismatch: expected %d or %d, got %d", __func__, sudo_debug_last_instance + 1, free_idx, idx);
-           return SUDO_DEBUG_INSTANCE_INITIALIZER;
+           return SUDO_DEBUG_INSTANCE_ERROR;
        }
        if ((instance = malloc(sizeof(*instance))) == NULL)
-           return SUDO_DEBUG_INSTANCE_INITIALIZER;
+           return SUDO_DEBUG_INSTANCE_ERROR;
        if ((instance->program = strdup(program)) == NULL) {
            free(instance);
-           return SUDO_DEBUG_INSTANCE_INITIALIZER;
+           return SUDO_DEBUG_INSTANCE_ERROR;
        }
        instance->subsystems = subsystems;
        instance->subsystem_ids = ids;
index 20a2776d315e80b8015738a34fbe920d8c1a576d..e292036b9f3ad12b38ffec4d778a9c807ff724ea 100644 (file)
@@ -784,7 +784,10 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
            continue;
        }
     }
-    sudoers_debug_register(plugin_path, &debug_files);
+    if (!sudoers_debug_register(plugin_path, &debug_files)) {
+       ret = -1;
+       goto done;
+    }
 
     /*
      * Pull iolog settings out of command_info.
index d6066c83a10507fe3d7a6629e49938822556d8d9..4ee1e284e3571998dd1edd05892e3c8b2da33513 100644 (file)
@@ -669,7 +669,8 @@ sudoers_policy_open(unsigned int version, sudo_conv_t conversation,
            continue;
        }
     }
-    sudoers_debug_register(plugin_path, &debug_files);
+    if (!sudoers_debug_register(plugin_path, &debug_files))
+       debug_return_int(-1);
 
     /* Call the sudoers init function. */
     info.settings = settings;
index 1971ac82a90f270f9db1b02efe98c66be6cadc97..cfd5abb700192520717263b7e606aaa2bee4aae0 100644 (file)
@@ -369,7 +369,7 @@ extern sudo_printf_t sudo_printf;
 
 /* sudoers_debug.c */
 bool sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, const char *entry);
-void sudoers_debug_register(const char *plugin_path, struct sudo_conf_debug_file_list *debug_files);
+bool sudoers_debug_register(const char *plugin_path, struct sudo_conf_debug_file_list *debug_files);
 void sudoers_debug_deregister(void);
 
 /* policy.c */
index 9de8df2fc116cd3bb3a9bbe842c15e364e1ce2ae..c6b8e17eab292ba23594214eb0121c669b7d2bc7 100644 (file)
@@ -113,7 +113,7 @@ oom:
  * debug subsystem, freeing the debug list when done.
  * Sets the active debug instance as a side effect.
  */
-void
+bool
 sudoers_debug_register(const char *program,
     struct sudo_conf_debug_file_list *debug_files)
 {
@@ -129,6 +129,8 @@ sudoers_debug_register(const char *program,
        if (program != NULL) {
            sudoers_debug_instance = sudo_debug_register(program,
                sudoers_subsystem_names, sudoers_subsystem_ids, debug_files);
+           if (sudoers_debug_instance == SUDO_DEBUG_INSTANCE_ERROR)
+               return false;
        }
        TAILQ_FOREACH_SAFE(debug_file, debug_files, entries, debug_next) {
            TAILQ_REMOVE(debug_files, debug_file, entries);
@@ -137,6 +139,7 @@ sudoers_debug_register(const char *program,
            free(debug_file);
        }
     }
+    return true;
 }
 
 /*
index ecb8f1f025da0b0415944aa137215d05e1c00677..a6d429bbde938fdb461ae574b3b502a026703ebb 100644 (file)
@@ -168,7 +168,8 @@ main(int argc, char *argv[])
        exit(EXIT_FAILURE);
 
     /* Initialize the debug subsystem. */
-    sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()));
+    if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname())))
+       exit(EXIT_FAILURE);
 
     /* Parse sudoers plugin options, if any. */
     parse_sudoers_options();
index c618b9e811950fb23abb1bd8084137d327fd22e9..8d36b3df0b2675aeaf09acb0991fb8531268d4f0 100644 (file)
@@ -179,6 +179,8 @@ main(int argc, char *argv[], char *envp[])
        exit(EXIT_FAILURE);
     sudo_debug_instance = sudo_debug_register(getprogname(),
        NULL, NULL, sudo_conf_debug_files(getprogname()));
+    if (sudo_debug_instance == SUDO_DEBUG_INSTANCE_ERROR)
+       exit(EXIT_FAILURE);
 
     /* Make sure we are setuid root. */
     sudo_check_suid(argc > 0 ? argv[0] : "sudo");