Move duplicated code to parse plugin debug flags to libsudo_util.

There's no need for four copies of sudo_debug_parse_flags().
This commit is contained in:
Todd C. Miller
2020-02-11 15:15:36 -07:00
parent 9e2e79b6fa
commit 0e4c3c47d1
7 changed files with 48 additions and 144 deletions

View File

@@ -262,6 +262,7 @@ __dso_public pid_t sudo_debug_fork_v1(void);
__dso_public int sudo_debug_get_active_instance_v1(void); __dso_public int sudo_debug_get_active_instance_v1(void);
__dso_public int sudo_debug_get_fds_v1(unsigned char **fds); __dso_public int sudo_debug_get_fds_v1(unsigned char **fds);
__dso_public int sudo_debug_get_instance_v1(const char *program); __dso_public int sudo_debug_get_instance_v1(const char *program);
__dso_public int sudo_debug_parse_flags_v1(struct sudo_conf_debug_file_list *debug_files, const char *entry);
__dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, int level, const char *fmt, ...) __printf0like(5, 6); __dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, int level, const char *fmt, ...) __printf0like(5, 6);
__dso_public void sudo_debug_printf_nvm_v1(int pri, const char *fmt, ...) __printf0like(2, 3); __dso_public void sudo_debug_printf_nvm_v1(int pri, const char *fmt, ...) __printf0like(2, 3);
__dso_public int sudo_debug_register_v1(const char *program, const char *const subsystems[], unsigned int ids[], struct sudo_conf_debug_file_list *debug_files); __dso_public int sudo_debug_register_v1(const char *program, const char *const subsystems[], unsigned int ids[], struct sudo_conf_debug_file_list *debug_files);
@@ -290,6 +291,7 @@ __dso_public bool sudo_debug_needed_v1(int level);
#define sudo_debug_get_active_instance() sudo_debug_get_active_instance_v1() #define sudo_debug_get_active_instance() sudo_debug_get_active_instance_v1()
#define sudo_debug_get_fds(_a) sudo_debug_get_fds_v1((_a)) #define sudo_debug_get_fds(_a) sudo_debug_get_fds_v1((_a))
#define sudo_debug_get_instance(_a) sudo_debug_get_instance_v1((_a)) #define sudo_debug_get_instance(_a) sudo_debug_get_instance_v1((_a))
#define sudo_debug_parse_flags(_a, _b) sudo_debug_parse_flags_v1((_a), (_b))
#define sudo_debug_printf2 sudo_debug_printf2_v1 #define sudo_debug_printf2 sudo_debug_printf2_v1
#define sudo_debug_printf_nvm sudo_debug_printf_nvm_v1 #define sudo_debug_printf_nvm sudo_debug_printf_nvm_v1
#define sudo_debug_register(_a, _b, _c, _d) sudo_debug_register_v1((_a), (_b), (_c), (_d)) #define sudo_debug_register(_a, _b, _c, _d) sudo_debug_register_v1((_a), (_b), (_c), (_d))

View File

@@ -409,6 +409,45 @@ sudo_debug_deregister_v1(int idx)
return 0; return 0;
} }
/*
* Parse the "filename flags,..." debug_flags entry from sudo.conf
* and insert a new sudo_debug_file struct into the list.
* Returns 0 on success, 1 on parse error or -1 on malloc failure.
*/
int
sudo_debug_parse_flags_v1(struct sudo_conf_debug_file_list *debug_files,
const char *entry)
{
struct sudo_debug_file *debug_file;
const char *filename, *flags;
size_t namelen;
/* Only process new-style debug flags: filename flags,... */
filename = entry;
if (*filename != '/' || (flags = strpbrk(filename, " \t")) == NULL)
return 1;
namelen = (size_t)(flags - filename);
while (isblank((unsigned char)*flags))
flags++;
if (*flags != '\0') {
if ((debug_file = calloc(1, sizeof(*debug_file))) == NULL)
goto oom;
if ((debug_file->debug_file = strndup(filename, namelen)) == NULL)
goto oom;
if ((debug_file->debug_flags = strdup(flags)) == NULL)
goto oom;
TAILQ_INSERT_TAIL(debug_files, debug_file, entries);
}
return 0;
oom:
if (debug_file != NULL) {
free(debug_file->debug_file);
free(debug_file->debug_flags);
free(debug_file);
}
return -1;
}
int int
sudo_debug_get_instance_v1(const char *program) sudo_debug_get_instance_v1(const char *program)
{ {

View File

@@ -33,6 +33,7 @@ sudo_debug_get_active_instance_v1
sudo_debug_get_fds_v1 sudo_debug_get_fds_v1
sudo_debug_get_instance_v1 sudo_debug_get_instance_v1
sudo_debug_needed_v1 sudo_debug_needed_v1
sudo_debug_parse_flags_v1
sudo_debug_printf2_v1 sudo_debug_printf2_v1
sudo_debug_register_v1 sudo_debug_register_v1
sudo_debug_set_active_instance_v1 sudo_debug_set_active_instance_v1
@@ -63,10 +64,10 @@ sudo_ev_get_timeleft_v1
sudo_ev_get_timeleft_v2 sudo_ev_get_timeleft_v2
sudo_ev_got_break_v1 sudo_ev_got_break_v1
sudo_ev_got_exit_v1 sudo_ev_got_exit_v1
sudo_ev_loop_v1
sudo_ev_loopbreak_v1 sudo_ev_loopbreak_v1
sudo_ev_loopcontinue_v1 sudo_ev_loopcontinue_v1
sudo_ev_loopexit_v1 sudo_ev_loopexit_v1
sudo_ev_loop_v1
sudo_ev_pending_v1 sudo_ev_pending_v1
sudo_ev_set_v1 sudo_ev_set_v1
sudo_fatal_callback_deregister_v1 sudo_fatal_callback_deregister_v1
@@ -77,12 +78,12 @@ sudo_gai_fatal_nodebug_v1
sudo_gai_vfatal_nodebug_v1 sudo_gai_vfatal_nodebug_v1
sudo_gai_vwarn_nodebug_v1 sudo_gai_vwarn_nodebug_v1
sudo_gai_warn_nodebug_v1 sudo_gai_warn_nodebug_v1
sudo_get_ttysize_v1
sudo_getgrouplist2_v1 sudo_getgrouplist2_v1
sudo_gethostname_v1 sudo_gethostname_v1
sudo_gettime_awake_v1 sudo_gettime_awake_v1
sudo_gettime_mono_v1 sudo_gettime_mono_v1
sudo_gettime_real_v1 sudo_gettime_real_v1
sudo_get_ttysize_v1
sudo_json_add_value_as_object_v1 sudo_json_add_value_as_object_v1
sudo_json_add_value_v1 sudo_json_add_value_v1
sudo_json_close_array_v1 sudo_json_close_array_v1

View File

@@ -91,45 +91,6 @@ char * const settings_filter[] = {
NULL NULL
}; };
/*
* Parse the "filename flags,..." debug_flags entry and insert a new
* sudo_debug_file struct into debug_files.
* XXX - move to libsudoutil
*/
static bool
sudo_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files,
const char *entry)
{
struct sudo_debug_file *debug_file;
const char *filename, *flags;
size_t namelen;
/* Only process new-style debug flags: filename flags,... */
filename = entry;
if (*filename != '/' || (flags = strpbrk(filename, " \t")) == NULL)
return true;
namelen = (size_t)(flags - filename);
while (isblank((unsigned char)*flags))
flags++;
if (*flags != '\0') {
if ((debug_file = calloc(1, sizeof(*debug_file))) == NULL)
goto oom;
if ((debug_file->debug_file = strndup(filename, namelen)) == NULL)
goto oom;
if ((debug_file->debug_flags = strdup(flags)) == NULL)
goto oom;
TAILQ_INSERT_TAIL(debug_files, debug_file, entries);
}
return true;
oom:
if (debug_file != NULL) {
free(debug_file->debug_file);
free(debug_file->debug_flags);
free(debug_file);
}
return false;
}
static int static int
audit_json_open(unsigned int version, sudo_conv_t conversation, audit_json_open(unsigned int version, sudo_conv_t conversation,
sudo_printf_t plugin_printf, char * const settings[], sudo_printf_t plugin_printf, char * const settings[],
@@ -163,9 +124,8 @@ audit_json_open(unsigned int version, sudo_conv_t conversation,
for (cur = settings; (cp = *cur) != NULL; cur++) { for (cur = settings; (cp = *cur) != NULL; cur++) {
if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) {
cp += sizeof("debug_flags=") - 1; cp += sizeof("debug_flags=") - 1;
if (!sudo_debug_parse_flags(&debug_files, cp)) { if (sudo_debug_parse_flags(&debug_files, cp) == -1)
goto oom; goto oom;
}
continue; continue;
} }
if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) {

View File

@@ -63,40 +63,11 @@ bool
python_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, python_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files,
const char *entry) const char *entry)
{ {
struct sudo_debug_file *debug_file;
const char *filename, *flags;
size_t namelen;
/* Already initialized? */ /* Already initialized? */
if (python_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) if (python_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER)
return true; return true;
/* Only process new-style debug flags: filename flags,... */ return sudo_debug_parse_flags(debug_files, entry) != -1;
filename = entry;
if (*filename != '/' || (flags = strpbrk(filename, " \t")) == NULL)
return true;
namelen = (size_t)(flags - filename);
while (isblank((unsigned char)*flags))
flags++;
if (*flags != '\0') {
if ((debug_file = calloc(1, sizeof(*debug_file))) == NULL)
goto oom;
if ((debug_file->debug_file = strndup(filename, namelen)) == NULL)
goto oom;
if ((debug_file->debug_flags = strdup(flags)) == NULL)
goto oom;
TAILQ_INSERT_TAIL(debug_files, debug_file, entries);
}
return true;
oom:
if (debug_file != NULL) {
free(debug_file->debug_file);
free(debug_file->debug_flags);
free(debug_file);
}
sudo_warnx_nodebug(U_("%s: %s"), "python_debug_parse_flags",
U_("unable to allocate memory"));
return false;
} }
/* /*

View File

@@ -54,45 +54,6 @@
static int approval_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; static int approval_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER;
sudo_printf_t sudo_printf; sudo_printf_t sudo_printf;
/*
* Parse the "filename flags,..." debug_flags entry and insert a new
* sudo_debug_file struct into debug_files.
* XXX - move to libsudoutil
*/
static bool
sudo_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files,
const char *entry)
{
struct sudo_debug_file *debug_file;
const char *filename, *flags;
size_t namelen;
/* Only process new-style debug flags: filename flags,... */
filename = entry;
if (*filename != '/' || (flags = strpbrk(filename, " \t")) == NULL)
return true;
namelen = (size_t)(flags - filename);
while (isblank((unsigned char)*flags))
flags++;
if (*flags != '\0') {
if ((debug_file = calloc(1, sizeof(*debug_file))) == NULL)
goto oom;
if ((debug_file->debug_file = strndup(filename, namelen)) == NULL)
goto oom;
if ((debug_file->debug_flags = strdup(flags)) == NULL)
goto oom;
TAILQ_INSERT_TAIL(debug_files, debug_file, entries);
}
return true;
oom:
if (debug_file != NULL) {
free(debug_file->debug_file);
free(debug_file->debug_flags);
free(debug_file);
}
return false;
}
static int static int
sample_approval_open(unsigned int version, sudo_conv_t conversation, sample_approval_open(unsigned int version, sudo_conv_t conversation,
sudo_printf_t plugin_printf, char * const settings[], sudo_printf_t plugin_printf, char * const settings[],
@@ -114,9 +75,8 @@ sample_approval_open(unsigned int version, sudo_conv_t conversation,
for (cur = settings; (cp = *cur) != NULL; cur++) { for (cur = settings; (cp = *cur) != NULL; cur++) {
if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) {
cp += sizeof("debug_flags=") - 1; cp += sizeof("debug_flags=") - 1;
if (!sudo_debug_parse_flags(&debug_files, cp)) { if (sudo_debug_parse_flags(&debug_files, cp) == -1)
goto oom; goto oom;
}
continue; continue;
} }
if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) {

View File

@@ -80,40 +80,11 @@ bool
sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files,
const char *entry) const char *entry)
{ {
struct sudo_debug_file *debug_file;
const char *filename, *flags;
size_t namelen;
/* Already initialized? */ /* Already initialized? */
if (sudoers_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) if (sudoers_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER)
return true; return true;
/* Only process new-style debug flags: filename flags,... */ return sudo_debug_parse_flags(debug_files, entry) != -1;
filename = entry;
if (*filename != '/' || (flags = strpbrk(filename, " \t")) == NULL)
return true;
namelen = (size_t)(flags - filename);
while (isblank((unsigned char)*flags))
flags++;
if (*flags != '\0') {
if ((debug_file = calloc(1, sizeof(*debug_file))) == NULL)
goto oom;
if ((debug_file->debug_file = strndup(filename, namelen)) == NULL)
goto oom;
if ((debug_file->debug_flags = strdup(flags)) == NULL)
goto oom;
TAILQ_INSERT_TAIL(debug_files, debug_file, entries);
}
return true;
oom:
if (debug_file != NULL) {
free(debug_file->debug_file);
free(debug_file->debug_flags);
free(debug_file);
}
sudo_warnx_nodebug(U_("%s: %s"), "sudoers_debug_parse_flags",
U_("unable to allocate memory"));
return false;
} }
/* /*