mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 16:37:19 +09:00
bus-error: verify additional error maps during installation
Go over the entries in the map and check that they make sense. Tests are added. In the future we might want to do additional checks, e.g. verifying that the error names are in the expected format.
This commit is contained in:
@@ -579,27 +579,29 @@ const char *bus_error_message(const sd_bus_error *e, int error) {
|
||||
return strerror(error);
|
||||
}
|
||||
|
||||
static bool map_ok(const sd_bus_error_map *map) {
|
||||
for (; map->code != BUS_ERROR_MAP_END_MARKER; map++)
|
||||
if (!map->name || map->code <=0)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
_public_ int sd_bus_error_add_map(const sd_bus_error_map *map) {
|
||||
const sd_bus_error_map **maps = NULL;
|
||||
unsigned n = 0;
|
||||
|
||||
assert_return(map, -EINVAL);
|
||||
assert_return(map_ok(map), -EINVAL);
|
||||
|
||||
if (additional_error_maps) {
|
||||
for (;; n++) {
|
||||
if (additional_error_maps[n] == NULL)
|
||||
break;
|
||||
|
||||
if (additional_error_maps)
|
||||
for (; additional_error_maps[n] != NULL; n++)
|
||||
if (additional_error_maps[n] == map)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
maps = realloc_multiply(additional_error_maps, sizeof(struct sd_bus_error_map*), n + 2);
|
||||
if (!maps)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
maps[n] = map;
|
||||
maps[n+1] = NULL;
|
||||
|
||||
|
||||
@@ -167,6 +167,16 @@ static const sd_bus_error_map test_errors4[] = {
|
||||
SD_BUS_ERROR_MAP_END
|
||||
};
|
||||
|
||||
static const sd_bus_error_map test_errors_bad1[] = {
|
||||
SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", 0),
|
||||
SD_BUS_ERROR_MAP_END
|
||||
};
|
||||
|
||||
static const sd_bus_error_map test_errors_bad2[] = {
|
||||
SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-1", -1),
|
||||
SD_BUS_ERROR_MAP_END
|
||||
};
|
||||
|
||||
static void test_errno_mapping_custom(void) {
|
||||
assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error", NULL) == -5);
|
||||
assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-2", NULL) == -52);
|
||||
@@ -190,6 +200,9 @@ static void test_errno_mapping_custom(void) {
|
||||
assert_se(sd_bus_error_set(NULL, "org.freedesktop.custom-dbus-error-y", NULL) == -EIO);
|
||||
|
||||
assert_se(sd_bus_error_set(NULL, BUS_ERROR_NO_SUCH_UNIT, NULL) == -ENOENT);
|
||||
|
||||
assert_se(sd_bus_error_add_map(test_errors_bad1) == -EINVAL);
|
||||
assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
Reference in New Issue
Block a user