From 7f30ac0c3982ce2d048d0f9708c3985954993099 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Mon, 17 Mar 2014 10:33:39 -0400 Subject: Better handle out-of-memory reading configuration If we hit out-of-memory (strdup() failures) while reading the configuration, don't crash (static analysis). --- src/back-nis.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/back-nis.c b/src/back-nis.c index 0d4e227..b9379c0 100644 --- a/src/back-nis.c +++ b/src/back-nis.c @@ -113,6 +113,7 @@ static struct backend_shr_set_data * backend_copy_set_data(const struct backend_set_data *data) { struct backend_set_data *ret; + ret = malloc(sizeof(*ret)); if (ret == NULL) { return NULL; @@ -122,7 +123,9 @@ backend_copy_set_data(const struct backend_set_data *data) ret->common.group = strdup(data->common.group); ret->common.set = strdup(data->common.set); ret->common.bases = backend_shr_dup_strlist(data->common.bases); - ret->common.entry_filter = strdup(data->common.entry_filter); + ret->common.entry_filter = data->common.entry_filter ? + strdup(data->common.entry_filter) : + NULL; ret->common.restrict_subtrees = backend_shr_dup_sdnlist(data->common.restrict_subtrees); ret->common.ignore_subtrees = backend_shr_dup_sdnlist(data->common.ignore_subtrees); ret->common.rel_attrs = data->common.rel_attrs ? @@ -456,6 +459,10 @@ backend_map_config_filter(const char *format, { char *ret; int i, j, l; + + if (format == NULL) { + return NULL; + } l = 0; for (i = 0; format[i] != '\0'; i++) { if (format[i] == '%') { @@ -540,7 +547,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, bases = backend_shr_get_vattr_strlist(state, e, NIS_MAP_CONFIGURATION_BASE_ATTR); restrict_subtrees = backend_shr_get_vattr_sdnlist(state, e, - NIS_MAP_CONFIGURATION_RESTRICT_SUBTREES_ATTR); + NIS_MAP_CONFIGURATION_RESTRICT_SUBTREES_ATTR); ignore_subtrees = backend_shr_get_vattr_sdnlist(state, e, NIS_MAP_CONFIGURATION_IGNORE_SUBTREES_ATTR); if (ignore_subtrees == NULL) { @@ -727,6 +734,12 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, ret.n_keys_formats++; } *pret = backend_copy_set_data(&ret); + if (*pret == NULL) { + slapi_log_error(SLAPI_LOG_PLUGIN, + state->plugin_desc->spd_id, + "out of memory initializing map %s in %s\n", + map, domain); + } free(ret.common.group); free(ret.common.set); backend_shr_free_strlist(ret.common.bases); -- cgit