public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort
@ 2021-11-28  2:49 apinski
  2021-11-28 20:13 ` Jeff Law
  0 siblings, 1 reply; 5+ messages in thread
From: apinski @ 2021-11-28  2:49 UTC (permalink / raw)
  To: gcc-patches; +Cc: Andrew Pinski

From: Andrew Pinski <apinski@marvell.com>

Even though I cannot reproduce the ICE any more, this is still
a bug. We check already to see if we can access the directory
but never check to see if the path is actually a directory.

This adds the check and now we reject the file as not usable
as a tmp directory.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

libiberty/ChangeLog:

	* make-temp-file.c (try_dir): Check to see if the dir
	is actually a directory.
---
 libiberty/make-temp-file.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
index 31f87fbcfde..11eb03d12ec 100644
--- a/libiberty/make-temp-file.c
+++ b/libiberty/make-temp-file.c
@@ -39,6 +39,10 @@ Boston, MA 02110-1301, USA.  */
 #if defined(_WIN32) && !defined(__CYGWIN__)
 #include <windows.h>
 #endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
 
 #ifndef R_OK
 #define R_OK 4
@@ -76,7 +80,17 @@ try_dir (const char *dir, const char *base)
     return base;
   if (dir != 0
       && access (dir, R_OK | W_OK | X_OK) == 0)
-    return dir;
+    {
+      /* Check to make sure dir is actually a directory. */
+#ifdef S_ISDIR
+      struct stat s;
+      if (stat(dir, &s))
+	return NULL;
+      if (!S_ISDIR (s.st_mode))
+	return NULL;
+#endif
+      return dir;
+    }
   return 0;
 }
 
-- 
2.27.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort
  2021-11-28  2:49 [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort apinski
@ 2021-11-28 20:13 ` Jeff Law
  2021-11-29  0:41   ` Andrew Pinski
  0 siblings, 1 reply; 5+ messages in thread
From: Jeff Law @ 2021-11-28 20:13 UTC (permalink / raw)
  To: apinski, gcc-patches



On 11/27/2021 7:49 PM, apinski--- via Gcc-patches wrote:
> From: Andrew Pinski <apinski@marvell.com>
>
> Even though I cannot reproduce the ICE any more, this is still
> a bug. We check already to see if we can access the directory
> but never check to see if the path is actually a directory.
>
> This adds the check and now we reject the file as not usable
> as a tmp directory.
>
> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
>
> libiberty/ChangeLog:
>
> 	* make-temp-file.c (try_dir): Check to see if the dir
> 	is actually a directory.
> ---
>   libiberty/make-temp-file.c | 16 +++++++++++++++-
>   1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
> index 31f87fbcfde..11eb03d12ec 100644
> --- a/libiberty/make-temp-file.c
> +++ b/libiberty/make-temp-file.c
> @@ -39,6 +39,10 @@ Boston, MA 02110-1301, USA.  */
>   #if defined(_WIN32) && !defined(__CYGWIN__)
>   #include <windows.h>
>   #endif
> +#if HAVE_SYS_STAT_H
> +#include <sys/stat.h>
> +#endif
> +
>   
>   #ifndef R_OK
>   #define R_OK 4
> @@ -76,7 +80,17 @@ try_dir (const char *dir, const char *base)
>       return base;
>     if (dir != 0
>         && access (dir, R_OK | W_OK | X_OK) == 0)
> -    return dir;
> +    {
> +      /* Check to make sure dir is actually a directory. */
> +#ifdef S_ISDIR
> +      struct stat s;
> +      if (stat(dir, &s))
Formatting nit, missing whitespace between stat and open paren.

Presumably this doesn't fix the problem in the case where S_ISDIR is not 
defined.  But it's still an improvement.  OK with the nit fixed.

jeff


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort
  2021-11-28 20:13 ` Jeff Law
@ 2021-11-29  0:41   ` Andrew Pinski
  2021-11-29  8:53     ` Richard Biener
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Pinski @ 2021-11-29  0:41 UTC (permalink / raw)
  To: Jeff Law; +Cc: Andrew Pinski, GCC Patches

On Sun, Nov 28, 2021 at 12:14 PM Jeff Law via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
>
>
> On 11/27/2021 7:49 PM, apinski--- via Gcc-patches wrote:
> > From: Andrew Pinski <apinski@marvell.com>
> >
> > Even though I cannot reproduce the ICE any more, this is still
> > a bug. We check already to see if we can access the directory
> > but never check to see if the path is actually a directory.
> >
> > This adds the check and now we reject the file as not usable
> > as a tmp directory.
> >
> > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
> >
> > libiberty/ChangeLog:
> >
> >       * make-temp-file.c (try_dir): Check to see if the dir
> >       is actually a directory.
> > ---
> >   libiberty/make-temp-file.c | 16 +++++++++++++++-
> >   1 file changed, 15 insertions(+), 1 deletion(-)
> >
> > diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
> > index 31f87fbcfde..11eb03d12ec 100644
> > --- a/libiberty/make-temp-file.c
> > +++ b/libiberty/make-temp-file.c
> > @@ -39,6 +39,10 @@ Boston, MA 02110-1301, USA.  */
> >   #if defined(_WIN32) && !defined(__CYGWIN__)
> >   #include <windows.h>
> >   #endif
> > +#if HAVE_SYS_STAT_H
> > +#include <sys/stat.h>
> > +#endif
> > +
> >
> >   #ifndef R_OK
> >   #define R_OK 4
> > @@ -76,7 +80,17 @@ try_dir (const char *dir, const char *base)
> >       return base;
> >     if (dir != 0
> >         && access (dir, R_OK | W_OK | X_OK) == 0)
> > -    return dir;
> > +    {
> > +      /* Check to make sure dir is actually a directory. */
> > +#ifdef S_ISDIR
> > +      struct stat s;
> > +      if (stat(dir, &s))
> Formatting nit, missing whitespace between stat and open paren.
>
> Presumably this doesn't fix the problem in the case where S_ISDIR is not
> defined.  But it's still an improvement.  OK with the nit fixed.

Correct, though I don't know of any host where S_ISDIR is not defined.
Mingw has them defined. So does cygwin. glibc (and all libc on Linux)
has them defined, Solaris and AIX has them defined. So Does Mac OS X.


MSVC does not define them but we don't support MSVC to compile GCC so
that should not be an issue.

Thanks,
Andrew

>
> jeff
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort
  2021-11-29  0:41   ` Andrew Pinski
@ 2021-11-29  8:53     ` Richard Biener
  2021-11-29  8:56       ` Richard Biener
  0 siblings, 1 reply; 5+ messages in thread
From: Richard Biener @ 2021-11-29  8:53 UTC (permalink / raw)
  To: Andrew Pinski; +Cc: Jeff Law, Andrew Pinski, GCC Patches

On Mon, Nov 29, 2021 at 1:42 AM Andrew Pinski via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On Sun, Nov 28, 2021 at 12:14 PM Jeff Law via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
> >
> >
> >
> > On 11/27/2021 7:49 PM, apinski--- via Gcc-patches wrote:
> > > From: Andrew Pinski <apinski@marvell.com>
> > >
> > > Even though I cannot reproduce the ICE any more, this is still
> > > a bug. We check already to see if we can access the directory
> > > but never check to see if the path is actually a directory.
> > >
> > > This adds the check and now we reject the file as not usable
> > > as a tmp directory.
> > >
> > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
> > >
> > > libiberty/ChangeLog:
> > >
> > >       * make-temp-file.c (try_dir): Check to see if the dir
> > >       is actually a directory.
> > > ---
> > >   libiberty/make-temp-file.c | 16 +++++++++++++++-
> > >   1 file changed, 15 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
> > > index 31f87fbcfde..11eb03d12ec 100644
> > > --- a/libiberty/make-temp-file.c
> > > +++ b/libiberty/make-temp-file.c
> > > @@ -39,6 +39,10 @@ Boston, MA 02110-1301, USA.  */
> > >   #if defined(_WIN32) && !defined(__CYGWIN__)
> > >   #include <windows.h>
> > >   #endif
> > > +#if HAVE_SYS_STAT_H
> > > +#include <sys/stat.h>
> > > +#endif
> > > +
> > >
> > >   #ifndef R_OK
> > >   #define R_OK 4
> > > @@ -76,7 +80,17 @@ try_dir (const char *dir, const char *base)
> > >       return base;
> > >     if (dir != 0
> > >         && access (dir, R_OK | W_OK | X_OK) == 0)
> > > -    return dir;
> > > +    {
> > > +      /* Check to make sure dir is actually a directory. */
> > > +#ifdef S_ISDIR
> > > +      struct stat s;
> > > +      if (stat(dir, &s))

I wonder if we can instead do access (dir "/.") or so where access
should complain with ENOTDIR since 'dir' isn't a directory?

Richard.

> > Formatting nit, missing whitespace between stat and open paren.
> >
> > Presumably this doesn't fix the problem in the case where S_ISDIR is not
> > defined.  But it's still an improvement.  OK with the nit fixed.
>
> Correct, though I don't know of any host where S_ISDIR is not defined.
> Mingw has them defined. So does cygwin. glibc (and all libc on Linux)
> has them defined, Solaris and AIX has them defined. So Does Mac OS X.
>
>
> MSVC does not define them but we don't support MSVC to compile GCC so
> that should not be an issue.
>
> Thanks,
> Andrew
>
> >
> > jeff
> >

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort
  2021-11-29  8:53     ` Richard Biener
@ 2021-11-29  8:56       ` Richard Biener
  0 siblings, 0 replies; 5+ messages in thread
From: Richard Biener @ 2021-11-29  8:56 UTC (permalink / raw)
  To: Andrew Pinski; +Cc: Jeff Law, Andrew Pinski, GCC Patches

On Mon, Nov 29, 2021 at 9:53 AM Richard Biener
<richard.guenther@gmail.com> wrote:
>
> On Mon, Nov 29, 2021 at 1:42 AM Andrew Pinski via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
> >
> > On Sun, Nov 28, 2021 at 12:14 PM Jeff Law via Gcc-patches
> > <gcc-patches@gcc.gnu.org> wrote:
> > >
> > >
> > >
> > > On 11/27/2021 7:49 PM, apinski--- via Gcc-patches wrote:
> > > > From: Andrew Pinski <apinski@marvell.com>
> > > >
> > > > Even though I cannot reproduce the ICE any more, this is still
> > > > a bug. We check already to see if we can access the directory
> > > > but never check to see if the path is actually a directory.
> > > >
> > > > This adds the check and now we reject the file as not usable
> > > > as a tmp directory.
> > > >
> > > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
> > > >
> > > > libiberty/ChangeLog:
> > > >
> > > >       * make-temp-file.c (try_dir): Check to see if the dir
> > > >       is actually a directory.
> > > > ---
> > > >   libiberty/make-temp-file.c | 16 +++++++++++++++-
> > > >   1 file changed, 15 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
> > > > index 31f87fbcfde..11eb03d12ec 100644
> > > > --- a/libiberty/make-temp-file.c
> > > > +++ b/libiberty/make-temp-file.c
> > > > @@ -39,6 +39,10 @@ Boston, MA 02110-1301, USA.  */
> > > >   #if defined(_WIN32) && !defined(__CYGWIN__)
> > > >   #include <windows.h>
> > > >   #endif
> > > > +#if HAVE_SYS_STAT_H
> > > > +#include <sys/stat.h>
> > > > +#endif
> > > > +
> > > >
> > > >   #ifndef R_OK
> > > >   #define R_OK 4
> > > > @@ -76,7 +80,17 @@ try_dir (const char *dir, const char *base)
> > > >       return base;
> > > >     if (dir != 0
> > > >         && access (dir, R_OK | W_OK | X_OK) == 0)
> > > > -    return dir;
> > > > +    {
> > > > +      /* Check to make sure dir is actually a directory. */
> > > > +#ifdef S_ISDIR
> > > > +      struct stat s;
> > > > +      if (stat(dir, &s))
>
> I wonder if we can instead do access (dir "/.") or so where access
> should complain with ENOTDIR since 'dir' isn't a directory?

On Linux it is enough to add DIR_SEPARATOR to 'dir' passed to access.
One would have to check other OSes (if they maybe fail to correctly
handle trailing DIR_SEPARATOR at all).

>
> Richard.
>
> > > Formatting nit, missing whitespace between stat and open paren.
> > >
> > > Presumably this doesn't fix the problem in the case where S_ISDIR is not
> > > defined.  But it's still an improvement.  OK with the nit fixed.
> >
> > Correct, though I don't know of any host where S_ISDIR is not defined.
> > Mingw has them defined. So does cygwin. glibc (and all libc on Linux)
> > has them defined, Solaris and AIX has them defined. So Does Mac OS X.
> >
> >
> > MSVC does not define them but we don't support MSVC to compile GCC so
> > that should not be an issue.
> >
> > Thanks,
> > Andrew
> >
> > >
> > > jeff
> > >

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-11-29  8:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-28  2:49 [PATCH] Fix PR 19089: Environment variable TMP may yield gcc: abort apinski
2021-11-28 20:13 ` Jeff Law
2021-11-29  0:41   ` Andrew Pinski
2021-11-29  8:53     ` Richard Biener
2021-11-29  8:56       ` Richard Biener

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).