From 54187ed0f082d145955a932f67259668dd038f65 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Thu, 14 Oct 2010 06:35:04 +0000 Subject: config parser: do not assume that realloc return same pointer We need to update the parser->line pointer on realloc and do not initialize the token array til after the potensial realloc in bb_get_chunk_with_continuation(). While here, also replace a realloc() with malloc() where pointer always is NULL. Signed-off-by: Natanael Copa Signed-off-by: Bernhard Reutner-Fischer --- libc/misc/internals/parse_config.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'libc/misc') diff --git a/libc/misc/internals/parse_config.c b/libc/misc/internals/parse_config.c index 8fa324e10..6734f35f4 100644 --- a/libc/misc/internals/parse_config.c +++ b/libc/misc/internals/parse_config.c @@ -78,6 +78,7 @@ static off_t bb_get_chunk_with_continuation(parser_t* parsr) parsr->line_len += PAGE_SIZE; parsr->data = realloc(parsr->data, parsr->data_len + parsr->line_len); + parsr->line = parsr->data + parsr->data_len; } } return pos; @@ -186,23 +187,21 @@ again: parser->line_len = 81; if (parser->data_len == 0) parser->data_len += 1 + ntokens * sizeof(char *); - parser->data = realloc(parser->data, - parser->data_len + parser->line_len); + parser->data = malloc(parser->data_len + parser->line_len); if (parser->data == NULL) return 0; parser->allocated |= 1; } /* else { assert(parser->data_len > 0); } */ if (parser->line == NULL) parser->line = parser->data + parser->data_len; - if (*tokens == NULL) - *tokens = (char **) parser->data; - memset(*tokens, 0, sizeof(*tokens[0]) * ntokens); /*config_free_data(parser);*/ /* Read one line (handling continuations with backslash) */ len = bb_get_chunk_with_continuation(parser); if (len == -1) return 0; + *tokens = (char **) parser->data; + memset(*tokens, 0, sizeof(*tokens[0]) * ntokens); line = parser->line; /* Skip multiple token-delimiters in the start of line? */ -- cgit v1.2.3 From c7c7ea92be00a9b5b48d1243bb75d32390263159 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Thu, 14 Oct 2010 06:35:06 +0000 Subject: config parser: always initialize line pointer We must always initialize line pointer since data pointer might have changed due to a realloc (in getserv.c for example). Signed-off-by: Natanael Copa Signed-off-by: Bernhard Reutner-Fischer --- libc/misc/internals/parse_config.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'libc/misc') diff --git a/libc/misc/internals/parse_config.c b/libc/misc/internals/parse_config.c index 6734f35f4..6d3b6f4a0 100644 --- a/libc/misc/internals/parse_config.c +++ b/libc/misc/internals/parse_config.c @@ -192,8 +192,7 @@ again: return 0; parser->allocated |= 1; } /* else { assert(parser->data_len > 0); } */ - if (parser->line == NULL) - parser->line = parser->data + parser->data_len; + parser->line = parser->data + parser->data_len; /*config_free_data(parser);*/ /* Read one line (handling continuations with backslash) */ -- cgit v1.2.3 From 6e74339e7d762857579169068b060a4fd3f345c4 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Thu, 14 Oct 2010 06:35:07 +0000 Subject: parse_config: discard rest of incomplete line If line is longer then size of given buffer and buffer is not allocated by the config parser itself, then discard rest of line. Signed-off-by: Natanael Copa Signed-off-by: Bernhard Reutner-Fischer --- libc/misc/internals/parse_config.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'libc/misc') diff --git a/libc/misc/internals/parse_config.c b/libc/misc/internals/parse_config.c index 6d3b6f4a0..c17d25553 100644 --- a/libc/misc/internals/parse_config.c +++ b/libc/misc/internals/parse_config.c @@ -79,6 +79,13 @@ static off_t bb_get_chunk_with_continuation(parser_t* parsr) parsr->data = realloc(parsr->data, parsr->data_len + parsr->line_len); parsr->line = parsr->data + parsr->data_len; + } else { + /* discard rest of line if not enough space in buffer */ + int c; + do { + c = fgetc(parsr->fp); + } while (c != EOF && c != '\n'); + break; } } return pos; -- cgit v1.2.3 From 86b4bf7d3194a06281f053be341031d9196874c2 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Wed, 24 Nov 2010 20:51:46 +0100 Subject: wchar: bug #1471: fix cornercase in mbrtowc Signed-off-by: Bernhard Reutner-Fischer --- libc/misc/wchar/wchar.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libc/misc') diff --git a/libc/misc/wchar/wchar.c b/libc/misc/wchar/wchar.c index 7380ac9ae..ab6c617ed 100644 --- a/libc/misc/wchar/wchar.c +++ b/libc/misc/wchar/wchar.c @@ -286,6 +286,8 @@ size_t mbrtowc(wchar_t *__restrict pwc, const char *__restrict s, s = empty_string; n = 1; } else if (*s == '\0') { + if (pwc) + *pwc = '\0'; /* According to the ISO C 89 standard this is the expected behaviour. */ return 0; } else if (!n) { -- cgit v1.2.3 From 5dea871ac73ef4608022c058b50adc946917f9b9 Mon Sep 17 00:00:00 2001 From: Carmelo Amoroso Date: Sun, 28 Nov 2010 20:44:21 +0100 Subject: libc_utmp: Fix getutmp and getutmpx for x86_64 On x86_64, when WORDSIZE_COMPAT32 is enabled, the ut_tv field of 'struct utmp' and 'struct utmpx' are defined as two nested structs instead of being defined as 'struct timeval', so it is not possible to directly assign the two ut_tv values. This patch split the assignment by setting each fields (tv_sec, tv_usec) of the ut_tv filed separately It is als compatible with 'struct timeval' usage. Signed-off-by: Carmelo Amoroso --- libc/misc/utmp/utxent.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'libc/misc') diff --git a/libc/misc/utmp/utxent.c b/libc/misc/utmp/utxent.c index 3c59f1c48..a0e80a662 100644 --- a/libc/misc/utmp/utxent.c +++ b/libc/misc/utmp/utxent.c @@ -71,7 +71,8 @@ void getutmp (const struct utmpx *utmpx, struct utmp *utmp) memcpy (utmp->ut_host, utmpx->ut_host, sizeof (utmp->ut_host)); #endif #if _HAVE_UT_TV - 0 - utmp->ut_tv = utmpx->ut_tv; + utmp->ut_tv.tv_sec = utmpx->ut_tv.tv_sec; + utmp->ut_tv.tv_usec = utmpx->ut_tv.tv_usec; #else utmp->ut_time = utmpx->ut_time; #endif @@ -97,7 +98,8 @@ void getutmpx (const struct utmp *utmp, struct utmpx *utmpx) memcpy (utmpx->ut_host, utmp->ut_host, sizeof (utmp->ut_host)); #endif #if _HAVE_UT_TV - 0 - utmpx->ut_tv = utmp->ut_tv; + utmpx->ut_tv.tv_sec = utmp->ut_tv.tv_sec; + utmpx->ut_tv.tv_usec = utmp->ut_tv.tv_usec; #else utmpx->ut_time = utmp->ut_time; #endif -- cgit v1.2.3