Bug 231517

Summary: fts: causes error in valgrind
Product: Base System Reporter: Nikola Kolev <koue>
Component: kernAssignee: freebsd-bugs (Nobody) <bugs>
Status: New ---    
Severity: Affects Only Me CC: cem
Priority: ---    
Version: 11.2-STABLE   
Hardware: Any   
OS: Any   

Description Nikola Kolev 2018-09-20 14:38:38 UTC
Hi,

Calling 'fts_close' immediately after 'fts_open' causes error in valgrind:

$ valgrind --track-origins=yes --tool=memcheck --leak-check=yes --show-reachable=yes ./ftstest
==76510== Memcheck, a memory error detector
==76510== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==76510== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==76510== Command: ./ftstest
==76510== 
==76510== Conditional jump or move depends on uninitialised value(s)
==76510==    at 0x4EA2297: fts_close (in /lib/libc.so.7)
==76510==    by 0x4008D9: main (in /root/fts/ftstest)
==76510==  Uninitialised value was created by a heap allocation
==76510==    at 0x4C245B1: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==76510==    by 0x4EA1F01: fts_open (in /lib/libc.so.7)
==76510==    by 0x40089E: main (in /root/fts/ftstest)
==76510== 
==76510== 
==76510== HEAP SUMMARY:
==76510==     in use at exit: 0 bytes in 0 blocks
==76510==   total heap usage: 5 allocs, 5 frees, 2,647 bytes allocated
==76510== 
==76510== All heap blocks were freed -- no leaks are possible
==76510== 
==76510== For counts of detected and suppressed errors, rerun with: -v
==76510== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)



ftstest.c
=========

#include <fts.h>
#include <stdio.h>
#include <sys/stat.h>

int
main(void) {
	FTS *fts;
	FTSENT *e;
	char *path = "/etc";
	char * const path_argv[] = { path, NULL };

	if ((fts = fts_open(path_argv, FTS_LOGICAL, NULL)) == NULL) {
		printf("fts_open error: %s\n", path);
		return (1);
	}
	fts_close(fts);
	return (0);
}



If 'fts_read' is called before 'fts_close' no complaints from vagrind.

+	while ((e = fts_read(fts)) != NULL) {
+		printf("name: %s, mtime: %ld\n", e->fts_name, e->fts_statp->st_mtime);
+	}

I don't know if its related but I found same issue in GNU maillist:
https://lists.gnu.org/archive/html/bug-gnulib/2018-05/msg00117.html