If no iolog file is specified by the policy plugin, use io_nextid()

to determine the next file in the sequence.
This commit is contained in:
Todd C. Miller
2010-12-29 11:07:45 -05:00
parent 3f6f61f852
commit 97b7ae8892
3 changed files with 46 additions and 24 deletions

View File

@@ -114,7 +114,7 @@ mkdir_parents(char *path)
* Uses file locking to avoid sequence number collisions. * Uses file locking to avoid sequence number collisions.
*/ */
void void
io_nextid(void) io_nextid(char *iolog_dir, char sessid[7])
{ {
struct stat sb; struct stat sb;
char buf[32], *ep; char buf[32], *ep;
@@ -127,19 +127,19 @@ io_nextid(void)
/* /*
* Create I/O log directory if it doesn't already exist. * Create I/O log directory if it doesn't already exist.
*/ */
mkdir_parents(def_iolog_dir); mkdir_parents(iolog_dir);
if (stat(def_iolog_dir, &sb) != 0) { if (stat(iolog_dir, &sb) != 0) {
if (mkdir(def_iolog_dir, S_IRWXU) != 0) if (mkdir(iolog_dir, S_IRWXU) != 0)
log_error(USE_ERRNO, "Can't mkdir %s", def_iolog_dir); log_error(USE_ERRNO, "Can't mkdir %s", iolog_dir);
} else if (!S_ISDIR(sb.st_mode)) { } else if (!S_ISDIR(sb.st_mode)) {
log_error(0, "%s exists but is not a directory (0%o)", log_error(0, "%s exists but is not a directory (0%o)",
def_iolog_dir, (unsigned int) sb.st_mode); iolog_dir, (unsigned int) sb.st_mode);
} }
/* /*
* Open sequence file * Open sequence file
*/ */
len = snprintf(pathbuf, sizeof(pathbuf), "%s/seq", def_iolog_dir); len = snprintf(pathbuf, sizeof(pathbuf), "%s/seq", iolog_dir);
if (len <= 0 || len >= sizeof(pathbuf)) { if (len <= 0 || len >= sizeof(pathbuf)) {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
log_error(USE_ERRNO, "%s/seq", pathbuf); log_error(USE_ERRNO, "%s/seq", pathbuf);
@@ -161,7 +161,7 @@ io_nextid(void)
id++; id++;
/* /*
* Convert id to a string and stash in sudo_user.sessid. * Convert id to a string and stash in sessid.
* Note that that least significant digits go at the end of the string. * Note that that least significant digits go at the end of the string.
*/ */
for (i = 5; i >= 0; i--) { for (i = 5; i >= 0; i--) {
@@ -172,8 +172,8 @@ io_nextid(void)
buf[6] = '\n'; buf[6] = '\n';
/* Stash id logging purposes */ /* Stash id logging purposes */
memcpy(sudo_user.sessid, buf, 6); memcpy(sessid, buf, 6);
sudo_user.sessid[6] = '\0'; sessid[6] = '\0';
/* Rewind and overwrite old seq file. */ /* Rewind and overwrite old seq file. */
if (lseek(fd, 0, SEEK_SET) == (off_t)-1 || write(fd, buf, 7) != 7) if (lseek(fd, 0, SEEK_SET) == (off_t)-1 || write(fd, buf, 7) != 7)
@@ -262,12 +262,13 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
char * const user_info[], char * const command_info[], char * const user_info[], char * const command_info[],
int argc, char * const argv[], char * const user_env[]) int argc, char * const argv[], char * const user_env[])
{ {
char pathbuf[PATH_MAX]; char pathbuf[PATH_MAX], sessid[9];
const char *iolog_dir = NULL, *iolog_file = NULL; char *tofree = NULL, *iolog_dir = NULL, *iolog_file = NULL;
char * const *cur; char * const *cur;
FILE *io_logfile; FILE *io_logfile;
int len, iolog_stdin = FALSE, iolog_stdout = FALSE, iolog_stderr = FALSE; int len, iolog_stdin = FALSE, iolog_stdout = FALSE, iolog_stderr = FALSE;
int iolog_ttyin = FALSE, iolog_ttyout = FALSE, iolog_compress = FALSE; int iolog_ttyin = FALSE, iolog_ttyout = FALSE, iolog_compress = FALSE;
int rval = -1;
if (!sudo_conv) if (!sudo_conv)
sudo_conv = conversation; sudo_conv = conversation;
@@ -280,7 +281,8 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
if (sigsetjmp(error_jmp, 1)) { if (sigsetjmp(error_jmp, 1)) {
/* called via error(), errorx() or log_error() */ /* called via error(), errorx() or log_error() */
return -1; rval = -1;
goto done;
} }
/* /*
@@ -330,17 +332,31 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
} }
/* Did policy module disable I/O logging? */ /* Did policy module disable I/O logging? */
if (!iolog_stdin && !iolog_ttyin && !iolog_stdout && !iolog_stderr && if (!iolog_stdin && !iolog_ttyin && !iolog_stdout && !iolog_stderr &&
!iolog_ttyout) !iolog_ttyout) {
return FALSE; rval = FALSE;
goto done;
}
/* If no I/O log file defined there is nothing to do. */ /* If no I/O log file defined we need to figure it out ourselves. */
if (iolog_file == NULL || iolog_dir == NULL) if (iolog_dir == NULL)
return FALSE; iolog_dir = tofree = estrdup(_PATH_SUDO_IO_LOGDIR);
if (iolog_file == NULL) {
/* Get next session ID and convert it into a path. */
io_nextid(iolog_dir, sessid);
sessid[8] = '\0';
sessid[7] = sessid[5];
sessid[6] = sessid[4];
sessid[5] = '/';
sessid[4] = sessid[3];
sessid[3] = sessid[2];
sessid[2] = '/';
iolog_file = sessid;
}
/* Build a path from I/O file and dir, creating intermediate subdirs. */ /* Build a path from I/O file and dir, creating intermediate subdirs. */
len = build_iopath(iolog_dir, iolog_file, pathbuf, sizeof(pathbuf)); len = build_iopath(iolog_dir, iolog_file, pathbuf, sizeof(pathbuf));
if (len < 0 || len >= sizeof(pathbuf)) if (len < 0 || len >= sizeof(pathbuf))
return -1; goto done;
/* /*
* We create 7 files: a log file, a timing file and 5 for input/output. * We create 7 files: a log file, a timing file and 5 for input/output.
@@ -400,7 +416,12 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
user_args ? user_args : ""); user_args ? user_args : "");
fclose(io_logfile); fclose(io_logfile);
return TRUE; rval = TRUE;
done:
efree(tofree);
return rval;
} }
static void static void

View File

@@ -510,11 +510,12 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
} }
if (ISSET(sudo_mode, (MODE_RUN | MODE_EDIT)) && (def_log_input || def_log_output)) { if (ISSET(sudo_mode, (MODE_RUN | MODE_EDIT)) && (def_log_input || def_log_output)) {
if (def_iolog_file) { if (def_iolog_file && def_iolog_dir) {
if (strstr(def_iolog_file, "%{seq}") != NULL) /* XXX - inline? */ if (strstr(def_iolog_file, "%{seq}") != NULL) /* XXX - inline? */
io_nextid(); io_nextid(def_iolog_dir, sudo_user.sessid);
command_info[info_len++] = expand_iolog_path("iolog_file=", def_iolog_file);
} }
if (def_iolog_file)
command_info[info_len++] = expand_iolog_path("iolog_file=", def_iolog_file);
if (def_iolog_dir) if (def_iolog_dir)
command_info[info_len++] = expand_iolog_path("iolog_dir=", def_iolog_dir); command_info[info_len++] = expand_iolog_path("iolog_dir=", def_iolog_dir);
if (def_log_input) { if (def_log_input) {

View File

@@ -283,7 +283,7 @@ int atobool(const char *str);
int get_boottime(struct timeval *); int get_boottime(struct timeval *);
/* iolog.c */ /* iolog.c */
void io_nextid(void); void io_nextid(char *iolog_dir, char sessid[7]);
/* iolog_path.c */ /* iolog_path.c */
char *expand_iolog_path(const char *prefix, const char *opath); char *expand_iolog_path(const char *prefix, const char *opath);