Diff for /embedaddon/sudo/src/sudo.c between versions 1.1.1.5 and 1.1.1.6

version 1.1.1.5, 2013/10/14 07:56:35 version 1.1.1.6, 2014/06/15 16:12:55
Line 54 Line 54
 #include <signal.h>  #include <signal.h>
 #include <grp.h>  #include <grp.h>
 #include <pwd.h>  #include <pwd.h>
#if TIME_WITH_SYS_TIME#ifdef TIME_WITH_SYS_TIME
 # include <time.h>  # include <time.h>
 #endif  #endif
 #ifdef HAVE_LOGIN_CAP_H  #ifdef HAVE_LOGIN_CAP_H
Line 92 Line 92
  * Local variables   * Local variables
  */   */
 struct plugin_container policy_plugin;  struct plugin_container policy_plugin;
struct plugin_container_list io_plugins;struct plugin_container_list io_plugins = TAILQ_HEAD_INITIALIZER(io_plugins);
 struct user_details user_details;  struct user_details user_details;
 const char *list_user; /* extern for parse_args.c */  const char *list_user; /* extern for parse_args.c */
 static struct command_details command_details;  static struct command_details command_details;
Line 200  main(int argc, char *argv[], char *envp[]) Line 200  main(int argc, char *argv[], char *envp[])
   
     /* Load plugins. */      /* Load plugins. */
     if (!sudo_load_plugins(&policy_plugin, &io_plugins))      if (!sudo_load_plugins(&policy_plugin, &io_plugins))
        fatalx(_("fatal error, unable to load plugins"));        fatalx(U_("fatal error, unable to load plugins"));
   
     /* Open policy plugin. */      /* Open policy plugin. */
     ok = policy_open(&policy_plugin, settings, user_info, envp);      ok = policy_open(&policy_plugin, settings, user_info, envp);
Line 208  main(int argc, char *argv[], char *envp[]) Line 208  main(int argc, char *argv[], char *envp[])
         if (ok == -2)          if (ok == -2)
             usage(1);              usage(1);
         else          else
            fatalx(_("unable to initialize policy plugin"));            fatalx(U_("unable to initialize policy plugin"));
     }      }
   
     init_signals();      init_signals();
Line 216  main(int argc, char *argv[], char *envp[]) Line 216  main(int argc, char *argv[], char *envp[])
     switch (sudo_mode & MODE_MASK) {      switch (sudo_mode & MODE_MASK) {
         case MODE_VERSION:          case MODE_VERSION:
             policy_show_version(&policy_plugin, !user_details.uid);              policy_show_version(&policy_plugin, !user_details.uid);
            tq_foreach_fwd(&io_plugins, plugin) {            TAILQ_FOREACH(plugin, &io_plugins, entries) {
                 ok = iolog_open(plugin, settings, user_info, NULL,                  ok = iolog_open(plugin, settings, user_info, NULL,
                     nargc, nargv, envp);                      nargc, nargv, envp);
                 if (ok != -1)                  if (ok != -1)
Line 250  main(int argc, char *argv[], char *envp[]) Line 250  main(int argc, char *argv[], char *envp[])
                 exit(1); /* plugin printed error message */                  exit(1); /* plugin printed error message */
             }              }
             /* Open I/O plugins once policy plugin succeeds. */              /* Open I/O plugins once policy plugin succeeds. */
            for (plugin = io_plugins.first; plugin != NULL; plugin = next) {            TAILQ_FOREACH_SAFE(plugin, &io_plugins, entries, next) {
                next = plugin->next; 
                 ok = iolog_open(plugin, settings, user_info,                  ok = iolog_open(plugin, settings, user_info,
                     command_info, nargc, nargv, envp);                      command_info, nargc, nargv, envp);
                 switch (ok) {                  switch (ok) {
Line 265  main(int argc, char *argv[], char *envp[]) Line 264  main(int argc, char *argv[], char *envp[])
                     usage(1);                      usage(1);
                     break;                      break;
                 default:                  default:
                    fatalx(_("error initializing I/O plugin %s"),                    fatalx(U_("error initializing I/O plugin %s"),
                         plugin->name);                          plugin->name);
                 }                  }
             }              }
Line 291  main(int argc, char *argv[], char *envp[]) Line 290  main(int argc, char *argv[], char *envp[])
             /* The close method was called by sudo_edit/run_command. */              /* The close method was called by sudo_edit/run_command. */
             break;              break;
         default:          default:
            fatalx(_("unexpected sudo mode 0x%x"), sudo_mode);            fatalx(U_("unexpected sudo mode 0x%x"), sudo_mode);
     }      }
     sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode);                      sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode);                
     exit(exitcode);      exit(exitcode);
Line 300  main(int argc, char *argv[], char *envp[]) Line 299  main(int argc, char *argv[], char *envp[])
 int  int
 os_init_common(int argc, char *argv[], char *envp[])  os_init_common(int argc, char *argv[], char *envp[])
 {  {
#if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME)    initprogname(argc > 0 ? argv[0] : "sudo");
    if (argc > 0)#ifdef STATIC_SUDOERS_PLUGIN
        setprogname(argv[0]);    preload_static_symbols();
 #endif  #endif
     return 0;      return 0;
 }  }
Line 326  fix_fds(void) Line 325  fix_fds(void)
     miss[STDERR_FILENO] = fcntl(STDERR_FILENO, F_GETFL, 0) == -1;      miss[STDERR_FILENO] = fcntl(STDERR_FILENO, F_GETFL, 0) == -1;
     if (miss[STDIN_FILENO] || miss[STDOUT_FILENO] || miss[STDERR_FILENO]) {      if (miss[STDIN_FILENO] || miss[STDOUT_FILENO] || miss[STDERR_FILENO]) {
         if ((devnull = open(_PATH_DEVNULL, O_RDWR, 0644)) == -1)          if ((devnull = open(_PATH_DEVNULL, O_RDWR, 0644)) == -1)
            fatal(_("unable to open %s"), _PATH_DEVNULL);            fatal(U_("unable to open %s"), _PATH_DEVNULL);
         if (miss[STDIN_FILENO] && dup2(devnull, STDIN_FILENO) == -1)          if (miss[STDIN_FILENO] && dup2(devnull, STDIN_FILENO) == -1)
             fatal("dup2");              fatal("dup2");
         if (miss[STDOUT_FILENO] && dup2(devnull, STDOUT_FILENO) == -1)          if (miss[STDOUT_FILENO] && dup2(devnull, STDOUT_FILENO) == -1)
Line 411  get_user_groups(struct user_details *ud) Line 410  get_user_groups(struct user_details *ud)
          * Typically, this is because NFS can only support up to 16 groups.           * Typically, this is because NFS can only support up to 16 groups.
          */           */
         if (fill_group_list(ud, maxgroups) == -1)          if (fill_group_list(ud, maxgroups) == -1)
            fatal(_("unable to get group vector"));            fatal(U_("unable to get group vector"));
     }      }
   
     /*      /*
Line 463  get_user_info(struct user_details *ud) Line 462  get_user_info(struct user_details *ud)
   
     pw = getpwuid(ud->uid);      pw = getpwuid(ud->uid);
     if (pw == NULL)      if (pw == NULL)
        fatalx(_("unknown uid %u: who are you?"), (unsigned int)ud->uid);        fatalx(U_("unknown uid %u: who are you?"), (unsigned int)ud->uid);
   
     user_info[i] = fmt_string("user", pw->pw_name);      user_info[i] = fmt_string("user", pw->pw_name);
     if (user_info[i] == NULL)      if (user_info[i] == NULL)
Line 531  command_info_to_details(char * const info[], struct co Line 530  command_info_to_details(char * const info[], struct co
 {  {
     int i;      int i;
     id_t id;      id_t id;
    long lval;    char *cp;
    char *cp, *ep; 
     const char *errstr;      const char *errstr;
     debug_decl(command_info_to_details, SUDO_DEBUG_PCOMM)      debug_decl(command_info_to_details, SUDO_DEBUG_PCOMM)
   
     memset(details, 0, sizeof(*details));      memset(details, 0, sizeof(*details));
     details->closefrom = -1;      details->closefrom = -1;
       TAILQ_INIT(&details->preserved_fds);
   
 #define SET_STRING(s, n) \  #define SET_STRING(s, n) \
     if (strncmp(s, info[i], sizeof(s) - 1) == 0 && info[i][sizeof(s) - 1]) { \      if (strncmp(s, info[i], sizeof(s) - 1) == 0 && info[i][sizeof(s) - 1]) { \
Line 554  command_info_to_details(char * const info[], struct co Line 553  command_info_to_details(char * const info[], struct co
                 SET_STRING("command=", command)                  SET_STRING("command=", command)
                 SET_STRING("cwd=", cwd)                  SET_STRING("cwd=", cwd)
                 if (strncmp("closefrom=", info[i], sizeof("closefrom=") - 1) == 0) {                  if (strncmp("closefrom=", info[i], sizeof("closefrom=") - 1) == 0) {
                     errno = 0;  
                     cp = info[i] + sizeof("closefrom=") - 1;                      cp = info[i] + sizeof("closefrom=") - 1;
                    lval = strtol(cp, &ep, 10);                    details->closefrom = strtonum(cp, 0, INT_MAX, &errstr);
                    if (*cp == '\0' || *ep != '\0')                    if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _("invalid value"));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                    if ((errno == ERANGE && 
                        (lval == LONG_MAX || lval == LONG_MIN)) || 
                        (lval > INT_MAX || lval < 0)) 
                        fatalx(_("%s: %s"), info[i], _("value out of range")); 
                    details->closefrom = (int)lval; 
                     break;                      break;
                 }                  }
                 break;                  break;
Line 579  command_info_to_details(char * const info[], struct co Line 572  command_info_to_details(char * const info[], struct co
                 break;                  break;
             case 'n':              case 'n':
                 if (strncmp("nice=", info[i], sizeof("nice=") - 1) == 0) {                  if (strncmp("nice=", info[i], sizeof("nice=") - 1) == 0) {
                     errno = 0;  
                     cp = info[i] + sizeof("nice=") - 1;                      cp = info[i] + sizeof("nice=") - 1;
                    lval = strtol(cp, &ep, 10);                    details->priority = strtonum(cp, INT_MIN, INT_MAX, &errstr);
                    if (*cp == '\0' || *ep != '\0')                    if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _("invalid value"));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                    if ((errno == ERANGE && 
                        (lval == LONG_MAX || lval == LONG_MIN)) || 
                        (lval > INT_MAX || lval < INT_MIN)) 
                        fatalx(_("%s: %s"), info[i], _("value out of range")); 
                    details->priority = (int)lval; 
                     SET(details->flags, CD_SET_PRIORITY);                      SET(details->flags, CD_SET_PRIORITY);
                     break;                      break;
                 }                  }
Line 604  command_info_to_details(char * const info[], struct co Line 591  command_info_to_details(char * const info[], struct co
                         SET(details->flags, CD_PRESERVE_GROUPS);                          SET(details->flags, CD_PRESERVE_GROUPS);
                     break;                      break;
                 }                  }
                   if (strncmp("preserve_fds=", info[i], sizeof("preserve_fds=") - 1) == 0) {
                       parse_preserved_fds(&details->preserved_fds,
                           info[i] + sizeof("preserve_fds=") - 1);
                       break;
                   }
                 break;                  break;
             case 'r':              case 'r':
                 if (strncmp("runas_egid=", info[i], sizeof("runas_egid=") - 1) == 0) {                  if (strncmp("runas_egid=", info[i], sizeof("runas_egid=") - 1) == 0) {
                     cp = info[i] + sizeof("runas_egid=") - 1;                      cp = info[i] + sizeof("runas_egid=") - 1;
                     id = atoid(cp, NULL, NULL, &errstr);                      id = atoid(cp, NULL, NULL, &errstr);
                     if (errstr != NULL)                      if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _(errstr));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                     details->egid = (gid_t)id;                      details->egid = (gid_t)id;
                     SET(details->flags, CD_SET_EGID);                      SET(details->flags, CD_SET_EGID);
                     break;                      break;
Line 619  command_info_to_details(char * const info[], struct co Line 611  command_info_to_details(char * const info[], struct co
                     cp = info[i] + sizeof("runas_euid=") - 1;                      cp = info[i] + sizeof("runas_euid=") - 1;
                     id = atoid(cp, NULL, NULL, &errstr);                      id = atoid(cp, NULL, NULL, &errstr);
                     if (errstr != NULL)                      if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _(errstr));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                     details->euid = (uid_t)id;                      details->euid = (uid_t)id;
                     SET(details->flags, CD_SET_EUID);                      SET(details->flags, CD_SET_EUID);
                     break;                      break;
Line 628  command_info_to_details(char * const info[], struct co Line 620  command_info_to_details(char * const info[], struct co
                     cp = info[i] + sizeof("runas_gid=") - 1;                      cp = info[i] + sizeof("runas_gid=") - 1;
                     id = atoid(cp, NULL, NULL, &errstr);                      id = atoid(cp, NULL, NULL, &errstr);
                     if (errstr != NULL)                      if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _(errstr));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                     details->gid = (gid_t)id;                      details->gid = (gid_t)id;
                     SET(details->flags, CD_SET_GID);                      SET(details->flags, CD_SET_GID);
                     break;                      break;
Line 643  command_info_to_details(char * const info[], struct co Line 635  command_info_to_details(char * const info[], struct co
                     cp = info[i] + sizeof("runas_uid=") - 1;                      cp = info[i] + sizeof("runas_uid=") - 1;
                     id = atoid(cp, NULL, NULL, &errstr);                      id = atoid(cp, NULL, NULL, &errstr);
                     if (errstr != NULL)                      if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _(errstr));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                     details->uid = (uid_t)id;                      details->uid = (uid_t)id;
                     SET(details->flags, CD_SET_UID);                      SET(details->flags, CD_SET_UID);
                     break;                      break;
Line 687  command_info_to_details(char * const info[], struct co Line 679  command_info_to_details(char * const info[], struct co
                 break;                  break;
             case 't':              case 't':
                 if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) {                  if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) {
                     errno = 0;  
                     cp = info[i] + sizeof("timeout=") - 1;                      cp = info[i] + sizeof("timeout=") - 1;
                    lval = strtol(cp, &ep, 10);                    details->timeout = strtonum(cp, 0, INT_MAX, &errstr);
                    if (*cp == '\0' || *ep != '\0')                    if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _("invalid value"));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                    if ((errno == ERANGE && 
                        (lval == LONG_MAX || lval == LONG_MIN)) || 
                        (lval > INT_MAX || lval < 0)) 
                        fatalx(_("%s: %s"), info[i], _("value out of range")); 
                    details->timeout = (int)lval; 
                     SET(details->flags, CD_SET_TIMEOUT);                      SET(details->flags, CD_SET_TIMEOUT);
                     break;                      break;
                 }                  }
                 break;                  break;
             case 'u':              case 'u':
                 if (strncmp("umask=", info[i], sizeof("umask=") - 1) == 0) {                  if (strncmp("umask=", info[i], sizeof("umask=") - 1) == 0) {
                     errno = 0;  
                     cp = info[i] + sizeof("umask=") - 1;                      cp = info[i] + sizeof("umask=") - 1;
                    lval = strtol(cp, &ep, 8);                    details->umask = atomode(cp, &errstr);
                    if (*cp == '\0' || *ep != '\0')                    if (errstr != NULL)
                        fatalx(_("%s: %s"), info[i], _("invalid value"));                        fatalx(U_("%s: %s"), info[i], U_(errstr));
                    if ((errno == ERANGE && 
                        (lval == LONG_MAX || lval == LONG_MIN)) || 
                        (lval > 0777 || lval < 0)) 
                        fatalx(_("%s: %s"), info[i], _("value out of range")); 
                    details->umask = (mode_t)lval; 
                     SET(details->flags, CD_SET_UMASK);                      SET(details->flags, CD_SET_UMASK);
                     break;                      break;
                 }                  }
Line 768  sudo_check_suid(const char *sudo) Line 748  sudo_check_suid(const char *sudo)
                     if ((colon = strchr(cp, ':')))                      if ((colon = strchr(cp, ':')))
                         *colon = '\0';                          *colon = '\0';
                     len = snprintf(pathbuf, sizeof(pathbuf), "%s/%s", cp, sudo);                      len = snprintf(pathbuf, sizeof(pathbuf), "%s/%s", cp, sudo);
                    if (len <= 0 || len >= sizeof(pathbuf))                    if (len <= 0 || (size_t)len >= sizeof(pathbuf))
                         continue;                          continue;
                     if (access(pathbuf, X_OK) == 0) {                      if (access(pathbuf, X_OK) == 0) {
                         sudo = pathbuf;                          sudo = pathbuf;
Line 785  sudo_check_suid(const char *sudo) Line 765  sudo_check_suid(const char *sudo)
             /* Try to determine why sudo was not running as root. */              /* Try to determine why sudo was not running as root. */
             if (sb.st_uid != ROOT_UID || !ISSET(sb.st_mode, S_ISUID)) {              if (sb.st_uid != ROOT_UID || !ISSET(sb.st_mode, S_ISUID)) {
                 fatalx(                  fatalx(
                    _("%s must be owned by uid %d and have the setuid bit set"),                    U_("%s must be owned by uid %d and have the setuid bit set"),
                     sudo, ROOT_UID);                      sudo, ROOT_UID);
             } else {              } else {
                fatalx(_("effective uid is not %d, is %s on a file system "                fatalx(U_("effective uid is not %d, is %s on a file system "
                     "with the 'nosuid' option set or an NFS file system without"                      "with the 'nosuid' option set or an NFS file system without"
                     " root privileges?"), ROOT_UID, sudo);                      " root privileges?"), ROOT_UID, sudo);
             }              }
         } else {          } else {
             fatalx(              fatalx(
                _("effective uid is not %d, is sudo installed setuid root?"),                U_("effective uid is not %d, is sudo installed setuid root?"),
                 ROOT_UID);                  ROOT_UID);
         }          }
     }      }
Line 920  exec_setup(struct command_details *details, const char Line 900  exec_setup(struct command_details *details, const char
              */               */
             lc = login_getclass((char *)details->login_class);              lc = login_getclass((char *)details->login_class);
             if (!lc) {              if (!lc) {
                warningx(_("unknown login class %s"), details->login_class);                warningx(U_("unknown login class %s"), details->login_class);
                 errno = ENOENT;                  errno = ENOENT;
                 goto done;                  goto done;
             }              }
Line 933  exec_setup(struct command_details *details, const char Line 913  exec_setup(struct command_details *details, const char
                 flags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY;                  flags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY;
             }              }
             if (setusercontext(lc, details->pw, details->pw->pw_uid, flags)) {              if (setusercontext(lc, details->pw, details->pw->pw_uid, flags)) {
                warning(_("unable to set user context"));                warning(U_("unable to set user context"));
                 if (details->pw->pw_uid != ROOT_UID)                  if (details->pw->pw_uid != ROOT_UID)
                     goto done;                      goto done;
             }              }
Line 947  exec_setup(struct command_details *details, const char Line 927  exec_setup(struct command_details *details, const char
     if (!ISSET(details->flags, CD_PRESERVE_GROUPS)) {      if (!ISSET(details->flags, CD_PRESERVE_GROUPS)) {
         if (details->ngroups >= 0) {          if (details->ngroups >= 0) {
             if (sudo_setgroups(details->ngroups, details->groups) < 0) {              if (sudo_setgroups(details->ngroups, details->groups) < 0) {
                warning(_("unable to set supplementary group IDs"));                warning(U_("unable to set supplementary group IDs"));
                 goto done;                  goto done;
             }              }
         }          }
     }      }
 #ifdef HAVE_SETEUID  #ifdef HAVE_SETEUID
     if (ISSET(details->flags, CD_SET_EGID) && setegid(details->egid)) {      if (ISSET(details->flags, CD_SET_EGID) && setegid(details->egid)) {
        warning(_("unable to set effective gid to runas gid %u"),        warning(U_("unable to set effective gid to runas gid %u"),
             (unsigned int)details->egid);              (unsigned int)details->egid);
         goto done;          goto done;
     }      }
 #endif  #endif
     if (ISSET(details->flags, CD_SET_GID) && setgid(details->gid)) {      if (ISSET(details->flags, CD_SET_GID) && setgid(details->gid)) {
        warning(_("unable to set gid to runas gid %u"),        warning(U_("unable to set gid to runas gid %u"),
             (unsigned int)details->gid);              (unsigned int)details->gid);
         goto done;          goto done;
     }      }
   
     if (ISSET(details->flags, CD_SET_PRIORITY)) {      if (ISSET(details->flags, CD_SET_PRIORITY)) {
         if (setpriority(PRIO_PROCESS, 0, details->priority) != 0) {          if (setpriority(PRIO_PROCESS, 0, details->priority) != 0) {
            warning(_("unable to set process priority"));            warning(U_("unable to set process priority"));
             goto done;              goto done;
         }          }
     }      }
Line 975  exec_setup(struct command_details *details, const char Line 955  exec_setup(struct command_details *details, const char
         (void) umask(details->umask);          (void) umask(details->umask);
     if (details->chroot) {      if (details->chroot) {
         if (chroot(details->chroot) != 0 || chdir("/") != 0) {          if (chroot(details->chroot) != 0 || chdir("/") != 0) {
            warning(_("unable to change root to %s"), details->chroot);            warning(U_("unable to change root to %s"), details->chroot);
             goto done;              goto done;
         }          }
     }      }
Line 988  exec_setup(struct command_details *details, const char Line 968  exec_setup(struct command_details *details, const char
   
 #ifdef HAVE_SETRESUID  #ifdef HAVE_SETRESUID
     if (setresuid(details->uid, details->euid, details->euid) != 0) {      if (setresuid(details->uid, details->euid, details->euid) != 0) {
        warning(_("unable to change to runas uid (%u, %u)"), details->uid,        warning(U_("unable to change to runas uid (%u, %u)"), details->uid,
             details->euid);              details->euid);
         goto done;          goto done;
     }      }
#elif HAVE_SETREUID#elif defined(HAVE_SETREUID)
     if (setreuid(details->uid, details->euid) != 0) {      if (setreuid(details->uid, details->euid) != 0) {
        warning(_("unable to change to runas uid (%u, %u)"),        warning(U_("unable to change to runas uid (%u, %u)"),
             (unsigned int)details->uid, (unsigned int)details->euid);              (unsigned int)details->uid, (unsigned int)details->euid);
         goto done;          goto done;
     }      }
 #else  #else
     if (seteuid(details->euid) != 0 || setuid(details->euid) != 0) {      if (seteuid(details->euid) != 0 || setuid(details->euid) != 0) {
        warning(_("unable to change to runas uid (%u, %u)"), details->uid,        warning(U_("unable to change to runas uid (%u, %u)"), details->uid,
             details->euid);              details->euid);
         goto done;          goto done;
     }      }
Line 1017  exec_setup(struct command_details *details, const char Line 997  exec_setup(struct command_details *details, const char
         if (details->chroot || strcmp(details->cwd, user_details.cwd) != 0) {          if (details->chroot || strcmp(details->cwd, user_details.cwd) != 0) {
             /* Note: cwd is relative to the new root, if any. */              /* Note: cwd is relative to the new root, if any. */
             if (chdir(details->cwd) != 0) {              if (chdir(details->cwd) != 0) {
                warning(_("unable to change directory to %s"), details->cwd);                warning(U_("unable to change directory to %s"), details->cwd);
                 goto done;                  goto done;
             }              }
         }          }
Line 1051  run_command(struct command_details *details) Line 1031  run_command(struct command_details *details)
         sudo_debug_printf(SUDO_DEBUG_DEBUG,          sudo_debug_printf(SUDO_DEBUG_DEBUG,
             "calling policy close with errno %d", cstat.val);              "calling policy close with errno %d", cstat.val);
         policy_close(&policy_plugin, 0, cstat.val);          policy_close(&policy_plugin, 0, cstat.val);
        tq_foreach_fwd(&io_plugins, plugin) {        TAILQ_FOREACH(plugin, &io_plugins, entries) {
             sudo_debug_printf(SUDO_DEBUG_DEBUG,              sudo_debug_printf(SUDO_DEBUG_DEBUG,
                 "calling I/O close with errno %d", cstat.val);                  "calling I/O close with errno %d", cstat.val);
             iolog_close(plugin, 0, cstat.val);              iolog_close(plugin, 0, cstat.val);
Line 1063  run_command(struct command_details *details) Line 1043  run_command(struct command_details *details)
         sudo_debug_printf(SUDO_DEBUG_DEBUG,          sudo_debug_printf(SUDO_DEBUG_DEBUG,
             "calling policy close with wait status %d", cstat.val);              "calling policy close with wait status %d", cstat.val);
         policy_close(&policy_plugin, cstat.val, 0);          policy_close(&policy_plugin, cstat.val, 0);
        tq_foreach_fwd(&io_plugins, plugin) {        TAILQ_FOREACH(plugin, &io_plugins, entries) {
             sudo_debug_printf(SUDO_DEBUG_DEBUG,              sudo_debug_printf(SUDO_DEBUG_DEBUG,
                 "calling I/O close with wait status %d", cstat.val);                  "calling I/O close with wait status %d", cstat.val);
             iolog_close(plugin, cstat.val, 0);              iolog_close(plugin, cstat.val, 0);
Line 1074  run_command(struct command_details *details) Line 1054  run_command(struct command_details *details)
             exitcode = WTERMSIG(cstat.val) | 128;              exitcode = WTERMSIG(cstat.val) | 128;
         break;          break;
     default:      default:
        warningx(_("unexpected child termination condition: %d"), cstat.type);        warningx(U_("unexpected child termination condition: %d"), cstat.type);
         break;          break;
     }      }
     debug_return_int(exitcode);      debug_return_int(exitcode);
Line 1111  policy_close(struct plugin_container *plugin, int exit Line 1091  policy_close(struct plugin_container *plugin, int exit
     if (plugin->u.policy->close != NULL)      if (plugin->u.policy->close != NULL)
         plugin->u.policy->close(exit_status, error);          plugin->u.policy->close(exit_status, error);
     else      else
        warning(_("unable to execute %s"), command_details.command);        warning(U_("unable to execute %s"), command_details.command);
     debug_return;      debug_return;
 }  }
   
Line 1131  policy_check(struct plugin_container *plugin, int argc Line 1111  policy_check(struct plugin_container *plugin, int argc
 {  {
     debug_decl(policy_check, SUDO_DEBUG_PCOMM)      debug_decl(policy_check, SUDO_DEBUG_PCOMM)
     if (plugin->u.policy->check_policy == NULL) {      if (plugin->u.policy->check_policy == NULL) {
        fatalx(_("policy plugin %s is missing the `check_policy' method"),        fatalx(U_("policy plugin %s is missing the `check_policy' method"),
             plugin->name);              plugin->name);
     }      }
     debug_return_bool(plugin->u.policy->check_policy(argc, argv, env_add,      debug_return_bool(plugin->u.policy->check_policy(argc, argv, env_add,
Line 1144  policy_list(struct plugin_container *plugin, int argc, Line 1124  policy_list(struct plugin_container *plugin, int argc,
 {  {
     debug_decl(policy_list, SUDO_DEBUG_PCOMM)      debug_decl(policy_list, SUDO_DEBUG_PCOMM)
     if (plugin->u.policy->list == NULL) {      if (plugin->u.policy->list == NULL) {
        warningx(_("policy plugin %s does not support listing privileges"),        warningx(U_("policy plugin %s does not support listing privileges"),
             plugin->name);              plugin->name);
         debug_return_bool(false);          debug_return_bool(false);
     }      }
Line 1156  policy_validate(struct plugin_container *plugin) Line 1136  policy_validate(struct plugin_container *plugin)
 {  {
     debug_decl(policy_validate, SUDO_DEBUG_PCOMM)      debug_decl(policy_validate, SUDO_DEBUG_PCOMM)
     if (plugin->u.policy->validate == NULL) {      if (plugin->u.policy->validate == NULL) {
        warningx(_("policy plugin %s does not support the -v option"),        warningx(U_("policy plugin %s does not support the -v option"),
             plugin->name);              plugin->name);
         debug_return_bool(false);          debug_return_bool(false);
     }      }
Line 1168  policy_invalidate(struct plugin_container *plugin, int Line 1148  policy_invalidate(struct plugin_container *plugin, int
 {  {
     debug_decl(policy_invalidate, SUDO_DEBUG_PCOMM)      debug_decl(policy_invalidate, SUDO_DEBUG_PCOMM)
     if (plugin->u.policy->invalidate == NULL) {      if (plugin->u.policy->invalidate == NULL) {
        fatalx(_("policy plugin %s does not support the -k/-K options"),        fatalx(U_("policy plugin %s does not support the -k/-K options"),
             plugin->name);              plugin->name);
     }      }
     plugin->u.policy->invalidate(remove);      plugin->u.policy->invalidate(remove);
Line 1262  iolog_unlink(struct plugin_container *plugin) Line 1242  iolog_unlink(struct plugin_container *plugin)
                 deregister_hook);                  deregister_hook);
     }      }
     /* Remove from io_plugins list and free. */      /* Remove from io_plugins list and free. */
    tq_remove(&io_plugins, plugin);    TAILQ_REMOVE(&io_plugins, plugin, entries);
     efree(plugin);      efree(plugin);
   
     debug_return;      debug_return;

Removed from v.1.1.1.5  
changed lines
  Added in v.1.1.1.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>