diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2004-01-20 15:32:39 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2004-01-20 15:32:39 +0000 |
commit | eaf5bc003839fd5844db4a827b86b621f7084fad (patch) | |
tree | 05ffe080754c460a1806ae0f25e8492f56a0fe25 /networking/inetd.c | |
parent | 348672d46d91be6043b07c42209fbd649bb0fcaf (diff) | |
download | busybox-w32-eaf5bc003839fd5844db4a827b86b621f7084fad.tar.gz busybox-w32-eaf5bc003839fd5844db4a827b86b621f7084fad.tar.bz2 busybox-w32-eaf5bc003839fd5844db4a827b86b621f7084fad.zip |
Redo getconfigent, save 150 bytes, still small memory leak when
parsing invalid entries.
Diffstat (limited to 'networking/inetd.c')
-rw-r--r-- | networking/inetd.c | 155 |
1 files changed, 75 insertions, 80 deletions
diff --git a/networking/inetd.c b/networking/inetd.c index 1f2b339f0..eb61299c2 100644 --- a/networking/inetd.c +++ b/networking/inetd.c | |||
@@ -285,116 +285,110 @@ syslog_err_and_discard_dg(int se_socktype, const char *msg, ...) | |||
285 | _exit(1); | 285 | _exit(1); |
286 | } | 286 | } |
287 | 287 | ||
288 | static char *skip(char **cpp) | ||
289 | { | ||
290 | char *cp = *cpp; | ||
291 | char *start; | ||
292 | |||
293 | if ((cpp == NULL) || (*cpp == NULL) || (**cpp == 0)) { | ||
294 | return (NULL); | ||
295 | } | ||
296 | |||
297 | again: | ||
298 | while (*cp == ' ' || *cp == '\t') | ||
299 | cp++; | ||
300 | if (*cp == '\0') { | ||
301 | int c; | ||
302 | |||
303 | c = getc(fconfig); | ||
304 | (void) ungetc(c, fconfig); | ||
305 | if (c == ' ' || c == '\t') | ||
306 | cp = bb_get_chomped_line_from_file(fconfig); | ||
307 | if (cp != NULL) | ||
308 | goto again; | ||
309 | *cpp = NULL; | ||
310 | return NULL; | ||
311 | } | ||
312 | start = cp; | ||
313 | while (*cp && *cp != ' ' && *cp != '\t') | ||
314 | cp++; | ||
315 | if (*cp != '\0') | ||
316 | *cp++ = '\0'; | ||
317 | *cpp = cp; | ||
318 | return (start); | ||
319 | } | ||
320 | |||
321 | static char *newstr(char *cp) | ||
322 | { | ||
323 | cp = strdup(cp ? cp : ""); | ||
324 | if (cp) | ||
325 | return(cp); | ||
326 | |||
327 | syslog_err_and_discard_dg(SOCK_STREAM, "strdup: %m"); | ||
328 | } | ||
329 | |||
330 | |||
331 | static struct servtab *getconfigent(void) | 288 | static struct servtab *getconfigent(void) |
332 | { | 289 | { |
333 | static struct servtab serv; | 290 | static struct servtab serv; |
334 | struct servtab *sep = &serv; | 291 | struct servtab *sep = &serv; |
335 | int argc; | 292 | int argc; |
336 | char *cp = NULL; | 293 | char *cp = NULL; |
337 | char *arg; | 294 | char *cp_ptr; |
295 | char *cp_ptr_ptr = NULL; | ||
296 | |||
338 | more: | 297 | more: |
339 | do { | 298 | free(cp); |
340 | if (feof(fconfig)) { | 299 | cp = bb_get_chomped_line_from_file(fconfig); |
341 | return ((struct servtab *)0); | 300 | if (feof(fconfig)) { |
342 | } | ||
343 | free(cp); | 301 | free(cp); |
344 | cp = bb_get_chomped_line_from_file(fconfig); | 302 | return (NULL); |
345 | } while ((cp == NULL) || (*cp == '#')); | 303 | } |
304 | if ((cp == NULL) || (*cp == '#')) { | ||
305 | goto more; | ||
306 | } | ||
307 | printf("line is %s\n", cp); | ||
346 | 308 | ||
347 | memset((char *)sep, 0, sizeof *sep); | 309 | cp_ptr = strtok_r(cp, " \t", &cp_ptr_ptr); |
348 | sep->se_service = newstr(skip(&cp)); | 310 | if (cp_ptr == NULL) { |
349 | arg = skip(&cp); | 311 | printf("error\n"); |
350 | if (arg == NULL) { | 312 | /* Error */ |
351 | goto more; | 313 | goto more; |
352 | } | 314 | } |
315 | sep->se_service = bb_xstrdup(cp_ptr); | ||
353 | 316 | ||
354 | if (strcmp(arg, "stream") == 0) | 317 | cp_ptr = strtok_r(NULL, " \t", &cp_ptr_ptr); |
318 | if (cp_ptr == NULL) { | ||
319 | printf("error\n"); | ||
320 | /* Error */ | ||
321 | goto more; | ||
322 | } | ||
323 | if (strcmp(cp_ptr, "stream") == 0) | ||
355 | sep->se_socktype = SOCK_STREAM; | 324 | sep->se_socktype = SOCK_STREAM; |
356 | else if (strcmp(arg, "dgram") == 0) | 325 | else if (strcmp(cp_ptr, "dgram") == 0) |
357 | sep->se_socktype = SOCK_DGRAM; | 326 | sep->se_socktype = SOCK_DGRAM; |
358 | else if (strcmp(arg, "rdm") == 0) | 327 | else if (strcmp(cp_ptr, "rdm") == 0) |
359 | sep->se_socktype = SOCK_RDM; | 328 | sep->se_socktype = SOCK_RDM; |
360 | else if (strcmp(arg, "seqpacket") == 0) | 329 | else if (strcmp(cp_ptr, "seqpacket") == 0) |
361 | sep->se_socktype = SOCK_SEQPACKET; | 330 | sep->se_socktype = SOCK_SEQPACKET; |
362 | else if (strcmp(arg, "raw") == 0) | 331 | else if (strcmp(cp_ptr, "raw") == 0) |
363 | sep->se_socktype = SOCK_RAW; | 332 | sep->se_socktype = SOCK_RAW; |
364 | else | 333 | else |
365 | sep->se_socktype = -1; | 334 | sep->se_socktype = -1; |
366 | 335 | ||
367 | sep->se_proto = newstr(skip(&cp)); | 336 | cp_ptr = strtok_r(NULL, " \t", &cp_ptr_ptr); |
368 | if (strcmp(sep->se_proto, "unix") == 0) { | 337 | if (cp_ptr == NULL) { |
338 | printf("error\n"); | ||
339 | /* error */ | ||
340 | goto more; | ||
341 | } | ||
342 | if (strcmp(cp_ptr, "unix") == 0) { | ||
369 | sep->se_family = AF_UNIX; | 343 | sep->se_family = AF_UNIX; |
370 | } else { | 344 | } else { |
371 | sep->se_family = AF_INET; | 345 | if (strncmp(cp_ptr, "rpc/", 4) == 0) { |
372 | if (strncmp(sep->se_proto, "rpc/", 4) == 0) { | ||
373 | syslog(LOG_ERR, "%s: rpc services not suported", | 346 | syslog(LOG_ERR, "%s: rpc services not suported", |
374 | sep->se_service); | 347 | sep->se_service); |
375 | goto more; | 348 | goto more; |
376 | } | 349 | } |
350 | sep->se_family = AF_INET; | ||
377 | } | 351 | } |
378 | arg = skip(&cp); | 352 | sep->se_proto = bb_xstrdup(cp_ptr); |
379 | if (arg == NULL) { | 353 | |
354 | cp_ptr = strtok_r(NULL, " \t", &cp_ptr_ptr); | ||
355 | if (cp_ptr == NULL) { | ||
356 | printf("error\n"); | ||
357 | /* error */ | ||
380 | goto more; | 358 | goto more; |
381 | } | 359 | } |
382 | { | 360 | { |
383 | char *s = strchr(arg, '.'); | 361 | char *s = strchr(cp_ptr, '.'); |
384 | if (s) { | 362 | if (s) { |
385 | *s++ = '\0'; | 363 | *s++ = '\0'; |
386 | sep->se_max = atoi(s); | 364 | sep->se_max = atoi(s); |
387 | } else | 365 | } else |
388 | sep->se_max = TOOMANY; | 366 | sep->se_max = TOOMANY; |
389 | } | 367 | } |
390 | sep->se_wait = strcmp(arg, "wait") == 0; | 368 | sep->se_wait = strcmp(cp_ptr, "wait") == 0; |
391 | sep->se_user = newstr(skip(&cp)); | 369 | |
392 | sep->se_group = strchr(sep->se_user, '.'); | 370 | cp_ptr = strtok_r(NULL, " \t", &cp_ptr_ptr); |
393 | if (sep->se_group) { | 371 | if (cp_ptr == NULL) { |
394 | *sep->se_group++ = '\0'; | 372 | printf("error\n"); |
373 | /* error */ | ||
374 | goto more; | ||
375 | } | ||
376 | { | ||
377 | char *cp_ptr2 = strchr(cp_ptr, '.'); | ||
378 | if (cp_ptr2) { | ||
379 | *cp_ptr2++ = '\0'; | ||
380 | sep->se_group = bb_xstrdup(cp_ptr2); | ||
381 | } | ||
395 | } | 382 | } |
396 | sep->se_server = newstr(skip(&cp)); | 383 | sep->se_user = bb_xstrdup(cp_ptr); |
397 | if (strcmp(sep->se_server, "internal") == 0) { | 384 | |
385 | cp_ptr = strtok_r(NULL, " \t", &cp_ptr_ptr); | ||
386 | if (cp_ptr == NULL) { | ||
387 | printf("error\n"); | ||
388 | /* error */ | ||
389 | goto more; | ||
390 | } | ||
391 | if (strcmp(cp_ptr, "internal") == 0) { | ||
398 | #ifdef INETD_FEATURE_ENABLED | 392 | #ifdef INETD_FEATURE_ENABLED |
399 | const struct biltin *bi; | 393 | const struct biltin *bi; |
400 | 394 | ||
@@ -405,16 +399,14 @@ more: | |||
405 | } | 399 | } |
406 | } | 400 | } |
407 | if (bi->bi_service == 0) { | 401 | if (bi->bi_service == 0) { |
408 | syslog(LOG_ERR, "internal service %s unknown", | 402 | syslog(LOG_ERR, "internal service %s unknown", sep->se_service); |
409 | sep->se_service); | ||
410 | goto more; | 403 | goto more; |
411 | } | 404 | } |
412 | sep->se_bi = bi; | 405 | sep->se_bi = bi; |
413 | sep->se_wait = bi->bi_wait; | 406 | sep->se_wait = bi->bi_wait; |
414 | #else | 407 | #else |
415 | syslog(LOG_ERR, "internal service %s unknown", | 408 | syslog(LOG_ERR, "internal service %s unknown", cp_ptr); |
416 | sep->se_service); | 409 | goto more; |
417 | goto more; | ||
418 | #endif | 410 | #endif |
419 | } | 411 | } |
420 | #ifdef INETD_FEATURE_ENABLED | 412 | #ifdef INETD_FEATURE_ENABLED |
@@ -422,16 +414,19 @@ more: | |||
422 | sep->se_bi = NULL; | 414 | sep->se_bi = NULL; |
423 | } | 415 | } |
424 | #endif | 416 | #endif |
417 | sep->se_server = bb_xstrdup(cp_ptr); | ||
418 | |||
425 | argc = 0; | 419 | argc = 0; |
426 | for (arg = skip(&cp); cp && arg; arg = skip(&cp)) { | 420 | while ((cp_ptr = strtok_r(NULL, " \t", &cp_ptr_ptr)) != NULL) { |
427 | if (argc < MAXARGV) { | 421 | if (argc < MAXARGV) { |
428 | sep->se_argv[argc++] = newstr(arg); | 422 | sep->se_argv[argc++] = cp_ptr; |
429 | } | 423 | } |
430 | } | 424 | } |
431 | while (argc <= MAXARGV) { | 425 | while (argc <= MAXARGV) { |
432 | sep->se_argv[argc++] = NULL; | 426 | sep->se_argv[argc++] = NULL; |
433 | } | 427 | } |
434 | 428 | ||
429 | free(cp); | ||
435 | return (sep); | 430 | return (sep); |
436 | } | 431 | } |
437 | 432 | ||