X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fini-config%2Fini.cpp;h=1d967a49d0b0da6de531da8d37a7ba1c0d2b05cb;hb=HEAD;hp=d8ec8cf3e375545b36416867704e45fa2b16f2cc;hpb=c9e313bc594f40a86eed237dce222c0fc99c957f;p=lttng-tools.git diff --git a/src/common/ini-config/ini.cpp b/src/common/ini-config/ini.cpp index d8ec8cf3e..c17a8c0e8 100644 --- a/src/common/ini-config/ini.cpp +++ b/src/common/ini-config/ini.cpp @@ -33,36 +33,37 @@ * http://code.google.com/p/inih/ */ -#include -#include -#include +#include "ini.hpp" + #include -#include "ini.hpp" +#include +#include +#include #if !INI_USE_STACK #include #endif #define MAX_SECTION 50 -#define MAX_NAME 50 +#define MAX_NAME 50 /* Strip whitespace chars off end of given string, in place. Return s. */ -static char* rstrip(char* s) +static char *rstrip(char *s) { - char* p = s + strlen(s); + char *p = s + strlen(s); - while (p > s && isspace((unsigned char)(*--p))) + while (p > s && isspace((unsigned char) (*--p))) *p = '\0'; return s; } /* Return pointer to first non-whitespace char in given string. */ -static char* lskip(const char* s) +static char *lskip(const char *s) { - while (*s && isspace((unsigned char)(*s))) + while (*s && isspace((unsigned char) (*s))) s++; - return (char*)s; + return (char *) s; } /* @@ -70,19 +71,19 @@ static char* lskip(const char* s) * null at end of string if neither found. ';' must be prefixed by a whitespace * character to register as a comment. */ -static char* find_char_or_comment(const char* s, char c) +static char *find_char_or_comment(const char *s, char c) { int was_whitespace = 0; while (*s && *s != c && !(was_whitespace && *s == ';')) { - was_whitespace = isspace((unsigned char)(*s)); + was_whitespace = isspace((unsigned char) (*s)); s++; } - return (char*)s; + return (char *) s; } /* Version of strncpy that ensures dest (size bytes) is null-terminated. */ -static char* strncpy0(char* dest, const char* src, size_t size) +static char *strncpy0(char *dest, const char *src, size_t size) { strncpy(dest, src, size - 1); dest[size - 1] = '\0'; @@ -90,40 +91,39 @@ static char* strncpy0(char* dest, const char* src, size_t size) } /* See documentation in header file. */ -int ini_parse_file(FILE* file, ini_entry_handler handler, void* user) +int ini_parse_file(FILE *file, ini_entry_handler handler, void *user) { /* Uses a fair bit of stack (use heap instead if you need to) */ #if INI_USE_STACK char line[INI_MAX_LINE]; #else - char* line; + char *line; #endif char section[MAX_SECTION] = ""; char prev_name[MAX_NAME] = ""; - char* start; - char* end; - char* name; - char* value; + char *start; + char *end; + char *name; + char *value; int lineno = 0; int error = 0; #if !INI_USE_STACK - line = (char*)zmalloc(INI_MAX_LINE); + line = zmalloc(INI_MAX_LINE); if (!line) { return -2; } #endif /* Scan through file line by line */ - while (fgets(line, INI_MAX_LINE, file) != NULL) { + while (fgets(line, INI_MAX_LINE, file) != nullptr) { lineno++; start = line; #if INI_ALLOW_BOM - if (lineno == 1 && (unsigned char)start[0] == 0xEF && - (unsigned char)start[1] == 0xBB && - (unsigned char)start[2] == 0xBF) { + if (lineno == 1 && (unsigned char) start[0] == 0xEF && + (unsigned char) start[1] == 0xBB && (unsigned char) start[2] == 0xBF) { start += 3; } #endif @@ -141,8 +141,7 @@ int ini_parse_file(FILE* file, ini_entry_handler handler, void* user) * continuation of previous name's value * (as per Python ConfigParser). */ - if (handler(user, section, prev_name, start) < 0 && - !error) { + if (handler(user, section, prev_name, start) < 0 && !error) { error = lineno; } } @@ -154,13 +153,11 @@ int ini_parse_file(FILE* file, ini_entry_handler handler, void* user) *end = '\0'; strncpy0(section, start + 1, sizeof(section)); *prev_name = '\0'; - } - else if (!error) { + } else if (!error) { /* No ']' found on section line */ error = lineno; } - } - else if (*start && *start != ';') { + } else if (*start && *start != ';') { /* Not a comment, must be a name[=:]value pair */ end = find_char_or_comment(start, '='); if (*end != '=') { @@ -181,13 +178,15 @@ int ini_parse_file(FILE* file, ini_entry_handler handler, void* user) * Valid name[=:]value pair found, call * handler */ + if (strlen(name) >= sizeof(prev_name)) { + /* Truncation occurs, report an error. */ + error = lineno; + } strncpy0(prev_name, name, sizeof(prev_name)); - if (handler(user, section, name, value) < 0 && - !error) { + if (handler(user, section, name, value) < 0 && !error) { error = lineno; } - } - else if (!error) { + } else if (!error) { /* No '=' or ':' found on name[=:]value line */ error = lineno; } @@ -202,9 +201,9 @@ int ini_parse_file(FILE* file, ini_entry_handler handler, void* user) } /* See documentation in header file. */ -int ini_parse(const char* filename, ini_entry_handler handler, void* user) +int ini_parse(const char *filename, ini_entry_handler handler, void *user) { - FILE* file; + FILE *file; int error; file = fopen(filename, "r");