chiark / gitweb /
bus: do not segfault on zeros in errno mapping table
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 31 Oct 2014 13:31:02 +0000 (09:31 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 31 Oct 2014 15:32:00 +0000 (11:32 -0400)
Depending on the link order, holes might appear in the body of
the sd_bus_errnomap section. Ignore them.

Adds a simple test to print the table to help with debugging such
issues in the future.

src/libsystemd/sd-bus/bus-error.c
src/libsystemd/sd-bus/test-bus-error.c

index 2e64b925f3d5dbf5c96b8713ae2966b8d636f710..ad1a66da72fd73d54771ab569597d1423a491a2a 100644 (file)
@@ -80,7 +80,7 @@ static int bus_error_mapping_lookup(const char *name, size_t len) {
         const sd_bus_name_error_mapping *m;
 
         for (m = __start_sd_bus_errnomap; m < __stop_sd_bus_errnomap; m++)
-                if (strneq(m->name, name, len))
+                if (m->name && strneq(m->name, name, len))
                         return m->code;
 
         return EIO;
index dd0cca4ab8fbdfd49b666ca4780f33f0170a3944..aff34a90cd8521a74f16afe89df66fb841d901d7 100644 (file)
@@ -111,6 +111,18 @@ static void test_error(void) {
         assert_se(sd_bus_error_is_set(&error));
 }
 
+extern const sd_bus_name_error_mapping __start_sd_bus_errnomap[];
+extern const sd_bus_name_error_mapping __stop_sd_bus_errnomap[];
+
+static void dump_mapping_table(void) {
+        const sd_bus_name_error_mapping *m;
+
+        printf("----- errno mappings ------\n");
+        for (m = __start_sd_bus_errnomap; m < __stop_sd_bus_errnomap; m++)
+                printf("%s -> %d\n", m->name, m->code);
+        printf("---------------------------\n");
+}
+
 static void test_errno_mapping_standard(void) {
         assert_se(sd_bus_error_set(NULL, "System.Error.EUCLEAN", NULL) == -EUCLEAN);
         assert_se(sd_bus_error_set(NULL, "System.Error.EBUSY", NULL) == -EBUSY);
@@ -130,6 +142,7 @@ static void test_errno_mapping_custom(void) {
 }
 
 int main(int argc, char *argv[]) {
+        dump_mapping_table();
 
         test_error();
         test_errno_mapping_standard();