diff options
Diffstat (limited to 'src/server/ini.c')
-rw-r--r-- | src/server/ini.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/server/ini.c b/src/server/ini.c index 216543b..37c44a3 100644 --- a/src/server/ini.c +++ b/src/server/ini.c @@ -52,7 +52,7 @@ static char* find_char_or_comment(const char* s, char c) /* Version of strncpy that ensures dest (size bytes) is null-terminated. */ static char* strncpy0(char* dest, const char* src, size_t size) { - strncpy( dest, src, size ); + strncpy( dest, src, size - 1 ); dest[size - 1] = '\0'; return dest; } @@ -110,7 +110,17 @@ int ini_parse_file(FILE* file, int (*handler)(void*, const char*, const char*, c #endif else if ( *start == '[' ) { /* A "[section]" line */ - end = find_char_or_comment( start + 1, ']' ); + int cnt = 0; + char *f = start, *sstart = start; + while ( *++f ) { + if ( *f == '[' ) cnt++; + if ( *f == ']' ) cnt--; + if ( cnt < 0 ) { + sstart = f - 1; + break; + } + } + end = find_char_or_comment( sstart + 1, ']' ); if ( *end == ']' ) { *end = '\0'; strncpy0( section, start + 1, sizeof(section) ); |