} else {
uci_fill_ptr(ctx, &ptr, &pctx->package->e);
e = uci_lookup_list(&pctx->package->sections, name);
- if (e)
+ if (e) {
ptr.s = uci_to_section(e);
+
+ if ((ctx->flags & UCI_FLAG_STRICT) && strcmp(ptr.s->type, type))
+ uci_parse_error(ctx, "section of different type overwrites prior section with same name");
+ }
+
ptr.section = name;
ptr.value = type;
free(name);
free(path);
uci_close_stream(f1);
- if (do_rename && rename(filename, p->path)) {
- unlink(filename);
- UCI_THROW(ctx, UCI_ERR_IO);
+ if (do_rename) {
+ path = realpath(p->path, NULL);
+ if (!path || rename(filename, path)) {
+ unlink(filename);
+ UCI_THROW(ctx, UCI_ERR_IO);
+ }
+ free(path);
}
free(filename);
if (ctx->err)