Re: [patch] S_ISDIR() check in yacc TMPDIR

2016-06-21 Thread Theo de Raadt
> Sending this to tech list as suggested by mmcc@...
> 
> The yacc(1) manual mentions TMPDIR is an extension.
> The following patch re-factors the checks around TMPDIR.
> This adds an explicit check for TMPDIR-is-a-directory.
> With this patch applied, yacc can more reliably determine when it
> should use _PATH_TMP.

I don't see anything which says it should switch to /tmp if
$TMPDIR isn't a directory.

Right now, it nicely fails when mkstemp is called.  All other
TMPDIR-using programs work that way.

So I don't see the point.



[patch] S_ISDIR() check in yacc TMPDIR

2016-06-21 Thread Michael W. Bombardieri
Hello,

Sending this to tech list as suggested by mmcc@...

The yacc(1) manual mentions TMPDIR is an extension.
The following patch re-factors the checks around TMPDIR.
This adds an explicit check for TMPDIR-is-a-directory.
With this patch applied, yacc can more reliably determine when it
should use _PATH_TMP.

- Michael


Index: main.c
===
RCS file: /cvs/src/usr.bin/yacc/main.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 main.c
--- main.c  10 Oct 2015 14:23:47 -  1.27
+++ main.c  21 Jun 2016 03:47:30 -
@@ -33,6 +33,7 @@
  * SUCH DAMAGE.
  */
 
+#include 
 #include 
 #include 
 #include 
@@ -225,6 +226,18 @@ allocate(size_t n)
return (v);
 }
 
+char *
+tmp_dir(void)
+{
+   struct stat st;
+   char *tmp;
+
+   tmp = getenv("TMPDIR");
+   if (tmp == NULL || *tmp == '\0' || lstat(tmp, ) == -1 || 
!S_ISDIR(st.st_mode))
+   return (_PATH_TMP);
+   return (tmp);
+}
+
 #define TEMPNAME(s, c, d, l)   \
(asprintf(&(s), "%.*s/yacc.%xXX", (int)(l), (d), (c)))
 
@@ -234,9 +247,7 @@ create_file_names(void)
size_t len;
char *tmpdir;
 
-   if ((tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0')
-   tmpdir = _PATH_TMP;
-
+   tmpdir = tmp_dir();
len = strlen(tmpdir);
if (tmpdir[len - 1] == '/')
len--;