summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Christopher Ferris <cferris@google.com> 2015-11-12 14:01:56 -0800
committer Christopher Ferris <cferris@google.com> 2015-11-16 14:17:08 -0800
commited24d2ae2cd6e8b0afb86efa555f18bcfaf74a64 (patch)
treebfb0a943770f19293b356855ee6daa1a00ce5123
parent74ee857d166f0696fe94628bbce391641343c418 (diff)
Fix a few bugs related to dumping files.
Fixes: - Fix double print of header in dump_file. - Fix a few possible file descriptor leaks. - Add /d/ as another directory which should be skipped when printing out last mod time of a file. - Fix possible crash if the path passed to _dump_file_from_fd is less than the length of one of the directory checks. Change-Id: I450dfab76fd0ce4d4dca9ed39c82a980054f3cc3
-rw-r--r--cmds/dumpstate/dumpstate.h5
-rw-r--r--cmds/dumpstate/utils.cpp18
2 files changed, 14 insertions, 9 deletions
diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h
index f9f20d2c33..25ae4534f7 100644
--- a/cmds/dumpstate/dumpstate.h
+++ b/cmds/dumpstate/dumpstate.h
@@ -23,9 +23,10 @@
#ifdef _DUMPSTATE_DRY_RUN_
#define ON_DRY_RUN_RETURN(X) return X
-#endif
-#ifndef _DUMPSTATE_DRY_RUN_
+#define ON_DRY_RUN(code) code
+#else
#define ON_DRY_RUN_RETURN(X)
+#define ON_DRY_RUN(code)
#endif
diff --git a/cmds/dumpstate/utils.cpp b/cmds/dumpstate/utils.cpp
index 2ebd39ff14..585242ea36 100644
--- a/cmds/dumpstate/utils.cpp
+++ b/cmds/dumpstate/utils.cpp
@@ -247,11 +247,16 @@ void do_showmap(int pid, const char *name) {
}
static int _dump_file_from_fd(const char *title, const char *path, int fd) {
- if (title) printf("------ %s (%s", title, path);
-
if (title) {
+ printf("------ %s (%s", title, path);
+
struct stat st;
- if (memcmp(path, "/proc/", 6) && memcmp(path, "/sys/", 5) && !fstat(fd, &st)) {
+ // Only show the modification time of non-device files.
+ size_t path_len = strlen(path);
+ if ((path_len < 6 || memcmp(path, "/proc/", 6)) &&
+ (path_len < 5 || memcmp(path, "/sys/", 5)) &&
+ (path_len < 3 || memcmp(path, "/d/", 3)) &&
+ !fstat(fd, &st)) {
char stamp[80];
time_t mtime = st.st_mtime;
strftime(stamp, sizeof(stamp), "%Y-%m-%d %H:%M:%S", localtime(&mtime));
@@ -259,6 +264,7 @@ static int _dump_file_from_fd(const char *title, const char *path, int fd) {
}
printf(") ------\n");
}
+ ON_DRY_RUN({ close(fd); return 0; });
bool newline = false;
fd_set read_set;
@@ -305,9 +311,6 @@ static int _dump_file_from_fd(const char *title, const char *path, int fd) {
/* prints the contents of a file */
int dump_file(const char *title, const char *path) {
- if (title) printf("------ %s (%s) ------\n", title, path);
- ON_DRY_RUN_RETURN(0);
-
int fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_NONBLOCK | O_CLOEXEC));
if (fd < 0) {
int err = errno;
@@ -393,13 +396,14 @@ int dump_files(const char *title, const char *dir,
* stuck.
*/
int dump_file_from_fd(const char *title, const char *path, int fd) {
- ON_DRY_RUN_RETURN(0);
int flags = fcntl(fd, F_GETFL);
if (flags == -1) {
printf("*** %s: failed to get flags on fd %d: %s\n", path, fd, strerror(errno));
+ close(fd);
return -1;
} else if (!(flags & O_NONBLOCK)) {
printf("*** %s: fd must have O_NONBLOCK set.\n", path);
+ close(fd);
return -1;
}
return _dump_file_from_fd(title, path, fd);