<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 28, 2019 at 10:55 PM Marcel Krüger <<a href="mailto:tex@2krueger.de">tex@2krueger.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> ---- On Thu, 28 Mar 2019 18:53:41 +0100 Hans Hagen <<a href="mailto:j.hagen@xs4all.nl" target="_blank">j.hagen@xs4all.nl</a>> wrote ----<br>
 > On 3/28/2019 3:57 PM, Marcel Krüger wrote:<br>
 > > Hi,<br>
 > > <br>
 > > there are multiple issues memory issues in tprint:<br>
 > > <br>
 > > If the buffer passed to tprint only contains of to be escaped characters, the `xmalloc(strlen(sss)*3)` is too small: The final `\0` can not be written, so this causes a write into unallocated memory.<br>
 > > If t_flush_buffer is called for such a buffer at the last position, there is an additional `\n` written, so `xmalloc(strlen(sss)*3+2)` is needed.<br>
 > > <br>
 > > Additionally, the test `if (*buffer)` is used to test if there is something to print left. If the parameter is empty, `*buffer` is never written, so valgrind complains about `if (*buffer)` depending on uninitialized memory. Instead, `if (i)` can be used: `i` is the length of the written part of the buffer, so `i==0` iff there is nothing to write.<br>
 > > <br>
 > > A related problem is with `max_print_line`:<br>
 > > If the point where the line should be broken falls inside the escape sequence of an escaped character,<br>
 > > the line limit is ignored.<br>
 > > This can be fixed by adding<br>
 > > <br>
 > >          if (term_offset+2>=max_print_line) {<br>
 > >              wterm_cr();<br>
 > >              term_offset=0;<br>
 > >          }<br>
 > > <br>
 > > as in `wterm_char` also in tprint above `buffer[i++] = '^';`.<br>
 > > <br>
 > > A full patch fixing all three issues is attached.<br>
 > Can you give a plain tex example where the fault happens? Normally the <br>
 > max line length kicks in (3 chars) before such an overflow.<br>
<br>
Try<br>
<br>
\let\3\relax<br>
\directlua{<br>
  texio.write'\3'% Only to be escaped characters -> valgrind complains about write into unallocated memory<br>
<br>
  texio.write_nl''<br>
<br>
  for i=1,kpse.var_value'max_print_line'-3 do texio.write'.' end<br>
  texio.write'\3' % Here LuaTex writes 2 and not just 1 byte after it's allocated memory area<br>
<br>
  for i=1,kpse.var_value'max_print_line'-1 do texio.write'.' end<br>
  texio.write'\3' % The line break would fall inside of the escape sequence -> Line limit ignored<br>
  for i=1,2*kpse.var_value'max_print_line' do texio.write'.' end % This should normally not fit into one line<br>
}<br>
\bye<br>
<br>
  <br></blockquote><div><br></div><div>Ok, thank you very much for the example.</div><div><br></div><div><br></div><div> </div></div>-- <br><div dir="ltr" class="gmail_signature">luigi<br></div></div>