version 1.1, 2012/02/21 16:23:02
|
version 1.1.1.3, 2012/10/09 09:29:52
|
Line 46
|
Line 46
|
|
|
struct path_escape { |
struct path_escape { |
const char *name; |
const char *name; |
size_t (*copy_fn)(char *, size_t); | size_t (*copy_fn)(char *, size_t, char *); |
}; |
}; |
|
|
static size_t fill_seq(char *, size_t); | static size_t fill_seq(char *, size_t, char *); |
static size_t fill_user(char *, size_t); | static size_t fill_user(char *, size_t, char *); |
static size_t fill_group(char *, size_t); | static size_t fill_group(char *, size_t, char *); |
static size_t fill_runas_user(char *, size_t); | static size_t fill_runas_user(char *, size_t, char *); |
static size_t fill_runas_group(char *, size_t); | static size_t fill_runas_group(char *, size_t, char *); |
static size_t fill_hostname(char *, size_t); | static size_t fill_hostname(char *, size_t, char *); |
static size_t fill_command(char *, size_t); | static size_t fill_command(char *, size_t, char *); |
|
|
static struct path_escape escapes[] = { | /* Note: "seq" must be first in the list. */ |
| static struct path_escape io_path_escapes[] = { |
{ "seq", fill_seq }, |
{ "seq", fill_seq }, |
{ "user", fill_user }, |
{ "user", fill_user }, |
{ "group", fill_group }, |
{ "group", fill_group }, |
Line 69 static struct path_escape escapes[] = {
|
Line 70 static struct path_escape escapes[] = {
|
}; |
}; |
|
|
static size_t |
static size_t |
fill_seq(char *str, size_t strsize) | fill_seq(char *str, size_t strsize, char *logdir) |
{ |
{ |
static char sessid[7]; |
static char sessid[7]; |
int len; |
int len; |
|
debug_decl(sudoers_io_version, SUDO_DEBUG_UTIL) |
|
|
if (sessid[0] == '\0') |
if (sessid[0] == '\0') |
io_nextid(def_iolog_dir, sessid); | io_nextid(logdir, def_iolog_dir, sessid); |
|
|
/* Path is of the form /var/log/sudo-io/00/00/01. */ |
/* Path is of the form /var/log/sudo-io/00/00/01. */ |
len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0], |
len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0], |
sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]); |
sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]); |
if (len < 0) |
if (len < 0) |
return strsize; /* handle non-standard snprintf() */ | debug_return_size_t(strsize); /* handle non-standard snprintf() */ |
return (size_t)len; | debug_return_size_t(len); |
} |
} |
|
|
static size_t |
static size_t |
fill_user(char *str, size_t strsize) | fill_user(char *str, size_t strsize, char *unused) |
{ |
{ |
return strlcpy(str, user_name, strsize); | debug_decl(fill_user, SUDO_DEBUG_UTIL) |
| debug_return_size_t(strlcpy(str, user_name, strsize)); |
} |
} |
|
|
static size_t |
static size_t |
fill_group(char *str, size_t strsize) | fill_group(char *str, size_t strsize, char *unused) |
{ |
{ |
struct group *grp; |
struct group *grp; |
size_t len; |
size_t len; |
|
debug_decl(fill_group, SUDO_DEBUG_UTIL) |
|
|
if ((grp = sudo_getgrgid(user_gid)) != NULL) { |
if ((grp = sudo_getgrgid(user_gid)) != NULL) { |
len = strlcpy(str, grp->gr_name, strsize); |
len = strlcpy(str, grp->gr_name, strsize); |
gr_delref(grp); | sudo_gr_delref(grp); |
} else { |
} else { |
len = strlen(str); |
len = strlen(str); |
len = snprintf(str + len, strsize - len, "#%u", |
len = snprintf(str + len, strsize - len, "#%u", |
(unsigned int) user_gid); |
(unsigned int) user_gid); |
} |
} |
return len; | debug_return_size_t(len); |
} |
} |
|
|
static size_t |
static size_t |
fill_runas_user(char *str, size_t strsize) | fill_runas_user(char *str, size_t strsize, char *unused) |
{ |
{ |
return strlcpy(str, runas_pw->pw_name, strsize); | debug_decl(fill_runas_user, SUDO_DEBUG_UTIL) |
| debug_return_size_t(strlcpy(str, runas_pw->pw_name, strsize)); |
} |
} |
|
|
static size_t |
static size_t |
fill_runas_group(char *str, size_t strsize) | fill_runas_group(char *str, size_t strsize, char *unused) |
{ |
{ |
struct group *grp; |
struct group *grp; |
size_t len; |
size_t len; |
|
debug_decl(fill_runas_group, SUDO_DEBUG_UTIL) |
|
|
if (runas_gr != NULL) { |
if (runas_gr != NULL) { |
len = strlcpy(str, runas_gr->gr_name, strsize); |
len = strlcpy(str, runas_gr->gr_name, strsize); |
} else { |
} else { |
if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) { |
if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) { |
len = strlcpy(str, grp->gr_name, strsize); |
len = strlcpy(str, grp->gr_name, strsize); |
gr_delref(grp); | sudo_gr_delref(grp); |
} else { |
} else { |
len = strlen(str); |
len = strlen(str); |
len = snprintf(str + len, strsize - len, "#%u", |
len = snprintf(str + len, strsize - len, "#%u", |
(unsigned int) runas_pw->pw_gid); |
(unsigned int) runas_pw->pw_gid); |
} |
} |
} |
} |
return len; | debug_return_size_t(len); |
} |
} |
|
|
static size_t |
static size_t |
fill_hostname(char *str, size_t strsize) | fill_hostname(char *str, size_t strsize, char *unused) |
{ |
{ |
return strlcpy(str, user_shost, strsize); | debug_decl(fill_hostname, SUDO_DEBUG_UTIL) |
| debug_return_size_t(strlcpy(str, user_shost, strsize)); |
} |
} |
|
|
static size_t |
static size_t |
fill_command(char *str, size_t strsize) | fill_command(char *str, size_t strsize, char *unused) |
{ |
{ |
return strlcpy(str, user_base, strsize); | debug_decl(fill_command, SUDO_DEBUG_UTIL) |
| debug_return_size_t(strlcpy(str, user_base, strsize)); |
} |
} |
|
|
/* |
/* |
Line 158 expand_iolog_path(const char *prefix, const char *dir,
|
Line 166 expand_iolog_path(const char *prefix, const char *dir,
|
{ |
{ |
size_t len, prelen = 0; |
size_t len, prelen = 0; |
char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX]; |
char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX]; |
|
char *slash = NULL; |
const char *endbrace, *src = dir; |
const char *endbrace, *src = dir; |
int pass, strfit; | static struct path_escape *escapes; |
| int pass; |
| bool strfit; |
| debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL) |
|
|
/* Expanded path must be <= PATH_MAX */ |
/* Expanded path must be <= PATH_MAX */ |
if (prefix != NULL) |
if (prefix != NULL) |
Line 180 expand_iolog_path(const char *prefix, const char *dir,
|
Line 192 expand_iolog_path(const char *prefix, const char *dir,
|
file++; |
file++; |
|
|
for (pass = 0; pass < 3; pass++) { |
for (pass = 0; pass < 3; pass++) { |
strfit = FALSE; | strfit = false; |
switch (pass) { |
switch (pass) { |
case 0: |
case 0: |
src = dir; |
src = dir; |
|
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. */ |
while (dst - path - 1 > prelen && dst[-1] == '/') |
while (dst - path - 1 > prelen && dst[-1] == '/') |
dst--; |
dst--; |
if (slashp) | /* The NUL will be replaced with a '/' at the end. */ |
*slashp = dst; | if (dst + 1 >= pathend) |
src = "/"; | goto bad; |
break; | slash = dst++; |
| continue; |
case 2: |
case 2: |
src = file; |
src = file; |
|
escapes = io_path_escapes; |
break; |
break; |
} |
} |
dst0 = dst; |
dst0 = dst; |
Line 211 expand_iolog_path(const char *prefix, const char *dir,
|
Line 226 expand_iolog_path(const char *prefix, const char *dir,
|
break; |
break; |
} |
} |
if (esc->name != NULL) { |
if (esc->name != NULL) { |
len = esc->copy_fn(dst, (size_t)(pathend - dst)); | len = esc->copy_fn(dst, (size_t)(pathend - dst), |
| path + prelen); |
if (len >= (size_t)(pathend - dst)) |
if (len >= (size_t)(pathend - dst)) |
goto bad; |
goto bad; |
dst += len; |
dst += len; |
Line 266 expand_iolog_path(const char *prefix, const char *dir,
|
Line 282 expand_iolog_path(const char *prefix, const char *dir,
|
*dst = '\0'; |
*dst = '\0'; |
} |
} |
} |
} |
|
if (slashp) |
|
*slashp = slash; |
|
*slash = '/'; |
|
|
return path; | debug_return_str(path); |
bad: |
bad: |
efree(path); |
efree(path); |
return NULL; | debug_return_str(NULL); |
} |
} |