*/
/*
- * This file contains ucimap, an API for mapping UCI to C data structures
+ * This file contains ucimap, an API for mapping UCI to C data structures
*/
#include <strings.h>
ucimap_free_section(struct uci_map *map, struct ucimap_section_data *sd)
{
void *section;
- int i;
+ unsigned int i;
section = ucimap_section_ptr(sd);
if (sd->ref)
struct ucimap_alloc_custom *ac;
struct ucimap_alloc *a;
void *ptr = *((void **) item);
- int i;
+ unsigned int i;
if (!ptr)
return;
{
struct ucimap_list *new;
struct ucimap_alloc *a;
- int i, offset = 0;
+ unsigned int i;
+ int offset = 0;
int size = sizeof(struct ucimap_list) + items * sizeof(union ucimap_data);
if (!*list) {
switch(om->type & UCIMAP_SUBTYPE) {
case UCIMAP_STRING:
if ((om->data.s.maxlen > 0) &&
- (strlen(str) > om->data.s.maxlen))
+ (strlen(str) > (unsigned) om->data.s.maxlen))
return;
s = strdup(str);
map->sdata_tail = &sd->next;
}
-static void
+static int
ucimap_add_section(struct ucimap_section_data *sd)
{
+ int r;
struct uci_map *map = sd->map;
sd->next = NULL;
- if (sd->sm->add(map, ucimap_section_ptr(sd)) < 0)
+ r = sd->sm->add(map, ucimap_section_ptr(sd));
+ if (r < 0) {
ucimap_free_section(map, sd);
- else
+ return r;
+ } else
ucimap_add_section_list(map, sd);
+
+ return 0;
}
#ifdef UCI_DEBUG
static bool
ucimap_check_optmap_type(struct uci_sectionmap *sm, struct uci_optmap *om)
{
- unsigned int type;
+ int type;
if (unlikely(sm->type_name != om->type_name) &&
unlikely(strcmp(sm->type_name, om->type_name) != 0)) {
size = sizeof(struct ucimap_list) +
n_elements * sizeof(union ucimap_data);
- data->list = malloc(size);
+ data->list = calloc(1, size);
if (!data->list)
goto error_mem;
- memset(data->list, 0, size);
data->list->size = n_elements;
} else {
ucimap_count_alloc(om, &n_alloc, &n_alloc_custom);
goto error;
if (map->parsed) {
- ucimap_add_section(sd);
+ err = ucimap_add_section(sd);
+ if (err)
+ return err;
} else {
ucimap_add_section_list(map, sd);
}
return 0;
error_mem:
- if (sd->alloc_custom)
- free(sd->alloc_custom);
- if (sd->allocmap)
- free(sd->allocmap);
+ free(sd->alloc_custom);
+ free(sd->allocmap);
free(sd);
return UCI_ERR_MEM;
void *section = ucimap_section_ptr(sd);
struct uci_sectionmap *sm = sd->sm;
struct uci_optmap *om;
- int ofs = (char *)field - (char *)section;
+ unsigned int ofs = (char *)field - (char *)section;
int i = 0;
ucimap_foreach_option(sm, om) {
struct uci_element *e;
struct ucimap_section_data *sd, **sd_tail;
struct ucimap_fixup *f;
- int i;
+ unsigned int i;
sd_tail = map->sdata_tail;
map->parsed = false;
if (sm->alloc) {
sd = sm->alloc(map, sm, s);
+ if (!sd)
+ continue;
memset(sd, 0, sizeof(struct ucimap_section_data));
} else {
- sd = malloc(sm->alloc_len);
- memset(sd, 0, sm->alloc_len);
+ sd = calloc(1, sm->alloc_len);
+ if (!sd)
+ continue;
sd = ucimap_ptr_section(sm, sd);
}
- if (!sd)
- continue;
ucimap_parse_section(map, sm, sd, s);
}