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

version 1.1.1.1, 2012/02/21 16:23:02 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)
   
     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],
         sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]);          sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]);
     if (len < 0)      if (len < 0)
        return strsize;        /* handle non-standard snprintf() */        debug_return_size_t(strsize); /* handle non-standard snprintf() */
    return (size_t)len;    debug_return_size_t(len);
 }  }
   
 static size_t  static size_t
fill_user(char *str, size_t strsize)fill_user(char *str, size_t strsize, char *unused)
 {  {
    return strlcpy(str, user_name, strsize);    debug_decl(fill_user, SUDO_DEBUG_UTIL)
     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;
       debug_decl(fill_group, SUDO_DEBUG_UTIL)
   
     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",
             (unsigned int) user_gid);              (unsigned int) user_gid);
     }      }
    return len;    debug_return_size_t(len);
 }  }
   
 static size_t  static size_t
fill_runas_user(char *str, size_t strsize)fill_runas_user(char *str, size_t strsize, char *unused)
 {  {
    return strlcpy(str, runas_pw->pw_name, strsize);    debug_decl(fill_runas_user, SUDO_DEBUG_UTIL)
     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;
       debug_decl(fill_runas_group, SUDO_DEBUG_UTIL)
   
     if (runas_gr != NULL) {      if (runas_gr != NULL) {
         len = strlcpy(str, runas_gr->gr_name, strsize);          len = strlcpy(str, runas_gr->gr_name, 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",
                 (unsigned int) runas_pw->pw_gid);                  (unsigned int) runas_pw->pw_gid);
         }          }
     }      }
    return len;    debug_return_size_t(len);
 }  }
   
 static size_t  static size_t
fill_hostname(char *str, size_t strsize)fill_hostname(char *str, size_t strsize, char *unused)
 {  {
    return strlcpy(str, user_shost, strsize);    debug_decl(fill_hostname, SUDO_DEBUG_UTIL)
     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)
 {  {
    return strlcpy(str, user_base, strsize);    debug_decl(fill_command, SUDO_DEBUG_UTIL)
     debug_return_size_t(strlcpy(str, user_base, strsize));
 }  }
   
 /*  /*
Line 158  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;
    int pass, strfit;    static struct path_escape *escapes;
     int pass;
     bool strfit;
     debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)
   
     /* Expanded path must be <= PATH_MAX */      /* Expanded path must be <= PATH_MAX */
     if (prefix != NULL)      if (prefix != NULL)
Line 180  expand_iolog_path(const char *prefix, const char *dir, Line 192  expand_iolog_path(const char *prefix, const char *dir,
         file++;          file++;
   
     for (pass = 0; pass < 3; pass++) {      for (pass = 0; pass < 3; pass++) {
        strfit = FALSE;        strfit = false;
         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 211  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 266  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 = '/';
   
    return path;    debug_return_str(path);
 bad:  bad:
     efree(path);      efree(path);
    return NULL;    debug_return_str(NULL);
 }  }

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


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