diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2022-08-06 12:21:55 -0300 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2022-08-06 12:21:55 -0300 |
commit | 50a36e69eedaf9a4438d939e66ed5d09aa0f65c1 (patch) | |
tree | 1268d6424498a0a440f92075de1bd9f2b94744b6 | |
parent | 19ee637cefbdc197c0d249b146f263116812db53 (diff) |
keyword, git: Update error checking for every function that uses
`get_keyword_offset_ptr()`
-rw-r--r-- | config.c | 2 | ||||
-rw-r--r-- | keyword.c | 44 |
2 files changed, 26 insertions, 20 deletions
@@ -62,7 +62,7 @@ config *parse_config(const char *filename) { /* Did we fail to parse the config file? */ if (error = parse_key_value_file(cfg, &type_error, config_keywords, buf, "=", NULL)) { - if (type_error || (error >= 3 && error != 6)) { + if (type_error || (error >= 3 && error > 7)) { cleanup_config(cfg); free(buf); return NULL; @@ -61,14 +61,17 @@ keyword_val get_keyword(const keyword *key, void *data, void *ctx, int *error) { const int callback_ret = (key->get_callback != NULL) ? key->get_callback(ctx, data, key, &val) : 0; if (!callback_ret) { char *data_member = (char *)get_keyword_offset_ptr(key, data); - - switch (key->type) { - case TYPE_INT : - case TYPE_BOOL : val.i = *(int *)data_member; break; - case TYPE_TIME : val.t = *(time_t *)data_member; break; - case TYPE_STRING: val.str = *(char **)data_member; break; - case TYPE_FLOAT : val.f = *(float *)data_member; break; - default : *error = 2; break; + if (data_member != NULL) { + switch (key->type) { + case TYPE_INT : + case TYPE_BOOL : val.i = *(int *)data_member; break; + case TYPE_TIME : val.t = *(time_t *)data_member; break; + case TYPE_STRING: val.str = *(char **)data_member; break; + case TYPE_FLOAT : val.f = *(float *)data_member; break; + default : *error = 2; break; + } + } else { + *error = 2; } } else if (callback_ret < 0) { *error = 1; @@ -85,16 +88,19 @@ int set_keyword(const keyword *key, keyword_val val, void *ret, void *ctx) { return (callback_ret > 0) ? 0 : 5; } else { char *tmp_ret = (char *)get_keyword_offset_ptr(key, ret); - - switch (key->type) { - case TYPE_INT : - case TYPE_BOOL : *(int *)tmp_ret = val.i; break; - case TYPE_TIME : *(time_t *)tmp_ret = val.t; break; - case TYPE_STRING: *(char **)tmp_ret = val.str; break; - case TYPE_FLOAT : *(float *)tmp_ret = val.f; break; - default : return 6; break; + if (tmp_ret != NULL) { + switch (key->type) { + case TYPE_INT : + case TYPE_BOOL : *(int *)tmp_ret = val.i; break; + case TYPE_TIME : *(time_t *)tmp_ret = val.t; break; + case TYPE_STRING: *(char **)tmp_ret = val.str; break; + case TYPE_FLOAT : *(float *)tmp_ret = val.f; break; + default : return 6; break; + } + return 0; + } else { + return 7; } - return 0; } } @@ -164,14 +170,14 @@ int parse_key_value_file(void *ret, void *ctx, const keyword **keywords, char *b if (parse_cb != NULL) { /* Did the callback return an error. */ if (parse_cb(&ret, ctx, buf) < 0) { - ret_val = 7; + ret_val = 8; break; } } } return ret_val; } else { - return 8; + return 9; } } |