dumpstate: add O_CLOEXEC
Add O_CLOEXEC to various file descriptor calls, to avoid leaking file descriptors to dumpstate's child processes. Bug: 18342188 Change-Id: I74c47a98dfddc29c618067ad53d879b98ed1d87a
This commit is contained in:
parent
ad36432de8
commit
cd67e9f059
@ -440,7 +440,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
/* set as high priority, and protect from OOM killer */
|
/* set as high priority, and protect from OOM killer */
|
||||||
setpriority(PRIO_PROCESS, 0, -20);
|
setpriority(PRIO_PROCESS, 0, -20);
|
||||||
FILE *oom_adj = fopen("/proc/self/oom_adj", "w");
|
FILE *oom_adj = fopen("/proc/self/oom_adj", "we");
|
||||||
if (oom_adj) {
|
if (oom_adj) {
|
||||||
fputs("-17", oom_adj);
|
fputs("-17", oom_adj);
|
||||||
fclose(oom_adj);
|
fclose(oom_adj);
|
||||||
@ -473,15 +473,14 @@ int main(int argc, char *argv[]) {
|
|||||||
/* open the vibrator before dropping root */
|
/* open the vibrator before dropping root */
|
||||||
FILE *vibrator = 0;
|
FILE *vibrator = 0;
|
||||||
if (do_vibrate) {
|
if (do_vibrate) {
|
||||||
vibrator = fopen("/sys/class/timed_output/vibrator/enable", "w");
|
vibrator = fopen("/sys/class/timed_output/vibrator/enable", "we");
|
||||||
if (vibrator) {
|
if (vibrator) {
|
||||||
fcntl(fileno(vibrator), F_SETFD, FD_CLOEXEC);
|
|
||||||
vibrate(vibrator, 150);
|
vibrate(vibrator, 150);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read /proc/cmdline before dropping root */
|
/* read /proc/cmdline before dropping root */
|
||||||
FILE *cmdline = fopen("/proc/cmdline", "r");
|
FILE *cmdline = fopen("/proc/cmdline", "re");
|
||||||
if (cmdline != NULL) {
|
if (cmdline != NULL) {
|
||||||
fgets(cmdline_buf, sizeof(cmdline_buf), cmdline);
|
fgets(cmdline_buf, sizeof(cmdline_buf), cmdline);
|
||||||
fclose(cmdline);
|
fclose(cmdline);
|
||||||
|
@ -104,7 +104,7 @@ static void __for_each_pid(void (*helper)(int, const char *, void *), const char
|
|||||||
|
|
||||||
sprintf(cmdpath,"/proc/%d/cmdline", pid);
|
sprintf(cmdpath,"/proc/%d/cmdline", pid);
|
||||||
memset(cmdline, 0, sizeof(cmdline));
|
memset(cmdline, 0, sizeof(cmdline));
|
||||||
if ((fd = TEMP_FAILURE_RETRY(open(cmdpath, O_RDONLY))) < 0) {
|
if ((fd = TEMP_FAILURE_RETRY(open(cmdpath, O_RDONLY | O_CLOEXEC))) < 0) {
|
||||||
strcpy(cmdline, "N/A");
|
strcpy(cmdline, "N/A");
|
||||||
} else {
|
} else {
|
||||||
read(fd, cmdline, sizeof(cmdline) - 1);
|
read(fd, cmdline, sizeof(cmdline) - 1);
|
||||||
@ -155,7 +155,7 @@ static void for_each_tid_helper(int pid, const char *cmdline, void *arg) {
|
|||||||
|
|
||||||
sprintf(commpath,"/proc/%d/comm", tid);
|
sprintf(commpath,"/proc/%d/comm", tid);
|
||||||
memset(comm, 0, sizeof(comm));
|
memset(comm, 0, sizeof(comm));
|
||||||
if ((fd = TEMP_FAILURE_RETRY(open(commpath, O_RDONLY))) < 0) {
|
if ((fd = TEMP_FAILURE_RETRY(open(commpath, O_RDONLY | O_CLOEXEC))) < 0) {
|
||||||
strcpy(comm, "N/A");
|
strcpy(comm, "N/A");
|
||||||
} else {
|
} else {
|
||||||
char *c;
|
char *c;
|
||||||
@ -186,7 +186,7 @@ void show_wchan(int pid, int tid, const char *name) {
|
|||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
|
|
||||||
sprintf(path, "/proc/%d/wchan", tid);
|
sprintf(path, "/proc/%d/wchan", tid);
|
||||||
if ((fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY))) < 0) {
|
if ((fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_CLOEXEC))) < 0) {
|
||||||
printf("Failed to open '%s' (%s)\n", path, strerror(errno));
|
printf("Failed to open '%s' (%s)\n", path, strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -499,6 +499,7 @@ void redirect_to_socket(FILE *redirect, const char *service) {
|
|||||||
fprintf(stderr, "android_get_control_socket(%s): %s\n", service, strerror(errno));
|
fprintf(stderr, "android_get_control_socket(%s): %s\n", service, strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
fcntl(s, F_SETFD, FD_CLOEXEC);
|
||||||
if (listen(s, 4) < 0) {
|
if (listen(s, 4) < 0) {
|
||||||
fprintf(stderr, "listen(control socket): %s\n", strerror(errno));
|
fprintf(stderr, "listen(control socket): %s\n", strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -535,7 +536,7 @@ void redirect_to_file(FILE *redirect, char *path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = TEMP_FAILURE_RETRY(open(path, O_WRONLY | O_CREAT | O_TRUNC,
|
int fd = TEMP_FAILURE_RETRY(open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC,
|
||||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
|
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stderr, "%s: %s\n", path, strerror(errno));
|
fprintf(stderr, "%s: %s\n", path, strerror(errno));
|
||||||
@ -591,7 +592,7 @@ const char *dump_traces() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* create a new, empty traces.txt file to receive stack dumps */
|
/* create a new, empty traces.txt file to receive stack dumps */
|
||||||
int fd = TEMP_FAILURE_RETRY(open(traces_path, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW,
|
int fd = TEMP_FAILURE_RETRY(open(traces_path, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW | O_CLOEXEC,
|
||||||
0666)); /* -rw-rw-rw- */
|
0666)); /* -rw-rw-rw- */
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stderr, "%s: %s\n", traces_path, strerror(errno));
|
fprintf(stderr, "%s: %s\n", traces_path, strerror(errno));
|
||||||
@ -642,7 +643,7 @@ const char *dump_traces() {
|
|||||||
if (!strncmp(data, "/system/bin/app_process", strlen("/system/bin/app_process"))) {
|
if (!strncmp(data, "/system/bin/app_process", strlen("/system/bin/app_process"))) {
|
||||||
/* skip zygote -- it won't dump its stack anyway */
|
/* skip zygote -- it won't dump its stack anyway */
|
||||||
snprintf(path, sizeof(path), "/proc/%d/cmdline", pid);
|
snprintf(path, sizeof(path), "/proc/%d/cmdline", pid);
|
||||||
int cfd = TEMP_FAILURE_RETRY(open(path, O_RDONLY));
|
int cfd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_CLOEXEC));
|
||||||
len = read(cfd, data, sizeof(data) - 1);
|
len = read(cfd, data, sizeof(data) - 1);
|
||||||
close(cfd);
|
close(cfd);
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
@ -727,7 +728,7 @@ error_close_fd:
|
|||||||
void dump_route_tables() {
|
void dump_route_tables() {
|
||||||
const char* const RT_TABLES_PATH = "/data/misc/net/rt_tables";
|
const char* const RT_TABLES_PATH = "/data/misc/net/rt_tables";
|
||||||
dump_file("RT_TABLES", RT_TABLES_PATH);
|
dump_file("RT_TABLES", RT_TABLES_PATH);
|
||||||
FILE* fp = fopen(RT_TABLES_PATH, "r");
|
FILE* fp = fopen(RT_TABLES_PATH, "re");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
printf("*** %s: %s\n", RT_TABLES_PATH, strerror(errno));
|
printf("*** %s: %s\n", RT_TABLES_PATH, strerror(errno));
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user