diff --git a/man/sd_id128_get_machine.xml b/man/sd_id128_get_machine.xml
index fc13ae50f49..31e4b02d9bb 100644
--- a/man/sd_id128_get_machine.xml
+++ b/man/sd_id128_get_machine.xml
@@ -198,7 +198,10 @@
-ENXIO
Returned by sd_id128_get_invocation() if no invocation ID is
- set.
+ set. Also returned by sd_id128_get_app_specific(),
+ sd_id128_get_machine_app_specific(), and
+ sd_id128_get_boot_app_specific() when the app_id
+ parameter is all zeros.
diff --git a/src/id128/id128.c b/src/id128/id128.c
index 29cd2e2dc0e..18e08808057 100644
--- a/src/id128/id128.c
+++ b/src/id128/id128.c
@@ -235,7 +235,9 @@ static int parse_argv(int argc, char *argv[]) {
break;
case 'a':
- r = sd_id128_from_string(optarg, &arg_app);
+ r = id128_from_string_nonzero(optarg, &arg_app);
+ if (r == -ENXIO)
+ return log_error_errno(r, "Application ID cannot be all zeros.");
if (r < 0)
return log_error_errno(r, "Failed to parse \"%s\" as application-ID: %m", optarg);
break;
diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c
index adc73e4fdcd..9fda79ae266 100644
--- a/src/libsystemd/sd-id128/sd-id128.c
+++ b/src/libsystemd/sd-id128/sd-id128.c
@@ -346,6 +346,7 @@ _public_ int sd_id128_get_app_specific(sd_id128_t base, sd_id128_t app_id, sd_id
} buf;
assert_return(ret, -EINVAL);
+ assert_return(!sd_id128_is_null(app_id), -ENXIO);
hmac_sha256(&base, sizeof(base), &app_id, sizeof(app_id), buf.hmac);
diff --git a/src/test/test-id128.c b/src/test/test-id128.c
index 10c061b917a..ae7df27d8f9 100644
--- a/src/test/test-id128.c
+++ b/src/test/test-id128.c
@@ -192,6 +192,10 @@ TEST(id128) {
assert_se(sd_id128_get_machine_app_specific(SD_ID128_MAKE(51,df,0b,4b,c3,b0,4c,97,80,e2,99,b9,8c,a3,73,b8), &id2) >= 0);
assert_se(!sd_id128_equal(id, id2));
}
+
+ /* Check return values */
+ assert_se(sd_id128_get_app_specific(SD_ID128_ALLF, SD_ID128_NULL, &id) == -ENXIO);
+ assert_se(sd_id128_get_app_specific(SD_ID128_NULL, SD_ID128_ALLF, &id) == 0);
}
TEST(sd_id128_get_invocation) {