summaryrefslogtreecommitdiff
path: root/networking/inetd.c
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2004-01-20 15:32:39 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2004-01-20 15:32:39 +0000
commiteaf5bc003839fd5844db4a827b86b621f7084fad (patch)
tree05ffe080754c460a1806ae0f25e8492f56a0fe25 /networking/inetd.c
parent348672d46d91be6043b07c42209fbd649bb0fcaf (diff)
downloadbusybox-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.c155
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
288static 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
297again:
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
321static 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
331static struct servtab *getconfigent(void) 288static 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
338more: 297more:
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