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:
Zbigniew Jędrzejewski-Szmek
2016-01-13 14:23:54 -05:00
parent d469dd44c4
commit 45ea658326
2 changed files with 23 additions and 8 deletions

View File

@@ -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;

View File

@@ -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[]) {