diff options
-rw-r--r-- | ini/ini_fileobj.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/ini/ini_fileobj.c b/ini/ini_fileobj.c index 29d5f90..699026c 100644 --- a/ini/ini_fileobj.c +++ b/ini/ini_fileobj.c @@ -33,6 +33,45 @@ #include "collection_tools.h" +/* Check if collision flags are valid */ +static int valid_collision_flags(uint32_t collision_flags) +{ + uint32_t flag; + + TRACE_FLOW_ENTRY(); + + flag = collision_flags & INI_MV1S_MASK; + if ((flag != INI_MV1S_OVERWRITE) && + (flag != INI_MV1S_ERROR) && + (flag != INI_MV1S_PRESERVE) && + (flag != INI_MV1S_ALLOW)) { + TRACE_ERROR_STRING("Invalid value collision flag",""); + return 0; + } + + flag = collision_flags & INI_MV2S_MASK; + if ((flag != INI_MV2S_OVERWRITE) && + (flag != INI_MV2S_ERROR) && + (flag != INI_MV2S_PRESERVE) && + (flag != INI_MV2S_ALLOW)) { + TRACE_ERROR_STRING("Invalid value cross-section collision flag",""); + return 0; + } + + flag = collision_flags & INI_MS_MASK; + if ((flag != INI_MS_MERGE) && + (flag != INI_MS_OVERWRITE) && + (flag != INI_MS_ERROR) && + (flag != INI_MS_PRESERVE) && + (flag != INI_MS_ALLOW)) { + TRACE_ERROR_STRING("Invalid section collision flag",""); + return 0; + } + + TRACE_FLOW_EXIT(); + return 1; +} + /* Close file context and destroy the object */ void ini_config_file_close(struct ini_cfgfile *file_ctx) { @@ -66,6 +105,12 @@ int ini_config_file_open(const char *filename, return EINVAL; } + if (!valid_collision_flags(collision_flags)) { + TRACE_ERROR_NUMBER("Invalid flags.", EINVAL); + return EINVAL; + } + + /* Allocate structure */ errno = 0; new_ctx = malloc(sizeof(struct ini_cfgfile)); |