View | Details | Raw Unified | Return to bug 226166
Collapse All | Expand All

(-)b/lib/libc/gen/fts.c (-8 / +13 lines)
Lines 303-309 fts_close(FTS *sp) Link Here
303
FTSENT *
303
FTSENT *
304
fts_read(FTS *sp)
304
fts_read(FTS *sp)
305
{
305
{
306
	FTSENT *p, *tmp;
306
	FTSENT *p, *tmp = NULL;
307
	int instr;
307
	int instr;
308
	char *t;
308
	char *t;
309
	int saved_errno;
309
	int saved_errno;
Lines 415-430 next: tmp = p; Link Here
415
			return (sp->fts_cur = p);
415
			return (sp->fts_cur = p);
416
		}
416
		}
417
417
418
		free(tmp);
419
418
		/*
420
		/*
419
		 * User may have called fts_set on the node.  If skipped,
421
		 * User may have called fts_set on the node.  If skipped,
420
		 * ignore.  If followed, get a file descriptor so we can
422
		 * ignore.  If followed, get a file descriptor so we can
421
		 * get back if necessary.
423
		 * get back if necessary.
422
		 */
424
		 */
423
		if (p->fts_instr == FTS_SKIP) {
425
		if (p->fts_instr == FTS_SKIP) {
424
			free(tmp);
425
			goto next;
426
			goto next;
426
		}
427
		}
427
		if (p->fts_instr == FTS_FOLLOW) {
428
429
name:		t = sp->fts_path + NAPPEND(p->fts_parent);
430
		*t++ = '/';
431
		memmove(t, p->fts_name, p->fts_namelen + 1);
432
433
		/*
434
		 * The tmp check ensures that we don't enter here from the
435
		 * 'goto name;' above.
436
		 */
437
		if (tmp && p->fts_instr == FTS_FOLLOW) {
428
			p->fts_info = fts_stat(sp, p, 1, -1);
438
			p->fts_info = fts_stat(sp, p, 1, -1);
429
			if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
439
			if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
430
				if ((p->fts_symfd =
440
				if ((p->fts_symfd =
Lines 437-447 next: tmp = p; Link Here
437
			p->fts_instr = FTS_NOINSTR;
447
			p->fts_instr = FTS_NOINSTR;
438
		}
448
		}
439
449
440
		free(tmp);
441
442
name:		t = sp->fts_path + NAPPEND(p->fts_parent);
443
		*t++ = '/';
444
		memmove(t, p->fts_name, p->fts_namelen + 1);
445
		return (sp->fts_cur = p);
450
		return (sp->fts_cur = p);
446
	}
451
	}
447
452

Return to bug 226166