[latex3-commits] [git/LaTeX3-latex3-latex3] master: Expand boolean expression before calling \chardef (fixes #461) (8f9909b)

Bruno Le Floch bruno at le-floch.fr
Wed May 9 14:56:37 CEST 2018


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/8f9909bf970bff0f3881de82d9ab5a525b1d1158

>---------------------------------------------------------------

commit 8f9909bf970bff0f3881de82d9ab5a525b1d1158
Author: Bruno Le Floch <bruno at le-floch.fr>
Date:   Wed May 9 08:56:37 2018 -0400

    Expand boolean expression before calling \chardef (fixes #461)
    
    I checked we don't have other dangerous uses.  More precisely,
    \int_const:Nn and \bool_const:Nn could be construed as being
    dangerous uses, but their first arg is always \scan_stop: or undefined
    to start with so the fact that TeX sets it to \scan_stop: before
    computing the expression seems to be not too bad.


>---------------------------------------------------------------

8f9909bf970bff0f3881de82d9ab5a525b1d1158
 l3kernel/l3expan.dtx                    |   27 +++++++++++++++++++++++++++
 l3kernel/l3prg.dtx                      |   17 +++++++++++++----
 l3kernel/testfiles/m3expl001.luatex.tlg |    3 +++
 l3kernel/testfiles/m3expl001.ptex.tlg   |    3 +++
 l3kernel/testfiles/m3expl001.tlg        |    3 +++
 l3kernel/testfiles/m3expl001.uptex.tlg  |    3 +++
 l3kernel/testfiles/m3expl001.xetex.tlg  |    3 +++
 l3kernel/testfiles/m3expl003.luatex.tlg |    3 +++
 l3kernel/testfiles/m3expl003.ptex.tlg   |    3 +++
 l3kernel/testfiles/m3expl003.tlg        |    3 +++
 l3kernel/testfiles/m3expl003.uptex.tlg  |    3 +++
 l3kernel/testfiles/m3expl003.xetex.tlg  |    3 +++
 l3kernel/testfiles/m3prg003.lvt         |    3 ++-
 13 files changed, 72 insertions(+), 5 deletions(-)

diff --git a/l3kernel/l3expan.dtx b/l3kernel/l3expan.dtx
index cf43811..b80fcc6 100644
--- a/l3kernel/l3expan.dtx
+++ b/l3kernel/l3expan.dtx
@@ -521,6 +521,7 @@
 %     \exp_last_unbraced:Nf,
 %     \exp_last_unbraced:NNo,
 %     \exp_last_unbraced:NNV,
+%     \exp_last_unbraced:NNf,
 %     \exp_last_unbraced:Nco,
 %     \exp_last_unbraced:NcV,
 %     \exp_last_unbraced:Nno,
@@ -528,8 +529,10 @@
 %     \exp_last_unbraced:Nfo,
 %     \exp_last_unbraced:NNNo,
 %     \exp_last_unbraced:NNNV,
+%     \exp_last_unbraced:NNNf,
 %     \exp_last_unbraced:NnNo,
 %     \exp_last_unbraced:NNNNo,
+%     \exp_last_unbraced:NNNNf,
 %   }
 %   \begin{syntax}
 %     \cs{exp_last_unbraced:Nno} \meta{token} \Arg{tokens_1} \Arg{tokens_2}
@@ -1424,15 +1427,18 @@
 %     \exp_last_unbraced:Nf,
 %     \exp_last_unbraced:NNo,
 %     \exp_last_unbraced:NNV,
+%     \exp_last_unbraced:NNf,
 %     \exp_last_unbraced:Nco,
 %     \exp_last_unbraced:NcV,
 %     \exp_last_unbraced:NNNo,
 %     \exp_last_unbraced:NNNV,
+%     \exp_last_unbraced:NNNf,
 %     \exp_last_unbraced:Nno,
 %     \exp_last_unbraced:Noo,
 %     \exp_last_unbraced:Nfo,
 %     \exp_last_unbraced:NnNo,
 %     \exp_last_unbraced:NNNNo,
+%     \exp_last_unbraced:NNNNf,
 %   }
 % \begin{macro}{\exp_last_unbraced:Nx}
 %   Now the business end: most of these are hand-tuned for speed, but the
@@ -1453,6 +1459,12 @@
     \exp_after:wN #2
     \exp:w \@@_eval_register:N #3
   }
+\cs_new:Npn \exp_last_unbraced:NNf #1#2#3
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp:w \exp_end_continue_f:w #3
+  }
 \cs_new:Npn \exp_last_unbraced:Nco #1#2#3
   { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: #3 }
 \cs_new:Npn \exp_last_unbraced:NcV #1#2#3
@@ -1470,12 +1482,27 @@
     \exp_after:wN #3
     \exp:w \@@_eval_register:N #4
   }
+\cs_new:Npn \exp_last_unbraced:NNNf #1#2#3#4
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp_after:wN #3
+    \exp:w \exp_end_continue_f:w #4
+  }
 \cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: }
 \cs_new:Npn \exp_last_unbraced:Noo { \::o \::o_unbraced \::: }
 \cs_new:Npn \exp_last_unbraced:Nfo { \::f \::o_unbraced \::: }
 \cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: }
 \cs_new:Npn \exp_last_unbraced:NNNNo #1#2#3#4#5
   { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 #5 }
+\cs_new:Npn \exp_last_unbraced:NNNNf #1#2#3#4#5
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp_after:wN #3
+    \exp_after:wN #4
+    \exp:w \exp_end_continue_f:w #5
+  }
 \cs_new_protected:Npn \exp_last_unbraced:Nx { \::x_unbraced \::: }
 %    \end{macrocode}
 % \end{macro}
diff --git a/l3kernel/l3prg.dtx b/l3kernel/l3prg.dtx
index 17ee661..5f2e06c 100644
--- a/l3kernel/l3prg.dtx
+++ b/l3kernel/l3prg.dtx
@@ -862,15 +862,24 @@
 % \begin{macro}{\bool_set:Nn, \bool_set:cn}
 % \begin{macro}{\bool_gset:Nn, \bool_gset:cn}
 %   This function evaluates a boolean expression and assigns the first
-%   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.
-%   Again, we include some checking code.
+%   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.  Again,
+%   we include some checking code.  It is important to evaluate the
+%   expression before applying the \tn{chardef} primitive, because that
+%   primitive sets the left-hand side to \cs{scan_stop:} before looking
+%   for the right-hand side.
 %    \begin{macrocode}
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
-  { \tex_chardef:D #1 = \bool_if_p:n {#2} }
+  {
+    \exp_last_unbraced:NNNf
+      \tex_chardef:D #1 = { \bool_if_p:n {#2} }
+  }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
-  { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
+  {
+    \exp_last_unbraced:NNNNf
+      \tex_global:D \tex_chardef:D #1 = { \bool_if_p:n {#2} }
+  }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
 \cs_generate_variant:Nn \bool_gset:Nn { c }
 %    \end{macrocode}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index d34dbff..c525916 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -226,15 +226,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 7f6451e..1c28913 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 1ab10ad..fd31af4 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index a38e54a..0e21b26 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index bd6f414..771c785 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index d34dbff..c525916 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -226,15 +226,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 7f6451e..1c28913 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index 1ab10ad..fd31af4 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index a38e54a..0e21b26 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index bd6f414..771c785 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -225,15 +225,18 @@ Defining \exp_last_unbraced:Nv on line ...
 Defining \exp_last_unbraced:Nf on line ...
 Defining \exp_last_unbraced:NNo on line ...
 Defining \exp_last_unbraced:NNV on line ...
+Defining \exp_last_unbraced:NNf on line ...
 Defining \exp_last_unbraced:Nco on line ...
 Defining \exp_last_unbraced:NcV on line ...
 Defining \exp_last_unbraced:NNNo on line ...
 Defining \exp_last_unbraced:NNNV on line ...
+Defining \exp_last_unbraced:NNNf on line ...
 Defining \exp_last_unbraced:Nno on line ...
 Defining \exp_last_unbraced:Noo on line ...
 Defining \exp_last_unbraced:Nfo on line ...
 Defining \exp_last_unbraced:NnNo on line ...
 Defining \exp_last_unbraced:NNNNo on line ...
+Defining \exp_last_unbraced:NNNNf on line ...
 Defining \exp_last_unbraced:Nx on line ...
 Defining \exp_last_two_unbraced:Noo on line ...
 Defining \__exp_last_two_unbraced:noN on line ...
diff --git a/l3kernel/testfiles/m3prg003.lvt b/l3kernel/testfiles/m3prg003.lvt
index 90f17ac..1d67ca4 100644
--- a/l3kernel/testfiles/m3prg003.lvt
+++ b/l3kernel/testfiles/m3prg003.lvt
@@ -1,5 +1,5 @@
 %
-% Copyright (C) 2008-2012,2017 The LaTeX3 project
+% Copyright (C) 2008-2012,2017,2018 The LaTeX3 project
 %
 
 \documentclass{minimal}
@@ -103,6 +103,7 @@
     } &&
     \int_compare_p:nNn 2=2
   }
+  \bool_set:Nn \l_tmpa_bool { ! ! \l_tmpa_bool } % see Github issue #461
   \bool_if:NTF \l_tmpa_bool \TRUE \FALSE
   \bool_const:cn { c_A_bool } { ! \l_tmpa_bool }
   \bool_if:NTF \c_A_bool \TRUE \FALSE





More information about the latex3-commits mailing list