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;
#include <grp.h>
#include <signal.h>
#include <time.h>
+#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <setjmp.h>
#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.
*/
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