aboutsummaryrefslogtreecommitdiffstats
path: root/main/libc0.9.32/0001-config-parser-do-not-assume-that-realloc-return-same.patch
blob: bc08616fdfc15600f1cd06e85b277aa3d8cc31a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
From 46db9fdff735edfda088b06d619d23dec2fc3e7a Mon Sep 17 00:00:00 2001
From: Natanael Copa <natanael.copa@gmail.com>
Date: Thu, 16 Sep 2010 08:23:34 +0000
Subject: [PATCH 1/3] 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 <natanael.copa@gmail.com>
---
 libc/misc/internals/parse_config.c |    9 ++++-----
 1 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/libc/misc/internals/parse_config.c b/libc/misc/internals/parse_config.c
index 8fa324e..6734f35 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? */
-- 
1.7.2.3