]> granicus.if.org Git - sudo/commitdiff
Move sessid out of sudo_user.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 11 Mar 2011 19:07:26 +0000 (14:07 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 11 Mar 2011 19:07:26 +0000 (14:07 -0500)
plugins/sudoers/iolog_path.c
plugins/sudoers/logging.c
plugins/sudoers/sudoers.h

index e98db947c7c2b2581b9a28b62eb93f2bca3e5e13..826f9fbdfcfe32589335c5bfefea9b8ef1bbfe45 100644 (file)
@@ -71,16 +71,15 @@ static struct path_escape escapes[] = {
 static size_t
 fill_seq(char *str, size_t strsize)
 {
+    static char sessid[7];
     int len;
 
-    /* XXX - sessid should be static to fill_seq */
-    if (sudo_user.sessid[0] == '\0')
-       io_nextid(def_iolog_dir, sudo_user.sessid);
+    if (sessid[0] == '\0')
+       io_nextid(def_iolog_dir, sessid);
 
     /* Path is of the form /var/log/sudo-io/00/00/01. */
-    len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sudo_user.sessid[0],
-       sudo_user.sessid[1], sudo_user.sessid[2], sudo_user.sessid[3],
-       sudo_user.sessid[4], sudo_user.sessid[5]);
+    len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0],
+       sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]);
     if (len < 0)
        return strsize; /* handle non-standard snprintf() */
     return (size_t)len;
index e14a6944a096eaac39c0094d7a640f461877d63d..e0f6577d56b6b64e45b485d3bd0733b6629d8cbe 100644 (file)
@@ -57,6 +57,7 @@
 #include <grp.h>
 #include <signal.h>
 #include <time.h>
+#include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <setjmp.h>
@@ -628,6 +629,14 @@ should_mail(int status)
 #define        LL_CMND_STR     "COMMAND="
 #define        LL_TSID_STR     "TSID="
 
+#define IS_SESSID(s) ( \
+    isalnum((unsigned char)(s)[0]) && isalnum((unsigned char)(s)[1]) && \
+    (s)[2] == '/' && \
+    isalnum((unsigned char)(s)[3]) && isalnum((unsigned char)(s)[4]) && \
+    (s)[5] == '/' && \
+    isalnum((unsigned char)(s)[6]) && isalnum((unsigned char)(s)[7]) && \
+    (s)[8] == '\0')
+
 /*
  * Allocate and fill in a new logline.
  */
@@ -637,11 +646,23 @@ new_logline(const char *message, int serrno)
     size_t len = 0;
     char *errstr = NULL;
     char *evstr = NULL;
-    char *line, *tsid;
+    char *line, sessid[7], *tsid = NULL;
 
     /* A TSID may be a sudoers-style session ID or a free-form string. */
-    tsid =
-       sudo_user.sessid[0] != '\0' ? sudo_user.sessid : sudo_user.iolog_file;
+    if (sudo_user.iolog_file != NULL) {
+       if (IS_SESSID(sudo_user.iolog_file)) {
+           sessid[0] = sudo_user.iolog_file[0];
+           sessid[1] = sudo_user.iolog_file[1];
+           sessid[2] = sudo_user.iolog_file[3];
+           sessid[3] = sudo_user.iolog_file[4];
+           sessid[4] = sudo_user.iolog_file[6];
+           sessid[5] = sudo_user.iolog_file[7];
+           sessid[6] = '\0';
+           tsid = sessid;
+       } else {
+           tsid = sudo_user.iolog_file;
+       }
+    }
 
     /*
      * Compute line length
index 62f742b892d4b0da6479cebe0c1ff12e7fc4e2b6..35beb15168f759a8acaa82a0fb814b17466dcfed 100644 (file)
@@ -74,7 +74,6 @@ struct sudo_user {
 #endif
     char *cwd;
     char *iolog_file;
-    char  sessid[7];
 #ifdef HAVE_MBR_CHECK_MEMBERSHIP
     uuid_t uuid;
 #endif