This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/1][BZ #866] glob() should match dangling symlinks.


On 10/12/2013 04:25 AM, OndÅej BÃlka wrote:
> Hi,
> 
> This is another bug in glob with patch in bugzilla from Tom Lee ready, 
> see https://sourceware.org/bugzilla/show_bug.cgi?id=866
> 
> Patch itself is ok, what is left is decide if listing dangling symlinks
> is desired behavior. 
> 
> Comments?

This patch looks good to me. We definitely want to match dangling 
symlinks. I see that Rich agrees with me in #5 of the issue.

The goal here is to make glob match what the shell would do. 
The shell should match dangling symlinks and so should glob.

The more interesting question is should we have some backwards
compatibility for old programs? I would say no. It's a bug that
we don't do exactly as the shell does and therefore the bug
should be fixed for all users of the library.

However, this needs a testcase. It needs tst-gnuglob.c to be
expanded to handle symlinks and then add a dangling symlink
and show that we capture it in the glob. That shouldn't be too
much more work since the infrastructure is all there.
 
> 	* posix/glob.c: Match dangling symlinks.
> 
> diff --git a/posix/glob.c b/posix/glob.c
> index 87d4f1b..64677aa 100644
> --- a/posix/glob.c
> +++ b/posix/glob.c
> @@ -204,7 +204,7 @@ static const char *next_brace_sub (const char *begin, int flags) __THROW;
>  
>  static int glob_in_dir (const char *pattern, const char *directory,
>  			int flags, int (*errfunc) (const char *, int),
> -			glob_t *pglob, size_t alloca_used);
> +			glob_t *pglob, size_t alloca_used, int chklnks);

s/int/bool/g and likewise throughout the use of bool and true
which avoids boolean coercion.

>  extern int __glob_pattern_type (const char *pattern, int quote)
>      attribute_hidden;
>  
> @@ -1078,7 +1078,7 @@ glob (pattern, flags, errfunc, pglob)
>  	  status = glob_in_dir (filename, dirs.gl_pathv[i],
>  				((flags | GLOB_APPEND)
>  				 & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
> -				errfunc, pglob, alloca_used);
> +				errfunc, pglob, alloca_used, 1);
>  	  if (status == GLOB_NOMATCH)
>  	    /* No matches in this directory.  Try the next.  */
>  	    continue;
> @@ -1185,7 +1185,7 @@ glob (pattern, flags, errfunc, pglob)
>        if (dirname_modified)
>  	flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
>        status = glob_in_dir (filename, dirname, flags, errfunc, pglob,
> -			    alloca_used);
> +			    alloca_used, 0);
>        if (status != 0)
>  	{
>  	  if (status == GLOB_NOMATCH && flags != orig_flags
> @@ -1462,7 +1462,7 @@ link_exists2_p (const char *dir, size_t dirlen, const char *fname,
>  static int
>  glob_in_dir (const char *pattern, const char *directory, int flags,
>  	     int (*errfunc) (const char *, int),
> -	     glob_t *pglob, size_t alloca_used)
> +	     glob_t *pglob, size_t alloca_used, int chklnks)
>  {
>    size_t dirlen = strlen (directory);
>    void *stream = NULL;
> @@ -1605,8 +1605,8 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
>  		  /* If the file we found is a symlink we have to
>  		     make sure the target file exists.  */
>  		  if (!DIRENT_MIGHT_BE_SYMLINK (d)
> -		      || link_exists_p (dfd, directory, dirlen, name, pglob,
> -					flags))
> +		      || (chklnks ? link_exists_p (dfd, directory, dirlen, name, pglob,
> +					flags) : 1))
>  		    {
>  		      if (cur == names->count)
>  			{
> 

Cheers,
Carlos.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]