[tex-live] omfonts one-byte heap overflow
Tom Kacvinsky
tom.kacvinsky at suse.com
Thu Sep 27 00:20:27 CEST 2018
I'll poke at this in my free time. Would be interesting to see if it also happens
on openSUSE/SUSE distributions (though 32-bit development support was dropped from
SLES 12).
> On Sep 26, 2018, at 16:52:06, Johannes Hielscher <jhielscher at posteo.de> wrote:
>
> So finally, someone else has run into (presumably) the same problem as
> me, as I reported in the tlbuild list on 2018-04-08:
> https://tug.org/pipermail/tlbuild/2018q2/004207.html
>
> Back then, I didn't find a solution there, so I cannot give some clever
> advice here )-:
>
> (Even worse, my tests did succeed when called explicitly from the shell,
> instead of by the test suite.)
>
> Am Fri, 21 Sep 2018 14:42:37 -0400
> schrieb Tom Callaway <tcallawa at redhat.com>:
>
>> I noticed that the omegafonts test suite from tl2018 was failing in
>> Fedora rawhide, despite no code changes since the last build.
>>
>> ============================================================================
>> Testsuite summary for Web2C 2018
>> ============================================================================
>> # TOTAL: 16
>> # PASS: 15
>> # SKIP: 0
>> # XFAIL: 0
>> # FAIL: 1
>> # XPASS: 0
>> # ERROR: 0
>> ============================================================================
>> See omegafonts/test-suite.log
>> Please report to tex-k at tug.org
>> ============================================================================
>>
>> This only seemed to happen on i686 and armv7hl builds. I reproduced it
>> locally in an i686 chroot. The test-suite.log says:
>>
>> FAIL: check
>> ===========
>>
>> #! /bin/sh -vx
>> # $Id: check.test 45809 2017-11-15 00:36:56Z karl $
>> # Copyright 2017 Karl Berry <tex-live at tug.org>
>> # Copyright 2014, 2015 Peter Breitenlohner <tex-live at tug.org>
>> # You may freely use, modify and/or distribute this file.
>>
>> test -d tests || mkdir -p tests
>> + test -d tests
>>
>> TEXMFCNF=$srcdir/../../kpathsea
>> + TEXMFCNF=../../../../texk/web2c/omegafonts/../../kpathsea
>> OFMFONTS=".;./tests"
>> + OFMFONTS='.;./tests'
>> export TEXMFCNF OFMFONTS
>> + export TEXMFCNF OFMFONTS
>>
>> echo && echo "*** ofm2opl check xcheck"
>> + echo
>>
>> + echo '*** ofm2opl check xcheck'
>> *** ofm2opl check xcheck
>> ./omfonts -ofm2opl $srcdir/tests/check tests/xcheck || exit 1
>> + ./omfonts -ofm2opl ../../../../texk/web2c/omegafonts/tests/check
>> tests/xcheck
>> Bad OFM file: Ligature/kern step 2 skips too far;
>> I made it stop.
>> Bad OFM file: Kern index too large.
>> malloc(): invalid next size (unsorted)
>> ../../../../texk/web2c/omegafonts/check.test: line 14: 9396 Aborted
>> (core dumped) ./omfonts -ofm2opl $srcdir/tests/check
>> tests/xcheck
>> + exit 1
>> FAIL check.test (exit status: 1)
>>
>> *****
>>
>> The gdb backtrace looks like this:
>>
>> Program received signal SIGABRT, Aborted.
>> 0xf7fd2079 in __kernel_vsyscall ()
>> (gdb) bt
>> #0 0xf7fd2079 in __kernel_vsyscall ()
>> #1 0xf7e29b36 in __libc_signal_restore_set (set=0xffffcdcc) at
>> ../sysdeps/unix/sysv/linux/internal-signals.h:84
>> #2 __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:48
>> #3 0xf7e13374 in __GI_abort () at abort.c:79
>> #4 0xf7e6e37c in __libc_message (action=<optimized out>,
>> fmt=<optimized
>> out>) at ../sysdeps/posix/libc_fatal.c:181
>> #5 0xf7e753bf in malloc_printerr (str=str at entry=0xf7f52850 "malloc():
>> invalid next size (unsorted)") at malloc.c:5354
>> #6 0xf7e7802b in _int_malloc (av=av at entry=0xf7f9f7a0 <main_arena>,
>> bytes=bytes at entry=4) at malloc.c:3727
>> #7 0xf7e797dd in __GI___libc_malloc (bytes=4) at malloc.c:3041
>> #8 0xf7fbd9e8 in xmalloc (size=4)
>> at ../../../texk/kpathsea/xmalloc.c:25 #9 0x56559e55 in
>> retrieve_exten_table (table=0x565d5f20 "")
>> at ../../../../texk/web2c/omegafonts/char_routines.c:837 #10
>> 0x56562ce7 in ofm_read_rest ()
>> at ../../../../texk/web2c/omegafonts/parse_ofm.c:371 #11 parse_ofm
>> (read_ovf=0) at ../../../../texk/web2c/omegafonts/parse_ofm.c:99
>> #12 0x565579e1 in main (argc=<optimized out>, argv=<optimized out>) at
>> ../../../../texk/web2c/omegafonts/omfonts.c:286
>>
>> I thought it might be a malloc bug in the latest glibc, but the glibc
>> maintainers advised me to run valgrind. When I did that, it showed:
>>
>> =20225== Memcheck, a memory error detector
>> ==20225== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et
>> al. ==20225== Using Valgrind-3.14.0.GIT and LibVEX; rerun with -h for
>> copyright info
>> ==20225== Command: .libs/omfonts -ofm2opl
>> ../../../../texk/web2c/omegafonts/tests/check tests/xcheck
>> ==20225==
>> ==20225== Invalid write of size 1
>> ==20225== at 0x10CA60: adjust_labels (char_routines.c:695)
>> ==20225== by 0x115CC1: ofm_read_rest (parse_ofm.c:368)
>> ==20225== by 0x115CC1: parse_ofm (parse_ofm.c:99)
>> ==20225== by 0x10A9E0: main (omfonts.c:286)
>> ==20225== Address 0x4b13ecc is 0 bytes after a block of size 12
>> alloc'd ==20225== at 0x4837717: calloc (vg_replace_malloc.c:752)
>> ==20225== by 0x48555E4: xcalloc (xcalloc.c:25)
>> ==20225== by 0x1137C9: retrieve_ligkern_table
>> (ligkern_routines.c:652) ==20225== by 0x115CB5: ofm_read_rest
>> (parse_ofm.c:367) ==20225== by 0x115CB5: parse_ofm (parse_ofm.c:99)
>> ==20225== by 0x10A9E0: main (omfonts.c:286)
>> ==20225==
>>
>> Turns out that the latest glibc code (as found in the latest revisions
>> of Fedora) is much better at catching malloc heap corruption. I
>> thought at first it was a glibc issue, but the Fedora glibc
>> maintainers helped me to confirm that it was not.
>>
>> It looks like there is a one-byte heap overflow, maybe in the
>> FOR_ALL_CHARACTERS macro in char_routines.c?
>>
>> I'm learning a lot as I go on this one, but I think I've gone as far
>> as I can. Any and all help in fixing this would be greatly
>> appreciated.
>>
>> Thanks in advance,
>>
>> ~tom
>>
>
More information about the tex-live
mailing list