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.