]> git.proxmox.com Git - mirror_corosync.git/commitdiff
coroparse: Check icmap_set results
authorJan Friesse <jfriesse@redhat.com>
Thu, 23 Aug 2018 11:49:46 +0000 (13:49 +0200)
committerJan Friesse <jfriesse@redhat.com>
Thu, 6 Sep 2018 11:01:12 +0000 (13:01 +0200)
Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
exec/coroparse.c

index aae40c393cda0116243524ac9ce77648daa17048..365c1e68c79bea63262dd4b3455b1744f31b0acf 100644 (file)
@@ -527,6 +527,9 @@ static int main_config_parser_cb(const char *path,
        struct key_value_list_item *kv_item;
        struct qb_list_head *iter, *tmp_iter;
        int uid, gid;
+       cs_error_t cs_err;
+
+       cs_err = CS_OK;
 
        switch (type) {
        case PARSER_CB_START:
@@ -548,7 +551,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint32_r(config_map, path, val);
+                               if ((cs_err = icmap_set_uint32_r(config_map, path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        break;
@@ -561,7 +566,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint32_r(config_map, path, val);
+                               if ((cs_err = icmap_set_uint32_r(config_map, path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
 
@@ -575,7 +582,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint8_r(config_map, path, val);
+                               if ((cs_err = icmap_set_uint8_r(config_map, path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        break;
@@ -587,7 +596,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint32_r(config_map, path, val);
+                               if ((cs_err = icmap_set_uint32_r(config_map, path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        if ((strcmp(path, "quorum.device.master_wins") == 0)) {
@@ -595,7 +606,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint8_r(config_map, path, val);
+                               if ((cs_err = icmap_set_uint8_r(config_map, path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        break;
@@ -633,7 +646,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint32_r(config_map,path, val);
+                               if ((cs_err = icmap_set_uint32_r(config_map,path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        if (strcmp(path, "totem.knet_compression_level") == 0) {
@@ -641,14 +656,18 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_int32_r(config_map, path, val);
+                               if ((cs_err = icmap_set_int32_r(config_map, path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        if (strcmp(path, "totem.config_version") == 0) {
                                if (str_to_ull(value, &ull) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint64_r(config_map, path, ull);
+                               if ((cs_err = icmap_set_uint64_r(config_map, path, ull)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        if (strcmp(path, "totem.ip_version") == 0) {
@@ -867,7 +886,9 @@ static int main_config_parser_cb(const char *path,
                                }
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.config.uid.%u",
                                                uid);
-                               icmap_set_uint8_r(config_map, key_name, 1);
+                               if ((cs_err = icmap_set_uint8_r(config_map, key_name, 1)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        } else if (strcmp(key, "gid") == 0) {
                                gid = gid_determine(value);
@@ -877,7 +898,9 @@ static int main_config_parser_cb(const char *path,
                                }
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.config.gid.%u",
                                                gid);
-                               icmap_set_uint8_r(config_map, key_name, 1);
+                               if ((cs_err = icmap_set_uint8_r(config_map, key_name, 1)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        } else {
                                *error_string = "uidgid: Only uid and gid are allowed items";
@@ -922,12 +945,16 @@ static int main_config_parser_cb(const char *path,
                                        goto atoi_error;
                                }
 
-                               icmap_set_uint32_r(config_map, key_name, val);
+                               if ((cs_err = icmap_set_uint32_r(config_map, key_name, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
 
                        if (add_as_string) {
-                               icmap_set_string_r(config_map, key_name, value);
+                               if ((cs_err = icmap_set_string_r(config_map, key_name, value)) != CS_OK) {
+                                       goto icmap_set_error;
+                               };
                                add_as_string = 0;
                        }
                        break;
@@ -937,7 +964,9 @@ static int main_config_parser_cb(const char *path,
                                if (safe_atoq(value, &val, val_type) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint32_r(config_map,path, val);
+                               if ((cs_err = icmap_set_uint32_r(config_map,path, val)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        break;
@@ -947,7 +976,9 @@ static int main_config_parser_cb(const char *path,
                                if (str_to_ull(value, &ull) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint64_r(config_map,path, ull);
+                               if ((cs_err = icmap_set_uint64_r(config_map,path, ull)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        break;
@@ -957,14 +988,18 @@ static int main_config_parser_cb(const char *path,
                                if (str_to_ull(value, &ull) != 0) {
                                        goto atoi_error;
                                }
-                               icmap_set_uint64_r(config_map,path, ull);
+                               if ((cs_err = icmap_set_uint64_r(config_map,path, ull)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                                add_as_string = 0;
                        }
                        break;
                }
 
                if (add_as_string) {
-                       icmap_set_string_r(config_map, path, value);
+                       if ((cs_err = icmap_set_string_r(config_map, path, value)) != CS_OK) {
+                               goto icmap_set_error;
+                       }
                }
                break;
        case PARSER_CB_SECTION_START:
@@ -1042,71 +1077,107 @@ static int main_config_parser_cb(const char *path,
                        if (data->bindnetaddr != NULL) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.bindnetaddr",
                                                data->linknumber);
-                               icmap_set_string_r(config_map, key_name, data->bindnetaddr);
+                               cs_err = icmap_set_string_r(config_map, key_name, data->bindnetaddr);
 
                                free(data->bindnetaddr);
                                data->bindnetaddr = NULL;
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        if (data->mcastaddr != NULL) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.mcastaddr",
                                                data->linknumber);
-                               icmap_set_string_r(config_map, key_name, data->mcastaddr);
+                               cs_err = icmap_set_string_r(config_map, key_name, data->mcastaddr);
 
                                free(data->mcastaddr);
                                data->mcastaddr = NULL;
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        if (data->broadcast != NULL) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.broadcast",
                                                data->linknumber);
-                               icmap_set_string_r(config_map, key_name, data->broadcast);
+                               cs_err = icmap_set_string_r(config_map, key_name, data->broadcast);
 
                                free(data->broadcast);
                                data->broadcast = NULL;
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        if (data->mcastport > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.mcastport",
                                                data->linknumber);
-                               icmap_set_uint16_r(config_map, key_name, data->mcastport);
+                               if ((cs_err = icmap_set_uint16_r(config_map, key_name,
+                                   data->mcastport)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        if (data->ttl > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.ttl",
                                                data->linknumber);
-                               icmap_set_uint8_r(config_map, key_name, data->ttl);
+                               if ((cs_err = icmap_set_uint8_r(config_map, key_name, data->ttl)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
                        if (data->knet_link_priority > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.knet_link_priority",
                                                data->linknumber);
-                               icmap_set_uint8_r(config_map, key_name, data->knet_link_priority);
+                               if ((cs_err = icmap_set_uint8_r(config_map, key_name,
+                                   data->knet_link_priority)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
                        if (data->knet_ping_interval > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.knet_ping_interval",
                                                data->linknumber);
-                               icmap_set_uint32_r(config_map, key_name, data->knet_ping_interval);
+                               if ((cs_err = icmap_set_uint32_r(config_map, key_name,
+                                   data->knet_ping_interval)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
                        if (data->knet_ping_timeout > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.knet_ping_timeout",
                                                data->linknumber);
-                               icmap_set_uint32_r(config_map, key_name, data->knet_ping_timeout);
+                               if ((cs_err = icmap_set_uint32_r(config_map, key_name,
+                                   data->knet_ping_timeout)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
                        if (data->knet_ping_precision > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.knet_ping_precision",
                                                data->linknumber);
-                               icmap_set_uint32_r(config_map, key_name, data->knet_ping_precision);
+                               if ((cs_err = icmap_set_uint32_r(config_map, key_name,
+                                   data->knet_ping_precision)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
                        if (data->knet_pong_count > -1) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.knet_pong_count",
                                                data->linknumber);
-                               icmap_set_uint32_r(config_map, key_name, data->knet_pong_count);
+                               if ((cs_err = icmap_set_uint32_r(config_map, key_name,
+                                   data->knet_pong_count)) != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
                        if (data->knet_transport) {
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.knet_transport",
                                                data->linknumber);
-                               icmap_set_string_r(config_map, key_name, data->knet_transport);
+                               cs_err = icmap_set_string_r(config_map, key_name, data->knet_transport);
                                free(data->knet_transport);
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        ii = 0;
@@ -1116,12 +1187,16 @@ static int main_config_parser_cb(const char *path,
 
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "totem.interface.%u.member.%u",
                                                data->linknumber, ii);
-                               icmap_set_string_r(config_map, key_name, kv_item->value);
+                               cs_err = icmap_set_string_r(config_map, key_name, kv_item->value);
 
                                free(kv_item->value);
                                free(kv_item->key);
                                free(kv_item);
                                ii++;
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        break;
@@ -1137,19 +1212,26 @@ static int main_config_parser_cb(const char *path,
 
                                snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s.%s",
                                         data->subsys, kv_item->key);
-                                icmap_set_string_r(config_map, key_name, kv_item->value);
+                               cs_err = icmap_set_string_r(config_map, key_name, kv_item->value);
 
                                free(kv_item->value);
                                free(kv_item->key);
                                free(kv_item);
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s.subsys",
                                        data->subsys);
-                       icmap_set_string_r(config_map, key_name, data->subsys);
+                       cs_err = icmap_set_string_r(config_map, key_name, data->subsys);
 
                        free(data->subsys);
 
+                       if (cs_err != CS_OK) {
+                               goto icmap_set_error;
+                       }
                        break;
                case MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON:
                        if (data->logging_daemon_name == NULL) {
@@ -1184,38 +1266,52 @@ static int main_config_parser_cb(const char *path,
                                                                kv_item->key);
                                        }
                                }
-                               icmap_set_string_r(config_map, key_name, kv_item->value);
+                               cs_err = icmap_set_string_r(config_map, key_name, kv_item->value);
 
                                free(kv_item->value);
                                free(kv_item->key);
                                free(kv_item);
+
+                               if (cs_err != CS_OK) {
+                                       goto icmap_set_error;
+                               }
                        }
 
                        if (data->subsys == NULL) {
                                if (strcmp(data->logging_daemon_name, "corosync") != 0) {
                                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logging_daemon.%s.name",
                                                        data->logging_daemon_name);
-                                       icmap_set_string_r(config_map, key_name, data->logging_daemon_name);
+                                       cs_err = icmap_set_string_r(config_map, key_name, data->logging_daemon_name);
                                }
                        } else {
                                if (strcmp(data->logging_daemon_name, "corosync") == 0) {
                                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logger_subsys.%s.subsys",
                                                        data->subsys);
-                                       icmap_set_string_r(config_map, key_name, data->subsys);
+                                       cs_err = icmap_set_string_r(config_map, key_name, data->subsys);
 
                                } else {
                                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logging_daemon.%s.%s.subsys",
                                                        data->logging_daemon_name, data->subsys);
-                                       icmap_set_string_r(config_map, key_name, data->subsys);
+                                       cs_err = icmap_set_string_r(config_map, key_name, data->subsys);
+
+                                       if (cs_err != CS_OK) {
+                                               free(data->subsys);
+                                               free(data->logging_daemon_name);
+
+                                               goto icmap_set_error;
+                                       }
                                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "logging.logging_daemon.%s.%s.name",
                                                        data->logging_daemon_name, data->subsys);
-                                       icmap_set_string_r(config_map, key_name, data->logging_daemon_name);
+                                       cs_err = icmap_set_string_r(config_map, key_name, data->logging_daemon_name);
                                }
                        }
 
                        free(data->subsys);
                        free(data->logging_daemon_name);
 
+                       if (cs_err != CS_OK) {
+                               goto icmap_set_error;
+                       }
                        break;
                case MAIN_CP_CB_DATA_STATE_NODELIST_NODE:
                        data->node_number++;
@@ -1264,6 +1360,17 @@ atoi_error:
            key, min_val, max_val, value);
        *error_string = formated_err;
 
+       return (0);
+
+icmap_set_error:
+       if (snprintf(formated_err, sizeof(formated_err),
+           "Can't store key \"%s\" into icmap, returned error is %s",
+           key, cs_strerror(cs_err)) >= sizeof(formated_err)) {
+               *error_string = "Can't format parser error message";
+       } else {
+               *error_string = formated_err;
+       }
+
        return (0);
 }
 
@@ -1278,6 +1385,10 @@ static int uidgid_config_parser_cb(const char *path,
 {
        char key_name[ICMAP_KEYNAME_MAXLEN];
        int uid, gid;
+       static char formated_err[256];
+       cs_error_t cs_err;
+
+       cs_err = CS_OK;
 
        switch (type) {
        case PARSER_CB_START:
@@ -1293,7 +1404,9 @@ static int uidgid_config_parser_cb(const char *path,
                        }
                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.config.uid.%u",
                                        uid);
-                       icmap_set_uint8_r(config_map, key_name, 1);
+                       if ((cs_err = icmap_set_uint8_r(config_map, key_name, 1)) != CS_OK) {
+                               goto icmap_set_error;
+                       }
                } else if (strcmp(path, "uidgid.gid") == 0) {
                        gid = gid_determine(value);
                        if (gid == -1) {
@@ -1302,7 +1415,9 @@ static int uidgid_config_parser_cb(const char *path,
                        }
                        snprintf(key_name, ICMAP_KEYNAME_MAXLEN, "uidgid.config.gid.%u",
                                        gid);
-                       icmap_set_uint8_r(config_map, key_name, 1);
+                       if ((cs_err = icmap_set_uint8_r(config_map, key_name, 1)) != CS_OK) {
+                               goto icmap_set_error;
+                       }
                } else {
                        *error_string = "uidgid: Only uid and gid are allowed items";
                        return (0);
@@ -1319,6 +1434,17 @@ static int uidgid_config_parser_cb(const char *path,
        }
 
        return (1);
+
+icmap_set_error:
+       if (snprintf(formated_err, sizeof(formated_err),
+           "Can't store key \"%s\" into icmap, returned error is %s",
+           key, cs_strerror(cs_err)) >= sizeof(formated_err)) {
+               *error_string = "Can't format parser error message";
+       } else {
+               *error_string = formated_err;
+       }
+
+       return (0);
 }
 
 static int read_uidgid_files_into_icmap(