Return to goodpath.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / sudoers |
1.1 ! misho 1: /* ! 2: * Copyright (c) 1996, 1998-2005, 2010-2011 ! 3: * Todd C. Miller <Todd.Miller@courtesan.com> ! 4: * ! 5: * Permission to use, copy, modify, and distribute this software for any ! 6: * purpose with or without fee is hereby granted, provided that the above ! 7: * copyright notice and this permission notice appear in all copies. ! 8: * ! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ! 10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ! 11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ! 12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ! 13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ! 14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ! 15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ! 16: * ! 17: * Sponsored in part by the Defense Advanced Research Projects ! 18: * Agency (DARPA) and Air Force Research Laboratory, Air Force ! 19: * Materiel Command, USAF, under agreement number F39502-99-1-0512. ! 20: */ ! 21: ! 22: #include <config.h> ! 23: ! 24: #include <sys/types.h> ! 25: #include <sys/stat.h> ! 26: #include <sys/param.h> ! 27: #include <stdio.h> ! 28: #ifdef HAVE_STRING_H ! 29: # include <string.h> ! 30: #endif /* HAVE_STRING_H */ ! 31: #ifdef HAVE_STRINGS_H ! 32: # include <strings.h> ! 33: #endif /* HAVE_STRINGS_H */ ! 34: #ifdef HAVE_UNISTD_H ! 35: # include <unistd.h> ! 36: #endif /* HAVE_UNISTD_H */ ! 37: #include <errno.h> ! 38: ! 39: #include "sudoers.h" ! 40: ! 41: /* ! 42: * Verify that path is a normal file and executable by root. ! 43: */ ! 44: char * ! 45: sudo_goodpath(const char *path, struct stat *sbp) ! 46: { ! 47: struct stat sb; ! 48: ! 49: /* Check for brain damage */ ! 50: if (path == NULL || path[0] == '\0') ! 51: return NULL; ! 52: ! 53: if (stat(path, &sb)) ! 54: return NULL; ! 55: ! 56: /* Make sure path describes an executable regular file. */ ! 57: if (!S_ISREG(sb.st_mode) || !(sb.st_mode & 0000111)) { ! 58: errno = EACCES; ! 59: return NULL; ! 60: } ! 61: ! 62: if (sbp != NULL) ! 63: (void) memcpy(sbp, &sb, sizeof(struct stat)); ! 64: return (char *)path; ! 65: }