diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-26 23:08:31 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-26 23:08:31 +0000 |
commit | 084266ed520805bbc4ec3f9b4d14e644ecd75880 (patch) | |
tree | fe2c8531dc039c81c12a39f39fcfdf6c1b8ec996 /networking | |
parent | 8895c2073e9341d8e0348365e75ba6aa4b9b8d05 (diff) | |
download | busybox-w32-084266ed520805bbc4ec3f9b4d14e644ecd75880.tar.gz busybox-w32-084266ed520805bbc4ec3f9b4d14e644ecd75880.tar.bz2 busybox-w32-084266ed520805bbc4ec3f9b4d14e644ecd75880.zip |
fix several problems with config parser:
a bug where it underflows the string
a bug where it never frees parser_t struct
make read_config() return 0 if parser is NULL,
make config_close() accept and ignore NULL parser -
eliminates many if() blocks
reverse the sense of parser bit flags - negative flags
are harder to grok.
hexdump: revert the change to use config parser, it is BIGGER
and also requires additional quirks in parser
*: explicitly use PARSER_NORMAL instead of 0
function old new delta
login_main 1575 1596 +21
config_close 18 29 +11
bbunpack 383 391 +8
qgravechar 106 109 +3
rtnl_tab_initialize 121 117 -4
expand 1697 1693 -4
man_main 717 712 -5
nameif_main 674 668 -6
hexdump_main 597 591 -6
read_config 217 209 -8
dnsd_main 1478 1470 -8
sysctl_main 203 189 -14
config_open2 44 25 -19
make_device 1177 1141 -36
config_read 597 549 -48
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/11 up/down: 43/-158) Total: -115 bytes
Diffstat (limited to 'networking')
-rw-r--r-- | networking/dnsd.c | 60 | ||||
-rw-r--r-- | networking/hostname.c | 2 | ||||
-rw-r--r-- | networking/libiproute/rt_names.c | 4 | ||||
-rw-r--r-- | networking/nameif.c | 10 | ||||
-rw-r--r-- | networking/udhcp/files.c | 5 |
5 files changed, 36 insertions, 45 deletions
diff --git a/networking/dnsd.c b/networking/dnsd.c index efb5cfba7..e8dcb404b 100644 --- a/networking/dnsd.c +++ b/networking/dnsd.c | |||
@@ -106,43 +106,41 @@ static void undot(uint8_t * rip) | |||
106 | */ | 106 | */ |
107 | static void dnsentryinit(void) | 107 | static void dnsentryinit(void) |
108 | { | 108 | { |
109 | char *token[2]; | ||
109 | parser_t *parser; | 110 | parser_t *parser; |
110 | struct dns_entry *m, *prev; | 111 | struct dns_entry *m, *prev; |
111 | 112 | ||
112 | prev = dnsentry = NULL; | 113 | prev = dnsentry = NULL; |
113 | parser = config_open(fileconf); | 114 | parser = config_open(fileconf); |
114 | if (parser) { | 115 | while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) { |
115 | char *token[2]; | 116 | unsigned a, b, c, d; |
116 | while (config_read(parser, token, 2, 2, "# \t", 0)) { | 117 | /* |
117 | unsigned int a,b,c,d; | 118 | * Assumes all host names are lower case only |
118 | /* | 119 | * Hostnames with more than one label are not handled correctly. |
119 | * Assumes all host names are lower case only | 120 | * Presently the dot is copied into name without |
120 | * Hostnames with more than one label are not handled correctly. | 121 | * converting to a length/string substring for that label. |
121 | * Presently the dot is copied into name without | 122 | */ |
122 | * converting to a length/string substring for that label. | 123 | // if (!token[1] || sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4) |
123 | */ | 124 | if (sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4) |
124 | // if (!token[1] || sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4) | 125 | continue; |
125 | if (sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4) | 126 | |
126 | continue; | 127 | m = xzalloc(sizeof(*m)); |
127 | 128 | /*m->next = NULL;*/ | |
128 | m = xzalloc(sizeof(*m)); | 129 | sprintf(m->ip, ".%u.%u.%u.%u"+1, a, b, c, d); |
129 | /*m->next = NULL;*/ | 130 | sprintf(m->rip, ".%u.%u.%u.%u", d, c, b, a); |
130 | sprintf(m->ip, ".%u.%u.%u.%u"+1, a, b, c, d); | 131 | undot((uint8_t*)m->rip); |
131 | sprintf(m->rip, ".%u.%u.%u.%u", d, c, b, a); | 132 | convname(m->name, (uint8_t*)token[0]); |
132 | undot((uint8_t*)m->rip); | 133 | |
133 | convname(m->name, (uint8_t*)token[0]); | 134 | if (OPT_verbose) |
134 | 135 | fprintf(stderr, "\tname:%s, ip:%s\n", &(m->name[1]), m->ip); | |
135 | if (OPT_verbose) | 136 | |
136 | fprintf(stderr, "\tname:%s, ip:%s\n", &(m->name[1]), m->ip); | 137 | if (prev == NULL) |
137 | 138 | dnsentry = m; | |
138 | if (prev == NULL) | 139 | else |
139 | dnsentry = m; | 140 | prev->next = m; |
140 | else | 141 | prev = m; |
141 | prev->next = m; | ||
142 | prev = m; | ||
143 | } | ||
144 | config_close(parser); | ||
145 | } | 142 | } |
143 | config_close(parser); | ||
146 | } | 144 | } |
147 | 145 | ||
148 | /* | 146 | /* |
diff --git a/networking/hostname.c b/networking/hostname.c index dd2a20689..48e70db91 100644 --- a/networking/hostname.c +++ b/networking/hostname.c | |||
@@ -20,7 +20,7 @@ static void do_sethostname(char *s, int isfile) | |||
20 | return; | 20 | return; |
21 | if (isfile) { | 21 | if (isfile) { |
22 | parser_t *parser = config_open2(s, xfopen_for_read); | 22 | parser_t *parser = config_open2(s, xfopen_for_read); |
23 | while (config_read(parser, &s, 1, 1, "# \t", 0)) { | 23 | while (config_read(parser, &s, 1, 1, "# \t", PARSE_NORMAL & ~PARSE_GREEDY)) { |
24 | do_sethostname(s, 0); | 24 | do_sethostname(s, 0); |
25 | } | 25 | } |
26 | if (ENABLE_FEATURE_CLEAN_UP) | 26 | if (ENABLE_FEATURE_CLEAN_UP) |
diff --git a/networking/libiproute/rt_names.c b/networking/libiproute/rt_names.c index 1a2d52e86..e4d10613b 100644 --- a/networking/libiproute/rt_names.c +++ b/networking/libiproute/rt_names.c | |||
@@ -20,9 +20,7 @@ static void rtnl_tab_initialize(const char *file, const char **tab, int size) | |||
20 | { | 20 | { |
21 | char *token[2]; | 21 | char *token[2]; |
22 | parser_t *parser = config_open2(file, fopen_for_read); | 22 | parser_t *parser = config_open2(file, fopen_for_read); |
23 | if (!parser) | 23 | while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) { |
24 | return; | ||
25 | while (config_read(parser, token, 2, 2, "# \t", 0)) { | ||
26 | int id = bb_strtou(token[0], NULL, 0); | 24 | int id = bb_strtou(token[0], NULL, 0); |
27 | if (id < 0 || id > size) { | 25 | if (id < 0 || id > size) { |
28 | bb_error_msg("database %s is corrupted at line %d", | 26 | bb_error_msg("database %s is corrupted at line %d", |
diff --git a/networking/nameif.c b/networking/nameif.c index 5a3bd606f..12c08f13b 100644 --- a/networking/nameif.c +++ b/networking/nameif.c | |||
@@ -160,13 +160,11 @@ int nameif_main(int argc, char **argv) | |||
160 | prepend_new_eth_table(&clist, ifname, *argv++); | 160 | prepend_new_eth_table(&clist, ifname, *argv++); |
161 | } | 161 | } |
162 | } else { | 162 | } else { |
163 | char *tokens[2]; | ||
163 | struct parser_t *parser = config_open(fname); | 164 | struct parser_t *parser = config_open(fname); |
164 | if (parser) { | 165 | while (config_read(parser, tokens, 2, 2, "# \t", PARSE_NORMAL)) |
165 | char *tokens[2]; | 166 | prepend_new_eth_table(&clist, tokens[0], tokens[1]); |
166 | while (config_read(parser, tokens, 2, 2, "# \t", 0)) | 167 | config_close(parser); |
167 | prepend_new_eth_table(&clist, tokens[0], tokens[1]); | ||
168 | config_close(parser); | ||
169 | } | ||
170 | } | 168 | } |
171 | 169 | ||
172 | ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0); | 170 | ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0); |
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 264a98899..ff5847d25 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c | |||
@@ -318,10 +318,7 @@ void read_config(const char *file) | |||
318 | keywords[i].handler(keywords[i].def, keywords[i].var); | 318 | keywords[i].handler(keywords[i].def, keywords[i].var); |
319 | 319 | ||
320 | parser = config_open(file); | 320 | parser = config_open(file); |
321 | if (!parser) | 321 | while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) { |
322 | return; | ||
323 | |||
324 | while (config_read(parser, token, 2, 2, "# \t", PARSE_LAST_IS_GREEDY)) { | ||
325 | for (k = keywords, i = 0; i < ARRAY_SIZE(keywords); k++, i++) { | 322 | for (k = keywords, i = 0; i < ARRAY_SIZE(keywords); k++, i++) { |
326 | if (!strcasecmp(token[0], k->keyword)) { | 323 | if (!strcasecmp(token[0], k->keyword)) { |
327 | if (!k->handler(token[1], k->var)) { | 324 | if (!k->handler(token[1], k->var)) { |