diff options
author | Dmitri Pal <dpal@redhat.com> | 2010-11-27 23:49:19 -0500 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2010-12-21 11:16:09 -0500 |
commit | 490d3d9df1a2c666e262cd1fc9fd9f725871c8a1 (patch) | |
tree | b64cd0bdba775a8e15c93abf71ff95954f704473 /ini | |
parent | ec246f748f8dcbeefd46125546364ed2aa3100ea (diff) | |
download | ding-libs2-490d3d9df1a2c666e262cd1fc9fd9f725871c8a1.tar.gz ding-libs2-490d3d9df1a2c666e262cd1fc9fd9f725871c8a1.tar.xz ding-libs2-490d3d9df1a2c666e262cd1fc9fd9f725871c8a1.zip |
Collision flag validation
Added validation of the collision flags
at the interface boundary.
Diffstat (limited to 'ini')
-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)); |