Diff for /embedaddon/sudo/plugins/sudoers/iolog_path.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/05/29 12:26:49 version 1.1.1.3, 2012/10/09 09:29:52
Line 46 Line 46
   
 struct path_escape {  struct path_escape {
     const char *name;      const char *name;
    size_t (*copy_fn)(char *, size_t);    size_t (*copy_fn)(char *, size_t, char *);
 };  };
   
static size_t fill_seq(char *, size_t);static size_t fill_seq(char *, size_t, char *);
static size_t fill_user(char *, size_t);static size_t fill_user(char *, size_t, char *);
static size_t fill_group(char *, size_t);static size_t fill_group(char *, size_t, char *);
static size_t fill_runas_user(char *, size_t);static size_t fill_runas_user(char *, size_t, char *);
static size_t fill_runas_group(char *, size_t);static size_t fill_runas_group(char *, size_t, char *);
static size_t fill_hostname(char *, size_t);static size_t fill_hostname(char *, size_t, char *);
static size_t fill_command(char *, size_t);static size_t fill_command(char *, size_t, char *);
   
static struct path_escape escapes[] = {/* Note: "seq" must be first in the list. */
 static struct path_escape io_path_escapes[] = {
     { "seq", fill_seq },      { "seq", fill_seq },
     { "user", fill_user },      { "user", fill_user },
     { "group", fill_group },      { "group", fill_group },
Line 69  static struct path_escape escapes[] = { Line 70  static struct path_escape escapes[] = {
 };  };
   
 static size_t  static size_t
fill_seq(char *str, size_t strsize)fill_seq(char *str, size_t strsize, char *logdir)
 {  {
     static char sessid[7];      static char sessid[7];
     int len;      int len;
     debug_decl(sudoers_io_version, SUDO_DEBUG_UTIL)      debug_decl(sudoers_io_version, SUDO_DEBUG_UTIL)
   
     if (sessid[0] == '\0')      if (sessid[0] == '\0')
        io_nextid(def_iolog_dir, sessid);        io_nextid(logdir, def_iolog_dir, sessid);
   
     /* Path is of the form /var/log/sudo-io/00/00/01. */      /* Path is of the form /var/log/sudo-io/00/00/01. */
     len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0],      len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0],
Line 87  fill_seq(char *str, size_t strsize) Line 88  fill_seq(char *str, size_t strsize)
 }  }
   
 static size_t  static size_t
fill_user(char *str, size_t strsize)fill_user(char *str, size_t strsize, char *unused)
 {  {
     debug_decl(fill_user, SUDO_DEBUG_UTIL)      debug_decl(fill_user, SUDO_DEBUG_UTIL)
     debug_return_size_t(strlcpy(str, user_name, strsize));      debug_return_size_t(strlcpy(str, user_name, strsize));
 }  }
   
 static size_t  static size_t
fill_group(char *str, size_t strsize)fill_group(char *str, size_t strsize, char *unused)
 {  {
     struct group *grp;      struct group *grp;
     size_t len;      size_t len;
Line 102  fill_group(char *str, size_t strsize) Line 103  fill_group(char *str, size_t strsize)
   
     if ((grp = sudo_getgrgid(user_gid)) != NULL) {      if ((grp = sudo_getgrgid(user_gid)) != NULL) {
         len = strlcpy(str, grp->gr_name, strsize);          len = strlcpy(str, grp->gr_name, strsize);
        gr_delref(grp);        sudo_gr_delref(grp);
     } else {      } else {
         len = strlen(str);          len = strlen(str);
         len = snprintf(str + len, strsize - len, "#%u",          len = snprintf(str + len, strsize - len, "#%u",
Line 112  fill_group(char *str, size_t strsize) Line 113  fill_group(char *str, size_t strsize)
 }  }
   
 static size_t  static size_t
fill_runas_user(char *str, size_t strsize)fill_runas_user(char *str, size_t strsize, char *unused)
 {  {
     debug_decl(fill_runas_user, SUDO_DEBUG_UTIL)      debug_decl(fill_runas_user, SUDO_DEBUG_UTIL)
     debug_return_size_t(strlcpy(str, runas_pw->pw_name, strsize));      debug_return_size_t(strlcpy(str, runas_pw->pw_name, strsize));
 }  }
   
 static size_t  static size_t
fill_runas_group(char *str, size_t strsize)fill_runas_group(char *str, size_t strsize, char *unused)
 {  {
     struct group *grp;      struct group *grp;
     size_t len;      size_t len;
Line 130  fill_runas_group(char *str, size_t strsize) Line 131  fill_runas_group(char *str, size_t strsize)
     } else {      } else {
         if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) {          if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) {
             len = strlcpy(str, grp->gr_name, strsize);              len = strlcpy(str, grp->gr_name, strsize);
            gr_delref(grp);            sudo_gr_delref(grp);
         } else {          } else {
             len = strlen(str);              len = strlen(str);
             len = snprintf(str + len, strsize - len, "#%u",              len = snprintf(str + len, strsize - len, "#%u",
Line 141  fill_runas_group(char *str, size_t strsize) Line 142  fill_runas_group(char *str, size_t strsize)
 }  }
   
 static size_t  static size_t
fill_hostname(char *str, size_t strsize)fill_hostname(char *str, size_t strsize, char *unused)
 {  {
     debug_decl(fill_hostname, SUDO_DEBUG_UTIL)      debug_decl(fill_hostname, SUDO_DEBUG_UTIL)
     debug_return_size_t(strlcpy(str, user_shost, strsize));      debug_return_size_t(strlcpy(str, user_shost, strsize));
 }  }
   
 static size_t  static size_t
fill_command(char *str, size_t strsize)fill_command(char *str, size_t strsize, char *unused)
 {  {
     debug_decl(fill_command, SUDO_DEBUG_UTIL)      debug_decl(fill_command, SUDO_DEBUG_UTIL)
     debug_return_size_t(strlcpy(str, user_base, strsize));      debug_return_size_t(strlcpy(str, user_base, strsize));
Line 165  expand_iolog_path(const char *prefix, const char *dir, Line 166  expand_iolog_path(const char *prefix, const char *dir,
 {  {
     size_t len, prelen = 0;      size_t len, prelen = 0;
     char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX];      char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX];
       char *slash = NULL;
     const char *endbrace, *src = dir;      const char *endbrace, *src = dir;
       static struct path_escape *escapes;
     int pass;      int pass;
     bool strfit;      bool strfit;
     debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)      debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)
Line 193  expand_iolog_path(const char *prefix, const char *dir, Line 196  expand_iolog_path(const char *prefix, const char *dir,
         switch (pass) {          switch (pass) {
         case 0:          case 0:
             src = dir;              src = dir;
               escapes = io_path_escapes + 1; /* skip "${seq}" */
             break;              break;
         case 1:          case 1:
             /* Trim trailing slashes from dir component. */              /* Trim trailing slashes from dir component. */
             while (dst - path - 1 > prelen && dst[-1] == '/')              while (dst - path - 1 > prelen && dst[-1] == '/')
                 dst--;                  dst--;
            if (slashp)            /* The NUL will be replaced with a '/' at the end. */
                *slashp = dst;            if (dst + 1 >= pathend)
            src = "/";                goto bad;
            break;            slash = dst++;
             continue;
         case 2:          case 2:
             src = file;              src = file;
               escapes = io_path_escapes;
             break;              break;
         }          }
         dst0 = dst;          dst0 = dst;
Line 220  expand_iolog_path(const char *prefix, const char *dir, Line 226  expand_iolog_path(const char *prefix, const char *dir,
                                 break;                                  break;
                         }                          }
                         if (esc->name != NULL) {                          if (esc->name != NULL) {
                            len = esc->copy_fn(dst, (size_t)(pathend - dst));                            len = esc->copy_fn(dst, (size_t)(pathend - dst),
                                 path + prelen);
                             if (len >= (size_t)(pathend - dst))                              if (len >= (size_t)(pathend - dst))
                                 goto bad;                                  goto bad;
                             dst += len;                              dst += len;
Line 275  expand_iolog_path(const char *prefix, const char *dir, Line 282  expand_iolog_path(const char *prefix, const char *dir,
             *dst = '\0';              *dst = '\0';
         }          }
     }      }
       if (slashp)
           *slashp = slash;
       *slash = '/';
   
     debug_return_str(path);      debug_return_str(path);
 bad:  bad:

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


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