diff options
author | Elliott Hughes | 2018-06-13 12:33:45 -0500 |
---|---|---|
committer | Elliott Hughes | 2018-06-13 12:34:43 -0500 |
commit | cef62b4014cd7df825a13ce115074eda427ca3b5 (patch) | |
tree | b3f09ad8636256c6d0159e13c97d60abf32c2b14 /logd/main.cpp | |
parent | 7222199281b824fbe08f216860d2cd5153d33d11 (diff) | |
download | platform-system-core-cef62b4014cd7df825a13ce115074eda427ca3b5.tar.gz platform-system-core-cef62b4014cd7df825a13ce115074eda427ca3b5.tar.xz platform-system-core-cef62b4014cd7df825a13ce115074eda427ca3b5.zip |
logd: make behavior more consistent across builds.
Bug: 110127913
Test: boots
Change-Id: I0c1efacfb5ac0407e896ddde0bcc63927edc0525
Diffstat (limited to 'logd/main.cpp')
-rw-r--r-- | logd/main.cpp | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/logd/main.cpp b/logd/main.cpp index 5a588bea8..b697d44d7 100644 --- a/logd/main.cpp +++ b/logd/main.cpp | |||
@@ -87,30 +87,25 @@ | |||
87 | // | 87 | // |
88 | 88 | ||
89 | static int drop_privs(bool klogd, bool auditd) { | 89 | static int drop_privs(bool klogd, bool auditd) { |
90 | // Tricky, if ro.build.type is "eng" then this is true because of the | 90 | sched_param param = {}; |
91 | // side effect that ro.debuggable == 1 as well, else it is false. | ||
92 | bool eng = | ||
93 | __android_logger_property_get_bool("ro.build.type", BOOL_DEFAULT_FALSE); | ||
94 | |||
95 | struct sched_param param; | ||
96 | memset(¶m, 0, sizeof(param)); | ||
97 | 91 | ||
98 | if (set_sched_policy(0, SP_BACKGROUND) < 0) { | 92 | if (set_sched_policy(0, SP_BACKGROUND) < 0) { |
99 | android::prdebug("failed to set background scheduling policy"); | 93 | android::prdebug("failed to set background scheduling policy"); |
100 | if (!eng) return -1; | 94 | return -1; |
101 | } | 95 | } |
102 | 96 | ||
103 | if (sched_setscheduler((pid_t)0, SCHED_BATCH, ¶m) < 0) { | 97 | if (sched_setscheduler((pid_t)0, SCHED_BATCH, ¶m) < 0) { |
104 | android::prdebug("failed to set batch scheduler"); | 98 | android::prdebug("failed to set batch scheduler"); |
105 | if (!eng) return -1; | 99 | return -1; |
106 | } | 100 | } |
107 | 101 | ||
108 | if (setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_BACKGROUND) < 0) { | 102 | if (setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_BACKGROUND) < 0) { |
109 | android::prdebug("failed to set background cgroup"); | 103 | android::prdebug("failed to set background cgroup"); |
110 | if (!eng) return -1; | 104 | return -1; |
111 | } | 105 | } |
112 | 106 | ||
113 | if (!eng && (prctl(PR_SET_DUMPABLE, 0) < 0)) { | 107 | if (__android_logger_property_get_bool("ro.debuggable", BOOL_DEFAULT_FALSE) && |
108 | prctl(PR_SET_DUMPABLE, 0) == -1) { | ||
114 | android::prdebug("failed to clear PR_SET_DUMPABLE"); | 109 | android::prdebug("failed to clear PR_SET_DUMPABLE"); |
115 | return -1; | 110 | return -1; |
116 | } | 111 | } |
@@ -133,24 +128,24 @@ static int drop_privs(bool klogd, bool auditd) { | |||
133 | android::prdebug( | 128 | android::prdebug( |
134 | "failed to set CAP_SETGID, CAP_SYSLOG or CAP_AUDIT_CONTROL (%d)", | 129 | "failed to set CAP_SETGID, CAP_SYSLOG or CAP_AUDIT_CONTROL (%d)", |
135 | errno); | 130 | errno); |
136 | if (!eng) return -1; | 131 | return -1; |
137 | } | 132 | } |
138 | 133 | ||
139 | gid_t groups[] = { AID_READPROC }; | 134 | gid_t groups[] = { AID_READPROC }; |
140 | 135 | ||
141 | if (setgroups(arraysize(groups), groups) == -1) { | 136 | if (setgroups(arraysize(groups), groups) == -1) { |
142 | android::prdebug("failed to set AID_READPROC groups"); | 137 | android::prdebug("failed to set AID_READPROC groups"); |
143 | if (!eng) return -1; | 138 | return -1; |
144 | } | 139 | } |
145 | 140 | ||
146 | if (setgid(AID_LOGD) != 0) { | 141 | if (setgid(AID_LOGD) != 0) { |
147 | android::prdebug("failed to set AID_LOGD gid"); | 142 | android::prdebug("failed to set AID_LOGD gid"); |
148 | if (!eng) return -1; | 143 | return -1; |
149 | } | 144 | } |
150 | 145 | ||
151 | if (setuid(AID_LOGD) != 0) { | 146 | if (setuid(AID_LOGD) != 0) { |
152 | android::prdebug("failed to set AID_LOGD uid"); | 147 | android::prdebug("failed to set AID_LOGD uid"); |
153 | if (!eng) return -1; | 148 | return -1; |
154 | } | 149 | } |
155 | 150 | ||
156 | if (cap_set_flag(caps.get(), CAP_PERMITTED, 1, cap_value, CAP_CLEAR) < 0) { | 151 | if (cap_set_flag(caps.get(), CAP_PERMITTED, 1, cap_value, CAP_CLEAR) < 0) { |
@@ -161,7 +156,7 @@ static int drop_privs(bool klogd, bool auditd) { | |||
161 | } | 156 | } |
162 | if (cap_set_proc(caps.get()) < 0) { | 157 | if (cap_set_proc(caps.get()) < 0) { |
163 | android::prdebug("failed to clear CAP_SETGID (%d)", errno); | 158 | android::prdebug("failed to clear CAP_SETGID (%d)", errno); |
164 | if (!eng) return -1; | 159 | return -1; |
165 | } | 160 | } |
166 | 161 | ||
167 | return 0; | 162 | return 0; |
@@ -468,7 +463,7 @@ int main(int argc, char* argv[]) { | |||
468 | bool auditd = | 463 | bool auditd = |
469 | __android_logger_property_get_bool("ro.logd.auditd", BOOL_DEFAULT_TRUE); | 464 | __android_logger_property_get_bool("ro.logd.auditd", BOOL_DEFAULT_TRUE); |
470 | if (drop_privs(klogd, auditd) != 0) { | 465 | if (drop_privs(klogd, auditd) != 0) { |
471 | return -1; | 466 | return EXIT_FAILURE; |
472 | } | 467 | } |
473 | 468 | ||
474 | // Serves the purpose of managing the last logs times read on a | 469 | // Serves the purpose of managing the last logs times read on a |
@@ -496,7 +491,7 @@ int main(int argc, char* argv[]) { | |||
496 | 491 | ||
497 | LogReader* reader = new LogReader(logBuf); | 492 | LogReader* reader = new LogReader(logBuf); |
498 | if (reader->startListener()) { | 493 | if (reader->startListener()) { |
499 | exit(1); | 494 | return EXIT_FAILURE; |
500 | } | 495 | } |
501 | 496 | ||
502 | // LogListener listens on /dev/socket/logdw for client | 497 | // LogListener listens on /dev/socket/logdw for client |
@@ -506,7 +501,7 @@ int main(int argc, char* argv[]) { | |||
506 | LogListener* swl = new LogListener(logBuf, reader); | 501 | LogListener* swl = new LogListener(logBuf, reader); |
507 | // Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value | 502 | // Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value |
508 | if (swl->startListener(600)) { | 503 | if (swl->startListener(600)) { |
509 | exit(1); | 504 | return EXIT_FAILURE; |
510 | } | 505 | } |
511 | 506 | ||
512 | // Command listener listens on /dev/socket/logd for incoming logd | 507 | // Command listener listens on /dev/socket/logd for incoming logd |
@@ -514,7 +509,7 @@ int main(int argc, char* argv[]) { | |||
514 | 509 | ||
515 | CommandListener* cl = new CommandListener(logBuf, reader, swl); | 510 | CommandListener* cl = new CommandListener(logBuf, reader, swl); |
516 | if (cl->startListener()) { | 511 | if (cl->startListener()) { |
517 | exit(1); | 512 | return EXIT_FAILURE; |
518 | } | 513 | } |
519 | 514 | ||
520 | // LogAudit listens on NETLINK_AUDIT socket for selinux | 515 | // LogAudit listens on NETLINK_AUDIT socket for selinux |
@@ -549,5 +544,5 @@ int main(int argc, char* argv[]) { | |||
549 | 544 | ||
550 | TEMP_FAILURE_RETRY(pause()); | 545 | TEMP_FAILURE_RETRY(pause()); |
551 | 546 | ||
552 | exit(0); | 547 | return EXIT_SUCCESS; |
553 | } | 548 | } |