summaryrefslogtreecommitdiff
path: root/networking/inetd.c
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2004-01-18 08:58:06 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2004-01-18 08:58:06 +0000
commit53766c40639172d4844b9b5a16e692ef379accb2 (patch)
treeaa11755ca85d954ddd5712334e6b16c05aabda7a /networking/inetd.c
parent65b6d8bdb6375c010d70f7aad399dae7c3ec15f6 (diff)
downloadbusybox-w32-53766c40639172d4844b9b5a16e692ef379accb2.tar.gz
busybox-w32-53766c40639172d4844b9b5a16e692ef379accb2.tar.bz2
busybox-w32-53766c40639172d4844b9b5a16e692ef379accb2.zip
Fix up a couple of bugs i introduced in yesterdays cleanup.
Diffstat (limited to 'networking/inetd.c')
-rw-r--r--networking/inetd.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/networking/inetd.c b/networking/inetd.c
index 24415fe7d..1f2b339f0 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -290,8 +290,9 @@ static char *skip(char **cpp)
290 char *cp = *cpp; 290 char *cp = *cpp;
291 char *start; 291 char *start;
292 292
293 if (*cpp == NULL) 293 if ((cpp == NULL) || (*cpp == NULL) || (**cpp == 0)) {
294 return ((char *)0); 294 return (NULL);
295 }
295 296
296again: 297again:
297 while (*cp == ' ' || *cp == '\t') 298 while (*cp == ' ' || *cp == '\t')
@@ -332,17 +333,23 @@ static struct servtab *getconfigent(void)
332 static struct servtab serv; 333 static struct servtab serv;
333 struct servtab *sep = &serv; 334 struct servtab *sep = &serv;
334 int argc; 335 int argc;
335 char *cp, *arg; 336 char *cp = NULL;
336 337 char *arg;
337more: 338more:
338 while ((cp = bb_get_chomped_line_from_file(fconfig)) && *cp == '#'); 339 do {
339 if (cp == NULL) 340 if (feof(fconfig)) {
340 return ((struct servtab *)0); 341 return ((struct servtab *)0);
342 }
343 free(cp);
344 cp = bb_get_chomped_line_from_file(fconfig);
345 } while ((cp == NULL) || (*cp == '#'));
346
341 memset((char *)sep, 0, sizeof *sep); 347 memset((char *)sep, 0, sizeof *sep);
342 sep->se_service = newstr(skip(&cp)); 348 sep->se_service = newstr(skip(&cp));
343 arg = skip(&cp); 349 arg = skip(&cp);
344 if (arg == NULL) 350 if (arg == NULL) {
345 goto more; 351 goto more;
352 }
346 353
347 if (strcmp(arg, "stream") == 0) 354 if (strcmp(arg, "stream") == 0)
348 sep->se_socktype = SOCK_STREAM; 355 sep->se_socktype = SOCK_STREAM;
@@ -369,8 +376,9 @@ more:
369 } 376 }
370 } 377 }
371 arg = skip(&cp); 378 arg = skip(&cp);
372 if (arg == NULL) 379 if (arg == NULL) {
373 goto more; 380 goto more;
381 }
374 { 382 {
375 char *s = strchr(arg, '.'); 383 char *s = strchr(arg, '.');
376 if (s) { 384 if (s) {
@@ -390,10 +398,12 @@ more:
390#ifdef INETD_FEATURE_ENABLED 398#ifdef INETD_FEATURE_ENABLED
391 const struct biltin *bi; 399 const struct biltin *bi;
392 400
393 for (bi = biltins; bi->bi_service; bi++) 401 for (bi = biltins; bi->bi_service; bi++) {
394 if (bi->bi_socktype == sep->se_socktype && 402 if ((bi->bi_socktype == sep->se_socktype) &&
395 strcmp(bi->bi_service, sep->se_service) == 0) 403 (strcmp(bi->bi_service, sep->se_service) == 0)) {
396 break; 404 break;
405 }
406 }
397 if (bi->bi_service == 0) { 407 if (bi->bi_service == 0) {
398 syslog(LOG_ERR, "internal service %s unknown", 408 syslog(LOG_ERR, "internal service %s unknown",
399 sep->se_service); 409 sep->se_service);
@@ -406,18 +416,22 @@ more:
406 sep->se_service); 416 sep->se_service);
407 goto more; 417 goto more;
408#endif 418#endif
409 } else 419 }
410#ifdef INETD_FEATURE_ENABLED 420#ifdef INETD_FEATURE_ENABLED
411 sep->se_bi = NULL 421 else {
422 sep->se_bi = NULL;
423 }
412#endif 424#endif
413 ;
414 argc = 0; 425 argc = 0;
415 for (arg = skip(&cp); cp; arg = skip(&cp)) { 426 for (arg = skip(&cp); cp && arg; arg = skip(&cp)) {
416 if (argc < MAXARGV) 427 if (argc < MAXARGV) {
417 sep->se_argv[argc++] = newstr(arg); 428 sep->se_argv[argc++] = newstr(arg);
429 }
418 } 430 }
419 while (argc <= MAXARGV) 431 while (argc <= MAXARGV) {
420 sep->se_argv[argc++] = NULL; 432 sep->se_argv[argc++] = NULL;
433 }
434
421 return (sep); 435 return (sep);
422} 436}
423 437