]> granicus.if.org Git - sudo/commitdiff
Make sudo_goodpath() return value bolean
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 13 Nov 2011 17:11:00 +0000 (12:11 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 13 Nov 2011 17:11:00 +0000 (12:11 -0500)
plugins/sudoers/find_path.c
plugins/sudoers/goodpath.c
plugins/sudoers/sudoers.h

index a168234a2ac2d70078276d6233183f265a56ed47..0415b36e3d6e92ec6190bfa82830d8964b1ccb4e 100644 (file)
@@ -60,8 +60,8 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path,
     static char command[PATH_MAX]; /* qualified filename */
     char *n;                   /* for traversing path */
     char *origpath;            /* so we can free path later */
-    char *result = NULL;       /* result of path/file lookup */
-    int checkdot = 0;          /* check current dir? */
+    int found = FALSE;         /* did we find the command? */
+    int checkdot = FALSE;      /* check current dir? */
     int len;                   /* length parameter */
     debug_decl(find_path, SUDO_DEBUG_UTIL)
 
@@ -106,7 +106,7 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path,
        len = snprintf(command, sizeof(command), "%s/%s", path, infile);
        if (len <= 0 || len >= sizeof(command))
            errorx(1, _("%s: %s"), infile, strerror(ENAMETOOLONG));
-       if ((result = sudo_goodpath(command, sbp)))
+       if ((found = sudo_goodpath(command, sbp)))
            break;
 
        path = n + 1;
@@ -117,17 +117,17 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path,
     /*
      * Check current dir if dot was in the PATH
      */
-    if (!result && checkdot) {
+    if (!found && checkdot) {
        len = snprintf(command, sizeof(command), "./%s", infile);
        if (len <= 0 || len >= sizeof(command))
            errorx(1, _("%s: %s"), infile, strerror(ENAMETOOLONG));
-       result = sudo_goodpath(command, sbp);
-       if (result && ignore_dot)
+       found = sudo_goodpath(command, sbp);
+       if (found && ignore_dot)
            debug_return_int(NOT_FOUND_DOT);
     }
 
-    if (result) {
-       *outfile = result;
+    if (found) {
+       *outfile = command;
        debug_return_int(FOUND);
     } else
        debug_return_int(NOT_FOUND);
index 08556102fac6b31bd3189737f93d69da9c7087a6..d0c6df9e288910f7043f0c08ad2f5ebad260e011 100644 (file)
 /*
  * Verify that path is a normal file and executable by root.
  */
-char *
+int
 sudo_goodpath(const char *path, struct stat *sbp)
 {
     struct stat sb;
+    int rval = FALSE;
     debug_decl(sudo_goodpath, SUDO_DEBUG_UTIL)
 
-    /* Check for brain damage */
-    if (path == NULL || path[0] == '\0')
-       debug_return_str(NULL);
-
-    if (stat(path, &sb))
-       debug_return_str(NULL);
-
-    /* Make sure path describes an executable regular file. */
-    if (!S_ISREG(sb.st_mode) || !(sb.st_mode & 0000111)) {
-       errno = EACCES;
-       debug_return_str(NULL);
-    }
-
-    if (sbp != NULL)
+    if (path != NULL && stat(path, &sb) == 0) {
+       /* Make sure path describes an executable regular file. */
+       if (S_ISREG(sb.st_mode) && ISSET(sb.st_mode, 0111))
+           rval = TRUE;
+       else
+           errno = EACCES;
        (void) memcpy(sbp, &sb, sizeof(struct stat));
+    }
 
-    debug_return_str((char *)path);
+    debug_return_int(rval);
 }
index fe9887a7c62a61a967fd941b64738964b36f32d1..0fed51148e02514390526aab178b9be525309b67 100644 (file)
@@ -207,7 +207,7 @@ struct timeval;
 #define YY_DECL int yylex(void)
 
 /* goodpath.c */
-char *sudo_goodpath(const char *, struct stat *);
+int sudo_goodpath(const char *, struct stat *);
 
 /* findpath.c */
 int find_path(char *, char **, struct stat *, char *, int);