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? */ |
|
|