readlink: use xmalloc_realpath()
Using realpath() directly with a non-NULL output buffer is unsafe because its behavior is unspecified on systems which don't have PATH_MAX (ie. Hurd) I beleive this also fixes a small bug whereby 'buf' would not be freed on 'readlink -v' with ENABLE_FEATURE_CLEANUP. Signed-off-by: Jeremie Koenig <jk@jk.fr.eu.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							daf286cda5
						
					
				
				
					commit
					b175462422
				
			@@ -36,7 +36,6 @@ int readlink_main(int argc UNUSED_PARAM, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	char *buf;
 | 
			
		||||
	char *fname;
 | 
			
		||||
	char pathbuf[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
	IF_FEATURE_READLINK_FOLLOW(
 | 
			
		||||
		unsigned opt;
 | 
			
		||||
@@ -56,7 +55,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv)
 | 
			
		||||
		logmode = LOGMODE_NONE;
 | 
			
		||||
 | 
			
		||||
	if (opt & 1) { /* -f */
 | 
			
		||||
		buf = realpath(fname, pathbuf);
 | 
			
		||||
		buf = xmalloc_realpath(fname);
 | 
			
		||||
	} else {
 | 
			
		||||
		buf = xmalloc_readlink_or_warn(fname);
 | 
			
		||||
	}
 | 
			
		||||
@@ -65,7 +64,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv)
 | 
			
		||||
		return EXIT_FAILURE;
 | 
			
		||||
	printf((opt & 2) ? "%s" : "%s\n", buf);
 | 
			
		||||
 | 
			
		||||
	if (ENABLE_FEATURE_CLEAN_UP && !opt)
 | 
			
		||||
	if (ENABLE_FEATURE_CLEAN_UP)
 | 
			
		||||
		free(buf);
 | 
			
		||||
 | 
			
		||||
	fflush_stdout_and_exit(EXIT_SUCCESS);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user