summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2021-07-28 15:06:47 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-07-28 15:06:47 +0000
commit301d13c4ce39390538d2b604b7d72f858a112252 (patch)
treef18a20ca302f644b5e1b732260abc049a7a21245
parenta9b154741131482fcb19f0fc95d211a8a3daf3a3 (diff)
parent22a13c378a86f458f70ef4f58e31573b4aa55f5b (diff)
downloadsecurity-301d13c4ce39390538d2b604b7d72f858a112252.tar.gz
Merge "Don't mark odsign as oneshot." into sc-dev
-rw-r--r--ondevice-signing/odsign.rc5
-rw-r--r--ondevice-signing/odsign_main.cpp11
2 files changed, 13 insertions, 3 deletions
diff --git a/ondevice-signing/odsign.rc b/ondevice-signing/odsign.rc
index 044bae7b..de09fc0e 100644
--- a/ondevice-signing/odsign.rc
+++ b/ondevice-signing/odsign.rc
@@ -2,5 +2,8 @@ service odsign /system/bin/odsign
class core
user root
group system
- oneshot
disabled # does not start with the core class
+
+# Note that odsign is not oneshot, but stopped manually when it exits. This
+# ensures that if odsign crashes during a module update, apexd will detect
+# those crashes and roll back the update.
diff --git a/ondevice-signing/odsign_main.cpp b/ondevice-signing/odsign_main.cpp
index 0991704b..c4433406 100644
--- a/ondevice-signing/odsign_main.cpp
+++ b/ondevice-signing/odsign_main.cpp
@@ -64,6 +64,8 @@ static const char* kOdsignVerificationStatusProp = "odsign.verification.success"
static const char* kOdsignVerificationStatusValid = "1";
static const char* kOdsignVerificationStatusError = "0";
+static const char* kStopServiceProp = "ctl.stop";
+
Result<void> verifyExistingCert(const SigningKey& key) {
if (access(kSigningKeyCert.c_str(), F_OK) < 0) {
return ErrnoError() << "Key certificate not found: " << kSigningKeyCert;
@@ -288,8 +290,10 @@ int main(int /* argc */, char** /* argv */) {
// Tell init we don't need to use our key anymore
SetProperty(kOdsignKeyDoneProp, "1");
// Tell init we're done with verification, and that it was an error
- SetProperty(kOdsignVerificationDoneProp, "1");
SetProperty(kOdsignVerificationStatusProp, kOdsignVerificationStatusError);
+ SetProperty(kOdsignVerificationDoneProp, "1");
+ // Tell init it shouldn't try to restart us - see odsign.rc
+ SetProperty(kStopServiceProp, "odsign");
};
auto scope_guard = android::base::make_scope_guard(errorScopeGuard);
@@ -385,7 +389,10 @@ int main(int /* argc */, char** /* argv */) {
// At this point, we're done with the key for sure
SetProperty(kOdsignKeyDoneProp, "1");
// And we did a successful verification
- SetProperty(kOdsignVerificationDoneProp, "1");
SetProperty(kOdsignVerificationStatusProp, kOdsignVerificationStatusValid);
+ SetProperty(kOdsignVerificationDoneProp, "1");
+
+ // Tell init it shouldn't try to restart us - see odsign.rc
+ SetProperty(kStopServiceProp, "odsign");
return 0;
}