sprinkle some debug printfs and add function header comments

This commit is contained in:
Todd C. Miller
2014-01-31 15:28:41 -07:00
parent d7257a63e7
commit 32b4713d6d

View File

@@ -65,6 +65,9 @@ static char timestamp_file[PATH_MAX];
static off_t timestamp_hint = (off_t)-1; static off_t timestamp_hint = (off_t)-1;
static struct timestamp_entry timestamp_key; static struct timestamp_entry timestamp_key;
/*
* Returns true if entry matches key, else false.
*/
static bool static bool
ts_match_record(struct timestamp_entry *key, struct timestamp_entry *entry) ts_match_record(struct timestamp_entry *key, struct timestamp_entry *entry)
{ {
@@ -96,6 +99,14 @@ ts_match_record(struct timestamp_entry *key, struct timestamp_entry *entry)
debug_return_bool(true); debug_return_bool(true);
} }
/*
* Searches the time stamp file descriptor for a record that matches key.
* On success, fills in entry with the matching record and returns true.
* On failure, returns false.
*
* Note that records are searched starting at the current file offset,
* which may not be the beginning of the file.
*/
static bool static bool
ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entry) ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entry)
{ {
@@ -109,6 +120,9 @@ ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entr
while (read(fd, &cur, sizeof(cur)) == sizeof(cur)) { while (read(fd, &cur, sizeof(cur)) == sizeof(cur)) {
if (cur.size != sizeof(cur)) { if (cur.size != sizeof(cur)) {
/* wrong size, seek to next record */ /* wrong size, seek to next record */
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
"wrong sized record, got %hu, expected %zu",
cur.size, sizeof(cur));
lseek(fd, (off_t)cur.size - (off_t)sizeof(cur), SEEK_CUR); lseek(fd, (off_t)cur.size - (off_t)sizeof(cur), SEEK_CUR);
continue; continue;
} }
@@ -120,7 +134,10 @@ ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entr
debug_return_bool(false); debug_return_bool(false);
} }
/* Find matching record to update or append a new one. */ /*
* Find matching record to update or append a new one.
* Returns true if the entry was written successfully, else false.
*/
static bool static bool
ts_update_record(int fd, struct timestamp_entry *entry, off_t timestamp_hint) ts_update_record(int fd, struct timestamp_entry *entry, off_t timestamp_hint)
{ {
@@ -134,6 +151,8 @@ ts_update_record(int fd, struct timestamp_entry *entry, off_t timestamp_hint)
if (lseek(fd, timestamp_hint, SEEK_SET) != -1) { if (lseek(fd, timestamp_hint, SEEK_SET) != -1) {
if (read(fd, &cur, sizeof(cur)) == sizeof(cur)) { if (read(fd, &cur, sizeof(cur)) == sizeof(cur)) {
if (ts_match_record(entry, &cur)) { if (ts_match_record(entry, &cur)) {
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"found existing time stamp record using hint");
goto found_it; goto found_it;
} }
} }
@@ -141,12 +160,18 @@ ts_update_record(int fd, struct timestamp_entry *entry, off_t timestamp_hint)
} }
/* Search for matching record. */ /* Search for matching record. */
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"searching for time stamp record");
lseek(fd, (off_t)0, SEEK_SET); lseek(fd, (off_t)0, SEEK_SET);
if (ts_find_record(fd, entry, &cur)) { if (ts_find_record(fd, entry, &cur)) {
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"found existing time stamp record");
found_it: found_it:
/* back up over old record */ /* back up over old record */
lseek(fd, (off_t)0 - (off_t)cur.size, SEEK_CUR); lseek(fd, (off_t)0 - (off_t)cur.size, SEEK_CUR);
} else { } else {
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"appending new time stamp record");
old_eof = lseek(fd, (off_t)0, SEEK_CUR); old_eof = lseek(fd, (off_t)0, SEEK_CUR);
} }
@@ -157,6 +182,8 @@ found_it:
/* Truncate on partial write to be safe. */ /* Truncate on partial write to be safe. */
if (nwritten > 0 && old_eof != (off_t)-1) { if (nwritten > 0 && old_eof != (off_t)-1) {
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"short write, truncating partial time stamp record");
if (ftruncate(fd, old_eof) != 0) { if (ftruncate(fd, old_eof) != 0) {
warning(N_("unable to truncate time stamp file to %lld bytes"), warning(N_("unable to truncate time stamp file to %lld bytes"),
old_eof); old_eof);
@@ -166,7 +193,12 @@ found_it:
debug_return_bool(false); debug_return_bool(false);
} }
/* XXX - somewhat duplicated in io_mkdirs */ /*
* Create a directory and any missing parent directories with the
* specified mode.
* Returns true on success.
* Returns false on failure and displays a warning to stderr.
*/
static bool static bool
ts_mkdirs(char *path, mode_t mode) ts_mkdirs(char *path, mode_t mode)
{ {
@@ -179,6 +211,8 @@ ts_mkdirs(char *path, mode_t mode)
while ((slash = strchr(slash + 1, '/')) != NULL) { while ((slash = strchr(slash + 1, '/')) != NULL) {
*slash = '\0'; *slash = '\0';
if (stat(path, &sb) != 0) { if (stat(path, &sb) != 0) {
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"mkdir %s, mode 0%o", path, mode);
if (mkdir(path, mode) != 0) { if (mkdir(path, mode) != 0) {
warning(N_("unable to mkdir %s"), path); warning(N_("unable to mkdir %s"), path);
goto done; goto done;
@@ -195,6 +229,8 @@ ts_mkdirs(char *path, mode_t mode)
*slash = '/'; *slash = '/';
} }
/* Create final path component. */ /* Create final path component. */
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"mkdir %s, mode 0%o", path, mode);
if (mkdir(path, mode) != 0 && errno != EEXIST) { if (mkdir(path, mode) != 0 && errno != EEXIST) {
warning(N_("unable to mkdir %s"), path); warning(N_("unable to mkdir %s"), path);
goto done; goto done;
@@ -205,6 +241,12 @@ done:
debug_return_bool(rval); debug_return_bool(rval);
} }
/*
* Check that path is owned by timestamp_uid and not writable by
* group or other. If path is missing and make_it is true, create
* the directory and its parent dirs.
* Returns true on success or false on failure, setting errno.
*/
static bool static bool
ts_secure_dir(char *path, bool make_it) ts_secure_dir(char *path, bool make_it)
{ {
@@ -243,7 +285,8 @@ ts_secure_dir(char *path, bool make_it)
} }
/* /*
* Fills in timestamp_file[]. * Fills in the timestamp_file[] global variable.
* Returns the length of timestamp_file.
*/ */
int int
build_timestamp(struct passwd *pw) build_timestamp(struct passwd *pw)
@@ -263,6 +306,7 @@ build_timestamp(struct passwd *pw)
/* /*
* Update the time on the timestamp file/dir or create it if necessary. * Update the time on the timestamp file/dir or create it if necessary.
* Returns true on success or false on failure.
*/ */
bool bool
update_timestamp(struct passwd *pw) update_timestamp(struct passwd *pw)
@@ -305,6 +349,7 @@ done:
/* /*
* Check the timestamp file and directory and return their status. * Check the timestamp file and directory and return their status.
* Returns one of TS_CURRENT, TS_OLD, TS_MISSING, TS_NOFILE, TS_ERROR.
*/ */
int int
timestamp_status(struct passwd *pw) timestamp_status(struct passwd *pw)
@@ -445,7 +490,7 @@ done:
} }
/* /*
* Remove the timestamp entry or file. * Remove the timestamp entry or file if unlink_it is set.
*/ */
void void
remove_timestamp(bool unlink_it) remove_timestamp(bool unlink_it)
@@ -539,6 +584,7 @@ already_lectured(int unused)
/* /*
* Create the lecture status file. * Create the lecture status file.
* Returns true on success or false on failure.
*/ */
bool bool
set_lectured(void) set_lectured(void)