*/
/*
- * 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) {
new = calloc(1, size);
+ if (!new)
+ return -ENOMEM;
ucimap_add_alloc(sd, new);
goto set;
offset = (items - (*list)->size) * sizeof(union ucimap_data);
a->ptr = realloc(a->ptr, size);
+ if (!a->ptr)
+ return -ENOMEM;
+
if (offset)
memset((char *) a->ptr + offset, 0, size - offset);
new = a->ptr;
struct ucimap_fixup *f, tmp;
struct uci_map *map = sd->map;
+ tmp.next = NULL;
tmp.sm = om->data.sm;
tmp.name = str;
tmp.type = om->type;
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)) {
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->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;