[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