mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Improve pg_check_dir's handling of closedir() failures.
Avoid losing errno if readdir() fails and closedir() works.  This also
avoids leaking the directory handle when readdir() fails.  Commit
6f03927fce introduced logic to better
handle readdir() and closedir() failures, bu it missed these cases.
Extracted from a larger patch by Marco Nenciarini.
			
			
This commit is contained in:
		@@ -31,6 +31,7 @@ pg_check_dir(const char *dir)
 | 
			
		||||
	int			result = 1;
 | 
			
		||||
	DIR		   *chkdir;
 | 
			
		||||
	struct dirent *file;
 | 
			
		||||
	int			readdir_errno;
 | 
			
		||||
 | 
			
		||||
	chkdir = opendir(dir);
 | 
			
		||||
 | 
			
		||||
@@ -58,8 +59,15 @@ pg_check_dir(const char *dir)
 | 
			
		||||
		errno = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (errno || closedir(chkdir))
 | 
			
		||||
	if (errno)
 | 
			
		||||
		result = -1;			/* some kind of I/O error? */
 | 
			
		||||
 | 
			
		||||
	/* Close chkdir and avoid overwriting the readdir errno on success */
 | 
			
		||||
	readdir_errno = errno;
 | 
			
		||||
	if (closedir(chkdir))
 | 
			
		||||
		result = -1;			/* error executing closedir */
 | 
			
		||||
	else
 | 
			
		||||
		errno = readdir_errno;
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user