public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: Siddhesh Poyarekar <siddhesh@sourceware.org>, libc-alpha@sourceware.org
Cc: schwab@linux-m68k.org
Subject: Re: [PATCH] Handle DT_UNKNOWN in gconv-modules.d
Date: Wed, 9 Jun 2021 14:21:28 -0300	[thread overview]
Message-ID: <beb5f7d6-e7a7-32e3-6a46-ce5ba59e2bba@linaro.org> (raw)
In-Reply-To: <20210609043835.218509-1-siddhesh@sourceware.org>



On 09/06/2021 01:38, Siddhesh Poyarekar via Libc-alpha wrote:
> On filesystems that do not support dt_type, a regular file shows up as
> DT_UNKNOWN.  Fall back to using lstat64 to read file properties in
> such cases.

The patch looks ok, but two things raised checking on this code: 1.
the code is essentially the same on both places and 2. the use of 
alloca() even when it is assured that is bounded and 2. 

The former would be nice if could consolidate it (even by adding
a file where both iconvconfig and iconv could include or even
by a GLIBC_PRIVATE symbol), but it is not a deal breaker.

But I think we should move away from alloca, even when we know it
is bounded (sorry if I didn't catch on the previous patch).  For
this specific usage we can use asprintf to create the path or use
a static PATH_MAX buffer.

> ---
>  iconv/gconv_conf.c  | 9 ++++++++-
>  iconv/iconvconfig.c | 8 +++++++-
>  2 files changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
> index c8ad8099a4..7fc3a810af 100644
> --- a/iconv/gconv_conf.c
> +++ b/iconv/gconv_conf.c
> @@ -587,7 +587,7 @@ __gconv_read_conf (void)
>  	  struct dirent *ent;
>  	  while ((ent = __readdir (confdir)) != NULL)
>  	    {
> -	      if (ent->d_type != DT_REG)
> +	      if (ent->d_type != DT_REG && ent->d_type != DT_UNKNOWN)
>  		continue;
>  
>  	      size_t len = strlen (ent->d_name);
> @@ -596,10 +596,17 @@ __gconv_read_conf (void)
>  	      if (len > strlen (suffix)
>  		  && strcmp (ent->d_name + len - strlen (suffix), suffix) == 0)
>  		{
> +		  struct stat64 st;
>  		  /* LEN <= PATH_MAX so this alloca is not unbounded.  */
>  		  char *conf = alloca (BUF_LEN + len + 1);
>  		  cp = stpcpy (conf, buf);
>  		  sprintf (cp, "/%s", ent->d_name);
> +
> +		  if (ent->d_type == DT_UNKNOWN
> +		      && (__lstat64 (conf, &st) == -1
> +			  || !S_ISREG (st.st_mode)))
> +		    continue;
> +
>  		  read_conf_file (conf, elem, elem_len, &modules, &nmodules);
>  		}
>  	    }
> diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c
> index b2a868919c..8f10f4aba8 100644
> --- a/iconv/iconvconfig.c
> +++ b/iconv/iconvconfig.c
> @@ -747,7 +747,7 @@ handle_dir (const char *dir)
>        struct dirent *ent;
>        while ((ent = readdir (confdir)) != NULL)
>  	{
> -	  if (ent->d_type != DT_REG)
> +	  if (ent->d_type != DT_REG && ent->d_type != DT_UNKNOWN)
>  	    continue;
>  
>  	  size_t len = strlen (ent->d_name);
> @@ -756,10 +756,16 @@ handle_dir (const char *dir)
>  	  if (len > strlen (suffix)
>  	      && strcmp (ent->d_name + len - strlen (suffix), suffix) == 0)
>  	    {
> +	      struct stat64 st;
>  	      /* LEN <= PATH_MAX so this alloca is not unbounded.  */
>  	      char *conf = alloca (BUF_LEN + len + 1);
>  	      cp = stpcpy (conf, buf);
>  	      sprintf (cp, "/%s", ent->d_name);
> +
> +	      if (ent->d_type == DT_UNKNOWN
> +		  && (lstat64 (conf, &st) == -1 || !S_ISREG (st.st_mode)))
> +		continue;
> +
>  	      found |= handle_file (dir, conf);
>  	    }
>  	}
> 

  reply	other threads:[~2021-06-09 17:21 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-09  4:38 Siddhesh Poyarekar
2021-06-09 17:21 ` Adhemerval Zanella [this message]
2021-06-09 18:08   ` Siddhesh Poyarekar
2021-06-09 18:27     ` Florian Weimer
2021-06-09 18:28       ` Siddhesh Poyarekar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=beb5f7d6-e7a7-32e3-6a46-ce5ba59e2bba@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.org \
    --cc=schwab@linux-m68k.org \
    --cc=siddhesh@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).