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

version 1.1.1.3, 2012/10/09 09:29:52 version 1.1.1.4, 2013/07/22 10:46:12
Line 1 Line 1
 /*  /*
 * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com> * Copyright (c) 2011-2013 Todd C. Miller <Todd.Miller@courtesan.com>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 35 Line 35
 #ifdef HAVE_STRINGS_H  #ifdef HAVE_STRINGS_H
 # include <strings.h>  # include <strings.h>
 #endif /* HAVE_STRINGS_H */  #endif /* HAVE_STRINGS_H */
 #ifdef HAVE_SETLOCALE  
 # include <locale.h>  
 #endif  
 #include <pwd.h>  #include <pwd.h>
 #include <grp.h>  #include <grp.h>
 #include <time.h>  #include <time.h>
Line 49  struct path_escape { Line 46  struct path_escape {
     size_t (*copy_fn)(char *, size_t, char *);      size_t (*copy_fn)(char *, size_t, char *);
 };  };
   
 static size_t fill_seq(char *, size_t, char *);  
 static size_t fill_user(char *, size_t, char *);  
 static size_t fill_group(char *, size_t, char *);  
 static size_t fill_runas_user(char *, size_t, char *);  
 static size_t fill_runas_group(char *, size_t, char *);  
 static size_t fill_hostname(char *, size_t, char *);  
 static size_t fill_command(char *, size_t, char *);  
   
 /* Note: "seq" must be first in the list. */  
 static struct path_escape io_path_escapes[] = {  
     { "seq", fill_seq },  
     { "user", fill_user },  
     { "group", fill_group },  
     { "runas_user", fill_runas_user },  
     { "runas_group", fill_runas_group },  
     { "hostname", fill_hostname },  
     { "command", fill_command },  
     { NULL, NULL }  
 };  
   
 static size_t  static size_t
 fill_seq(char *str, size_t strsize, char *logdir)  fill_seq(char *str, size_t strsize, char *logdir)
 {  {
   #ifdef SUDOERS_NO_SEQ
       debug_decl(fill_seq, SUDO_DEBUG_UTIL)
       debug_return_size_t(strlcpy(str, "%{seq}", strsize));
   #else
     static char sessid[7];      static char sessid[7];
     int len;      int len;
    debug_decl(sudoers_io_version, SUDO_DEBUG_UTIL)    debug_decl(fill_seq, SUDO_DEBUG_UTIL)
   
     if (sessid[0] == '\0')      if (sessid[0] == '\0')
         io_nextid(logdir, def_iolog_dir, sessid);          io_nextid(logdir, def_iolog_dir, sessid);
Line 85  fill_seq(char *str, size_t strsize, char *logdir) Line 66  fill_seq(char *str, size_t strsize, char *logdir)
     if (len < 0)      if (len < 0)
         debug_return_size_t(strsize); /* handle non-standard snprintf() */          debug_return_size_t(strsize); /* handle non-standard snprintf() */
     debug_return_size_t(len);      debug_return_size_t(len);
   #endif /* SUDOERS_NO_SEQ */
 }  }
   
 static size_t  static size_t
Line 155  fill_command(char *str, size_t strsize, char *unused) Line 137  fill_command(char *str, size_t strsize, char *unused)
     debug_return_size_t(strlcpy(str, user_base, strsize));      debug_return_size_t(strlcpy(str, user_base, strsize));
 }  }
   
   /* Note: "seq" must be first in the list. */
   static struct path_escape io_path_escapes[] = {
       { "seq", fill_seq },
       { "user", fill_user },
       { "group", fill_group },
       { "runas_user", fill_runas_user },
       { "runas_group", fill_runas_group },
       { "hostname", fill_hostname },
       { "command", fill_command },
       { NULL, NULL }
   };
   
 /*  /*
  * Concatenate dir + file, expanding any escape sequences.   * Concatenate dir + file, expanding any escape sequences.
  * Returns the concatenated path and sets slashp point to   * Returns the concatenated path and sets slashp point to
Line 168  expand_iolog_path(const char *prefix, const char *dir, Line 162  expand_iolog_path(const char *prefix, const char *dir,
     char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX];      char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX];
     char *slash = NULL;      char *slash = NULL;
     const char *endbrace, *src = dir;      const char *endbrace, *src = dir;
    static struct path_escape *escapes;    struct path_escape *escapes = NULL;
    int pass;    int pass, oldlocale;
     bool strfit;      bool strfit;
     debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)      debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)
   
Line 196  expand_iolog_path(const char *prefix, const char *dir, Line 190  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}" */            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. */
Line 258  expand_iolog_path(const char *prefix, const char *dir, Line 252  expand_iolog_path(const char *prefix, const char *dir,
             time(&now);              time(&now);
             timeptr = localtime(&now);              timeptr = localtime(&now);
   
#ifdef HAVE_SETLOCALE            /* Use sudoers locale for strftime() */
            if (!setlocale(LC_ALL, def_sudoers_locale)) {            sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
                warningx(_("unable to set locale to \"%s\", using \"C\""),
                    def_sudoers_locale); 
                setlocale(LC_ALL, "C"); 
            } 
#endif 
             /* We only calls strftime() on the current part of the buffer. */              /* We only calls strftime() on the current part of the buffer. */
             tmpbuf[sizeof(tmpbuf) - 1] = '\0';              tmpbuf[sizeof(tmpbuf) - 1] = '\0';
             len = strftime(tmpbuf, sizeof(tmpbuf), dst0, timeptr);              len = strftime(tmpbuf, sizeof(tmpbuf), dst0, timeptr);
   
#ifdef HAVE_SETLOCALE            /* Restore old locale. */
            setlocale(LC_ALL, "");            sudoers_setlocale(oldlocale, NULL);
#endif
             if (len == 0 || tmpbuf[sizeof(tmpbuf) - 1] != '\0')              if (len == 0 || tmpbuf[sizeof(tmpbuf) - 1] != '\0')
                 goto bad;               /* strftime() failed, buf too small? */                  goto bad;               /* strftime() failed, buf too small? */
   

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


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