diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c index eda1722139c6..e253145c3677 100644 --- a/lib/libc/gen/fts.c +++ b/lib/libc/gen/fts.c @@ -303,7 +303,7 @@ fts_close(FTS *sp) FTSENT * fts_read(FTS *sp) { - FTSENT *p, *tmp; + FTSENT *p, *tmp = NULL; int instr; char *t; int saved_errno; @@ -415,16 +415,26 @@ next: tmp = p; return (sp->fts_cur = p); } + free(tmp); + /* * User may have called fts_set on the node. If skipped, * ignore. If followed, get a file descriptor so we can * get back if necessary. */ if (p->fts_instr == FTS_SKIP) { - free(tmp); goto next; } - if (p->fts_instr == FTS_FOLLOW) { + +name: t = sp->fts_path + NAPPEND(p->fts_parent); + *t++ = '/'; + memmove(t, p->fts_name, p->fts_namelen + 1); + + /* + * The tmp check ensures that we don't enter here from the + * 'goto name;' above. + */ + if (tmp && p->fts_instr == FTS_FOLLOW) { p->fts_info = fts_stat(sp, p, 1, -1); if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { if ((p->fts_symfd = @@ -437,11 +447,6 @@ next: tmp = p; p->fts_instr = FTS_NOINSTR; } - free(tmp); - -name: t = sp->fts_path + NAPPEND(p->fts_parent); - *t++ = '/'; - memmove(t, p->fts_name, p->fts_namelen + 1); return (sp->fts_cur = p); }