[sudo-workers] uninits and strsplit problems

Radovan Sroka rsroka at redhat.com
Tue Aug 18 06:40:03 MDT 2015


Hi again,


I've got another issue, it's not so important as previous but there are many uninit problems around strsplit function so I looked at this issue and here's my solution.

I initialize "ep" variable to NULL before first call of sudo_strsplit in scope and add exclusion condition into sudo_strsplit_v1. This patch resolves every warning around sudo_strsplit function.

diff -up ./lib/util/strsplit.c.initialization ./lib/util/strsplit.c
--- ./lib/util/strsplit.c.initialization	2015-07-22 14:22:49.000000000 +0200
+++ ./lib/util/strsplit.c	2015-08-18 13:28:28.141319501 +0200
@@ -37,6 +37,10 @@ sudo_strsplit_v1(const char *str, const
     const char *cp, *s;
     debug_decl(sudo_strsplit, SUDO_DEBUG_UTIL)
 
+    /* exclusion of two NULLs at the same time */
+    if (str == NULL && *last == NULL)
+	debug_return_ptr(NULL);	
+
     /* If no str specified, use last ptr (if any). */
     if (str == NULL)
 	str = *last;
diff -up ./lib/util/sudo_conf.c.initialization ./lib/util/sudo_conf.c
--- ./lib/util/sudo_conf.c.initialization	2015-07-22 14:22:49.000000000 +0200
+++ ./lib/util/sudo_conf.c	2015-08-18 13:28:28.142319494 +0200
@@ -161,7 +161,7 @@ static int
 parse_path(const char *entry, const char *conf_file, unsigned int lineno)
 {
     const char *entry_end = entry + strlen(entry);
-    const char *ep, *name, *path;
+    const char *ep = NULL, *name, *path;
     struct sudo_conf_path_table *cur;
     size_t namelen;
     debug_decl(parse_path, SUDO_DEBUG_UTIL)
@@ -208,7 +208,7 @@ parse_debug(const char *entry, const cha
 {
     struct sudo_conf_debug *debug_spec;
     struct sudo_debug_file *debug_file = NULL;
-    const char *ep, *path, *progname, *flags;
+    const char *ep = NULL, *path, *progname, *flags;
     const char *entry_end = entry + strlen(entry);
     size_t pathlen, prognamelen;
     debug_decl(parse_debug, SUDO_DEBUG_UTIL)
@@ -278,7 +278,7 @@ static int
 parse_plugin(const char *entry, const char *conf_file, unsigned int lineno)
 {
     struct plugin_info *info = NULL;
-    const char *ep, *path, *symbol;
+    const char *ep = NULL, *path, *symbol;
     const char *entry_end = entry + strlen(entry);
     char **options = NULL;
     size_t pathlen, symlen;
diff -up ./plugins/sudoers/editor.c.initialization ./plugins/sudoers/editor.c
--- ./plugins/sudoers/editor.c.initialization	2015-07-22 14:22:49.000000000 +0200
+++ ./plugins/sudoers/editor.c	2015-08-18 13:28:28.142319494 +0200
@@ -45,7 +45,7 @@ resolve_editor(const char *ed, size_t ed
     int *argc_out, char ***argv_out, char * const *whitelist)
 {
     char **nargv, *editor, *editor_path = NULL;
-    const char *cp, *ep, *tmp;
+    const char *cp, *ep = NULL, *tmp;
     const char *edend = ed + edlen;
     struct stat user_editor_sb;
     int nargc;
diff -up ./plugins/sudoers/interfaces.c.initialization ./plugins/sudoers/interfaces.c
--- ./plugins/sudoers/interfaces.c.initialization	2015-07-22 14:22:50.000000000 +0200
+++ ./plugins/sudoers/interfaces.c	2015-08-18 13:28:28.142319494 +0200
@@ -109,7 +109,7 @@ get_interfaces(void)
 void
 dump_interfaces(const char *ai)
 {
-    const char *cp, *ep;
+    const char *cp, *ep = NULL;
     const char *ai_end = ai + strlen(ai);
     debug_decl(set_interfaces, SUDOERS_DEBUG_NETIF)
 
diff -up ./plugins/sudoers/sudoers.c.initialization ./plugins/sudoers/sudoers.c
--- ./plugins/sudoers/sudoers.c.initialization	2015-07-22 14:22:50.000000000 +0200
+++ ./plugins/sudoers/sudoers.c	2015-08-18 13:28:28.142319494 +0200
@@ -1186,7 +1186,7 @@ sudoers_cleanup(void)
 static char *
 find_editor(int nfiles, char **files, int *argc_out, char ***argv_out)
 {
-    const char *cp, *ep, *editor = NULL;
+    const char *cp, *ep = NULL, *editor = NULL;
     char *editor_path = NULL, **ev, *ev0[4];
     debug_decl(find_editor, SUDOERS_DEBUG_PLUGIN)
 
diff -up ./plugins/sudoers/sudoreplay.c.initialization ./plugins/sudoers/sudoreplay.c
--- ./plugins/sudoers/sudoreplay.c.initialization	2015-07-22 14:22:49.000000000 +0200
+++ ./plugins/sudoers/sudoreplay.c	2015-08-18 13:39:53.776411920 +0200
@@ -189,7 +189,7 @@ main(int argc, char *argv[])
     int ch, idx, plen, exitcode = 0, rows = 0, cols = 0;
     bool def_filter = true, listonly = false;
     const char *decimal, *id, *user = NULL, *pattern = NULL, *tty = NULL;
-    char *cp, *ep, path[PATH_MAX];
+    char *cp, *ep = NULL, path[PATH_MAX];
     struct log_info *li;
     double max_wait = 0;
     debug_decl(main, SUDO_DEBUG_MAIN)
@@ -225,6 +225,8 @@ main(int argc, char *argv[])
 	    /* Set the replay filter. */
 	    def_filter = false;
 	    for (cp = strtok_r(optarg, ",", &ep); cp; cp = strtok_r(NULL, ",", &ep)) {
+		if (ep == NULL)                                               #change sudo fatal for something more suitable or whatever
+		    sudo_fatalx(U_("invalid filter option: %s"), optarg);
 		if (strcmp(cp, "stdout") == 0)
 		    io_log_files[IOFD_STDOUT].enabled = true;
 		else if (strcmp(cp, "stderr") == 0)
diff -up ./plugins/sudoers/visudo.c.initialization ./plugins/sudoers/visudo.c
--- ./plugins/sudoers/visudo.c.initialization	2015-07-22 14:22:50.000000000 +0200
+++ ./plugins/sudoers/visudo.c	2015-08-18 13:28:28.142319494 +0200
@@ -287,7 +287,7 @@ get_editor(int *editor_argc, char ***edi
 
     /* Build up editor whitelist from def_editor unless env_editor is set. */
     if (!def_env_editor) {
-	const char *cp, *ep;
+	const char *cp, *ep =  NULL;
 	const char *def_editor_end = def_editor + strlen(def_editor);
 
 	/* Count number of entries in whitelist and split into a list. */
@@ -325,7 +325,7 @@ get_editor(int *editor_argc, char ***edi
     if (editor_path == NULL) {
 	/* def_editor could be a path, split it up, avoiding strtok() */
 	const char *def_editor_end = def_editor + strlen(def_editor);
-	const char *cp, *ep;
+	const char *cp, *ep = NULL;
 	for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep);
 	    cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) {
 	    editor_path = resolve_editor(cp, (size_t)(ep - cp), 2, files,


Please consider my changes.

Radovan Sroka
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sudo-1.8.14p3-initialization.patch
Type: text/x-patch
Size: 5529 bytes
Desc: not available
URL: <http://www.sudo.ws/pipermail/sudo-workers/attachments/20150818/09e78e4a/attachment.bin>


More information about the sudo-workers mailing list