swbz #23501 - define stat buffer for FTW_SLN case

Message ID xnin0xv9se.fsf@greed.delorie.com
State New
Headers show
Series
  • swbz #23501 - define stat buffer for FTW_SLN case
Related show

Commit Message

DJ Delorie Nov. 16, 2018, 6:03 a.m.
http://austingroupbugs.net/view.php?id=1121
https://sourceware.org/bugzilla/show_bug.cgi?id=23501

Tested with no regressions.

	* io/ftw.c (process_entry): Define the stat buf in the case of
	dangling symlinks, despite FTW_PHYS flag.

Comments

Florian Weimer Nov. 16, 2018, 10:29 a.m. | #1
* DJ Delorie:

> http://austingroupbugs.net/view.php?id=1121

> https://sourceware.org/bugzilla/show_bug.cgi?id=23501

>

> Tested with no regressions.

>

> 	* io/ftw.c (process_entry): Define the stat buf in the case of

> 	dangling symlinks, despite FTW_PHYS flag.

>

> diff --git a/io/ftw.c b/io/ftw.c

> index f6ecbe7d90..ac2e38333b 100644

> --- a/io/ftw.c

> +++ b/io/ftw.c

> @@ -424,7 +424,19 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name,

>        else if (data->flags & FTW_PHYS)

>  	flag = FTW_NS;

>        else if (d_type == DT_LNK)

> -	flag = FTW_SLN;

> +	{

> +	  flag = FTW_SLN;

> +

> +	  /* We don't care about any errors that occur here.  Old code

> +	     left ST undefined; a clarification at the ISO level

> +	     defines it for this case, and filling in ST is all we

> +	     need, so this is only "best effort".  */

> +	  if (dir->streamfd != -1)

> +	    FXSTATAT (_STAT_VER, dir->streamfd, name, &st,

> +		      AT_SYMLINK_NOFOLLOW);

> +	  else

> +	    LXSTAT (_STAT_VER, name, &st);

> +	}

>        else

>  	{

>  	  if (dir->streamfd != -1)


“ISO” should be “POSIX”.  This comment is very unclear to me.   Should
we use memset/bzero to get st into a defined state on error?

Thanks,
Florian
Joseph Myers Nov. 16, 2018, 4:40 p.m. | #2
I'd expect a testcase added to the testsuite here, or some explanation of 
why the issue is problematic to test for.

-- 
Joseph S. Myers
joseph@codesourcery.com

Patch

diff --git a/io/ftw.c b/io/ftw.c
index f6ecbe7d90..ac2e38333b 100644
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -424,7 +424,19 @@  process_entry (struct ftw_data *data, struct dir_data *dir, const char *name,
       else if (data->flags & FTW_PHYS)
 	flag = FTW_NS;
       else if (d_type == DT_LNK)
-	flag = FTW_SLN;
+	{
+	  flag = FTW_SLN;
+
+	  /* We don't care about any errors that occur here.  Old code
+	     left ST undefined; a clarification at the ISO level
+	     defines it for this case, and filling in ST is all we
+	     need, so this is only "best effort".  */
+	  if (dir->streamfd != -1)
+	    FXSTATAT (_STAT_VER, dir->streamfd, name, &st,
+		      AT_SYMLINK_NOFOLLOW);
+	  else
+	    LXSTAT (_STAT_VER, name, &st);
+	}
       else
 	{
 	  if (dir->streamfd != -1)