Re: Uninitialized variable sometimes causing malformed TFM files

Marcel Krüger <[email protected]> Wed, 20 Mar 2019 20:26:22 +0100
Newsgroups gmane.comp.tex.metapost
Message-ID <[email protected]>


 ---- On Wed, 20 Mar 2019 19:01:08 +0100 luigi scarso <[email protected]> wrote ----
 > 
 > 
 > On Wed, Mar 20, 2019 at 6:54 PM Marcel Kr&uuml;ger <[email protected]> wrote:
 >  ---- On Wed, 20 Mar 2019 18:29:09 +0100 luigi scarso <[email protected]> wrote ----
 >  > 
 >  > 
 >  > On Sat, Mar 16, 2019 at 6:04 PM Marcel Kr&uuml;ger <[email protected]> wrote:
 >  > 
 >  > sorry for delay, I will it asap. -- 
 >  > luigi
 > 
 > Thanks. There is one other thing, I do not really know if I would describe it as a backward compatibility bug or a feature request:
 > 
 > For non-"scaled" numbersystems, code like
 > 
 > filldraw stroke z1e--z2e;
 > (example taken from cmbase.mf, `left_bracket`)
 > 
 > fail, because z1e-- is interpreted as z 1e- - instead of z1e --. So z1e--z2e is equal to z1-z2e, leading to lots of errors.
 > 
 > I understand that the new numbersystems and the exponential syntax can lead to problems of this kind, but I think this could be avoided:
 > Maybe a `e+` / `e-` could only be interpreted as exponential notation if it is followed by a  digit? I do not think
 > anyone would write "1e-" or "3e+" for 1 or 3, so it should not lead to any breakage.
 > On the other hand it would catch almost all cases where this is invoked accidentially.
 > 
 > A possible implementation of this change  is attached.
 > 
 > 
 > hm it looks like a serious bug, and I fear I will not able to fix it for next TL --- but I hope to put it into trunk immediately after the TL code is frozen.
 > 

Right, I am sorry for bringing this up so late in the TL cycle.

One additional note on this: The behaviour described above (`1e-` being interpreted as `1`) seems to be specific to the `double` mode.
The `decimal` mode just fails because it is not able to parse the number, which further reduces the risk of breaking some code by changing the current
behaviour.

Also I attached a fixed version of the earlier patch, there was a smaller error.

Best regards,
Marcel Krüger

 > 
 > -- 
 > luigi
 >

--
http://tug.org/metapost/
MP-digit-change.diff (application/octet-stream, 2.1 KB)
diff --git a/source/texk/web2c/mplibdir/mpmathbinary.w b/source/texk/web2c/mplibdir/mpmathbinary.w
index a4312c52c..b5a2da736 100644
--- a/source/texk/web2c/mplibdir/mpmathbinary.w
+++ b/source/texk/web2c/mplibdir/mpmathbinary.w
@@ -982,6 +982,10 @@ static void find_exponent (MP mp)  {
      if (mp->buffer[mp->cur_input.loc_field] == '+' || 
         mp->buffer[mp->cur_input.loc_field] == '-') {
         mp->cur_input.loc_field++;
+        if (mp->char_class[mp->buffer[mp->cur_input.loc_field]] != digit_class) {
+          mp->cur_input.loc_field -= 2;
+          return;
+        }
      }
      while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {
        mp->cur_input.loc_field++;
diff --git a/source/texk/web2c/mplibdir/mpmathdecimal.w b/source/texk/web2c/mplibdir/mpmathdecimal.w
index 2ddc21647..b9971a914 100644
--- a/source/texk/web2c/mplibdir/mpmathdecimal.w
+++ b/source/texk/web2c/mplibdir/mpmathdecimal.w
@@ -1073,6 +1073,10 @@ static void find_exponent (MP mp)  {
      if (mp->buffer[mp->cur_input.loc_field] == '+' || 
         mp->buffer[mp->cur_input.loc_field] == '-') {
         mp->cur_input.loc_field++;
+        if (mp->char_class[mp->buffer[mp->cur_input.loc_field]] != digit_class) {
+          mp->cur_input.loc_field -= 2;
+          return;
+        }
      }
      while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {
        mp->cur_input.loc_field++;
diff --git a/source/texk/web2c/mplibdir/mpmathdouble.w b/source/texk/web2c/mplibdir/mpmathdouble.w
index cb1496936..c305cf290 100644
--- a/source/texk/web2c/mplibdir/mpmathdouble.w
+++ b/source/texk/web2c/mplibdir/mpmathdouble.w
@@ -705,6 +705,10 @@ static void find_exponent (MP mp)  {
      }     
      if (mp->buffer[mp->cur_input.loc_field] == '+' || 
         mp->buffer[mp->cur_input.loc_field] == '-') {
         mp->cur_input.loc_field++;
+        if (mp->char_class[mp->buffer[mp->cur_input.loc_field]] != digit_class) {
+          mp->cur_input.loc_field -= 2;
+          return;
+        }
      }
      while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {