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/dnsd.c | |
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/dnsd.c')
-rw-r--r-- | networking/dnsd.c | 60 |
1 files changed, 29 insertions, 31 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 | /* |