texlive[70253] Build/source/texk/kpathsea: consider exactly

commits+karl at tug.org commits+karl at tug.org
Thu Feb 29 19:02:30 CET 2024


Revision: 70253
          https://tug.org/svn/texlive?view=revision&revision=70253
Author:   karl
Date:     2024-02-29 19:02:29 +0100 (Thu, 29 Feb 2024)
Log Message:
-----------
consider exactly $TEXMF[SYS]VAR safe (to allow mkdir from lua)

Modified Paths:
--------------
    trunk/Build/source/texk/kpathsea/ChangeLog
    trunk/Build/source/texk/kpathsea/tests/kpsesafe.test
    trunk/Build/source/texk/kpathsea/tex-file.c

Modified: trunk/Build/source/texk/kpathsea/ChangeLog
===================================================================
--- trunk/Build/source/texk/kpathsea/ChangeLog	2024-02-29 17:33:37 UTC (rev 70252)
+++ trunk/Build/source/texk/kpathsea/ChangeLog	2024-02-29 18:02:29 UTC (rev 70253)
@@ -1,3 +1,9 @@
+2024-02-29  Karl Berry  <karl at freefriends.org>
+
+	* tex-file.c (abs_fname_ok): if extended, allow a dir that is the
+	exact match of TEXMF[SYS]VAR, since luatex might want to mkdir it.
+	* tests/kpsesafe.test: test it, both positive and negative.
+
 2024-02-23  Karl Berry  <karl at freefriends.org>
 
 	* texmf.cnf (XE_FONTCONFIG_PATH, XE_FC_CACHEDIR): rename from

Modified: trunk/Build/source/texk/kpathsea/tests/kpsesafe.test
===================================================================
--- trunk/Build/source/texk/kpathsea/tests/kpsesafe.test	2024-02-29 17:33:37 UTC (rev 70252)
+++ trunk/Build/source/texk/kpathsea/tests/kpsesafe.test	2024-02-29 18:02:29 UTC (rev 70253)
@@ -31,7 +31,7 @@
 TEXMFOUTPUT=/ydir \
   $_kpsewhich --safe-out-name=/ydir/ofoo.tex || exit 10
 
-echo "TEXMF[SYS]VAR ok for writing only if extended."
+echo "TEXMF[SYS]VAR not ok for writing unless extended."
 TEXMFVAR=/xvar \
   $_kpsewhich --safe-out-name=/xvar/ofoo.tex && exit 11
 TEXMFSYSVAR=/yvar \
@@ -41,17 +41,40 @@
   $_kpsewhich --safe-extended-out-name=/avar/ofoo.tex || exit 13
 TEXMFSYSVAR=/bvar \
   $_kpsewhich --safe-extended-out-name=/bvar/ofoo.tex || exit 14
+#
+# exact match should not be ok if not extended.
+TEXMFVAR=/xvar \
+  $_kpsewhich --safe-out-name=/xvar && exit 15
+TEXMFSYSVAR=/yvar \
+  $_kpsewhich --safe-out-name=/yvar && exit 16
 
 # In practice, TEXMFVAR=~/.texliveYYYY, so this is the case that matters,
 # but in principle it should work for TEXMFSYSVAR too.
-echo "TEXMF[SYS]VAR ok for writing when if set to ~/.something."
+echo "TEXMF[SYS]VAR ok for writing when if set to ~/.whatever."
 TEXMFVAR='~/.xvar' \
-  $_kpsewhich --safe-extended-out-name='~/.xvar/ofoo.tex' || exit 15
+  $_kpsewhich --safe-extended-out-name='~/.xvar/ofoo.tex' || exit 17
 TEXMFSYSVAR='~/.yvar' \
-  $_kpsewhich --safe-extended-out-name='~/.yvar/ofoo.tex' || exit 16
+  $_kpsewhich --safe-extended-out-name='~/.yvar/ofoo.tex' || exit 18
 
-echo "~/.ssh not ok for writing if TEXMF[SYS]VAR is set ~/.foo."
+echo "TEXMF[SYS]VAR exact string ok for writing if extended."
+TEXMFVAR='~/.xvar' \
+  $_kpsewhich --safe-extended-out-name='~/.xvar' || exit 21
+TEXMFSYSVAR='~/.yvar' \
+  $_kpsewhich --safe-extended-out-name='~/.yvar' || exit 22
+
+echo "TEXMF[SYS]VAR inexact string not ok for writing, even if extended."
+TEXMFVAR='~/.xvar' \
+  $_kpsewhich --safe-extended-out-name='~/.xvarx' && exit 23
+TEXMFSYSVAR='~/.yvar' \
+  $_kpsewhich --safe-extended-out-name='~/.yvarx' && exit 24
+#
+TEXMFVAR='~/.xvarx' \
+  $_kpsewhich --safe-extended-out-name='~/.xvar' && exit 25
+TEXMFSYSVAR='~/.yvarx' \
+  $_kpsewhich --safe-extended-out-name='~/.yvar' && exit 26
+
+echo "~/.ssh not ok for writing if TEXMF[SYS]VAR is set to ~/.foo."
 TEXMFVAR='~/.foo' \
-  $_kpsewhich --safe-extended-out-name='~/.ssh/ofoo.tex' && exit 17
+  $_kpsewhich --safe-extended-out-name='~/.ssh/ofoo.tex' && exit 31
 
 : # exit successfully if get to the end.

Modified: trunk/Build/source/texk/kpathsea/tex-file.c
===================================================================
--- trunk/Build/source/texk/kpathsea/tex-file.c	2024-02-29 17:33:37 UTC (rev 70252)
+++ trunk/Build/source/texk/kpathsea/tex-file.c	2024-02-29 18:02:29 UTC (rev 70253)
@@ -1186,12 +1186,18 @@
 
 /* Helper subroutine to check if absolute pathname FNAME is acceptable
    in CHECKDIR. An absolute pathname is ok only if
-   CHECKDIR is set,
-   CHECKDIR is non-empty,
+   CHECKDIR is set, and
+   CHECKDIR is non-empty, and
    CHECKDIR is the beginning of FNAME
      (e.g., disallow /somedir/file.tex against /anotherdir), and
-   the next character in FNAME is a directory separator
-     (e.g., disallow /somedirx/file.tex against /somedir).  */
+   either the next character in FNAME is a directory separator
+     (e.g., disallow /somedirx/file.tex against /somedir).
+   or we're at the end of CHECKDIR
+     (e.g., allow /somedir against /somedir, without requiring /somedir/).
+   
+   This last case, of allowing FNAME == CHECKDIR, comes up with LuaTeX,
+   where we might want to lfs.mkdir(TEXMFVAR) within Lua, not
+   necessarily with a trailing /, although that suffices.  */
 
 static boolean
 abs_fname_ok (const_string fname, const_string checkdir)
@@ -1199,8 +1205,10 @@
   return
     checkdir             /* checkdir must be non-null */
     && *checkdir != '\0' /* checkdir must be non-empty */
-    && fname == strstr (fname, checkdir)      /* fname must begin checkdir */
-    && IS_DIR_SEP (fname[strlen (checkdir)]); /* and be followed by / */
+    && fname == strstr (fname, checkdir)       /* fname must begin checkdir */
+    && (IS_DIR_SEP (fname[strlen (checkdir)])  /* and be followed by /      */
+        || strlen (fname) == strlen (checkdir) /* or be the whole string    */
+       );
 }
 
 /* Here is the general internal subroutine, kpathsea_name_ok, for



More information about the tex-live-commits mailing list.