<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 22, 2016 at 8:14 AM, Philipp Gesang <span dir="ltr"><<a href="mailto:phg@phi-gamma.net" target="_blank">phg@phi-gamma.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">···<date: 2016-04-22, Friday>···<from: luigi scarso>···<br>
<div><div class="h5"><br>
> On Thu, Apr 21, 2016 at 10:20 PM, Philipp Gesang <<a href="mailto:phg@phi-gamma.net">phg@phi-gamma.net</a>> wrote:<br>
><br>
> > When passed the empty string, tprint() will allocate a zero-length<br>
> > buffer and then branch on its first element (``if (*buffer) { … }``)<br>
> > which has never been initialized.<br>
> ><br>
> > Prevent the invalid access by checking for the empty string and skipping<br>
> > the printing routine entirely if appropriate.<br>
> ><br>
> > Signed-off-by: Philipp Gesang <<a href="mailto:phg@phi-gamma.net">phg@phi-gamma.net</a>><br>
> > ---<br>
> >  source/texk/web2c/luatexdir/tex/printing.w | 6 +++++-<br>
> >  1 file changed, 5 insertions(+), 1 deletion(-)<br>
> ><br>
> > diff --git a/source/texk/web2c/luatexdir/tex/printing.w<br>
> > b/source/texk/web2c/luatexdir/tex/printing.w<br>
> > index 478d55f..675fa45 100644<br>
> > --- a/source/texk/web2c/luatexdir/tex/printing.w<br>
> > +++ b/source/texk/web2c/luatexdir/tex/printing.w<br>
> > @@ -367,6 +367,10 @@ void tprint(const char *sss)<br>
> >      int newlinechar = int_par(new_line_char_code);<br>
> >      int dolog = 0;<br>
> >      int doterm = 0;<br>
> > +    const size_t sss_len = strlen(sss);<br>
> > +    if (sss_len == 0u) { /* nothing to print */<br>
> > +        return;<br>
> > +    }<br>
> >      switch (selector) {<br>
> >          case no_print:<br>
> >              return;<br>
> > @@ -413,7 +417,7 @@ void tprint(const char *sss)<br>
> >      }<br>
> >      /* what is left is the 3 term/log settings */<br>
> >      if (dolog || doterm) {<br>
> > -        buffer = xmalloc(strlen(sss)*3);<br>
> > +        buffer = xmalloc(sss_len*3);<br>
> >          if (dolog) {<br>
> >              const unsigned char *ss = (const unsigned char *) sss;<br>
> >              while (*ss) {<br>
> > --<br>
> > 2.8.0<br>
> ><br>
> ><br>
> do you have an example that trigger the wrong sss string ?<br>
<br>
</div></div>For one it happens if the function is called on the empty string.<br>
Here’s a test file:<br>
<br>
    a\bye<br>
<br>
I use revision 5949. With the Plain loader from the pretest I<br>
get:<br>
<br>
    $ valgrind --trace-children=yes mtxrun --script plain tprint-empty.tex<br>
    …<br>
    ==3758== Conditional jump or move depends on uninitialised value(s)<br>
    ==3758==    at 0x4D77BE: tprint (printing.w:431)<br>
    ==3758==    by 0x4D7A69: tprint_nl (printing.w:471)<br>
    ==3758==    by 0x4BC19F: write_out (extensions.w:533)<br>
    ==3758==    by 0x5B6BA4: out_what (pdflistout.w:262)<br>
    ==3758==    by 0x4BBBAF: do_extension (extensions.w:389)<br>
    ==3758==    by 0x4BBDF0: do_extension (extensions.w:418)<br>
    ==3758==    by 0x4C2298: run_extension (maincontrol.w:616)<br>
    ==3758==    by 0x4C43C2: main_control (maincontrol.w:971)<br>
    ==3758==    by 0x4C0BAB: main_body (mainbody.w:461)<br>
    ==3758==    by 0x4892B5: main (luatex.c:498)<br>
<br>
Actually I just noticed that my patch is probably incorrect:<br>
writeout invokes tprint_nl that way for the side effect of<br>
popping a newline. The fix should thus be added further down<br>
after that happened.<br>
<br>
</blockquote></div><br>ok, thank you for the report.<br clear="all"><div><br></div>-- <br><div class="gmail_signature">luigi<br></div>
</div></div>