Package: tcc
Version: 0.9.23-2
Severity: normal
Tags: patch

I have reflowed some of the long lines below.

$ cat dummy.c
int
main ()
{
  return 0;
}
$ tcc -c dummy.c
$ ls -l dummy.o
-rw-rw-r-- 1 Kalle Kalle 484 2007-04-09 13:31 dummy.o
$ tcc dummy.o -lgnutls -lguile
Segmentation fault (core dumped)
$ tcc dummy.c /usr/lib/libgnutls.so.13.0.4 /usr/lib/libguile.so.12.3.0
Segmentation fault (core dumped)
$ dpkg --search /usr/lib/libgnutls.so.13.0.4 /usr/lib/libguile.so.12.3.0
libgnutls13: /usr/lib/libgnutls.so.13.0.4
guile-1.6-libs: /usr/lib/libguile.so.12.3.0
$ gdb --args /var/tmp/Kalle/debian/tcc-0.9.23/tcc dummy.o -lgnutls -lguile
GNU gdb 6.5-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library 
"/lib/tls/libthread_db.so.1".

(gdb) run
Starting program: /var/tmp/Kalle/debian/tcc-0.9.23/tcc dummy.o -lgnutls -lguile

Program received signal SIGSEGV, Segmentation fault.
0xb7e10c10 in strcmp () from /lib/tls/libc.so.6
(gdb) backtrace
#0  0xb7e10c10 in strcmp () from /lib/tls/libc.so.6
#1  0x0806285a in tcc_load_dll (s1=0x8076008, fd=7,
    filename=0xbf7fc4e4 "/usr/lib/libguile-ltdl.so.1", level=1)
    at tccelf.c:2189
#2  0x08063e98 in tcc_add_file_internal (s1=0x8076008,
    filename=0xbf7fc4e4 "/usr/lib/libguile-ltdl.so.1", flags=2)
    at tcc.c:9931
#3  0x0806401f in tcc_add_dll (s=0x8076008,
    filename=0x80a5e5e "libguile-ltdl.so.1", flags=2) at tcc.c:9991
#4  0x08062888 in tcc_load_dll (s1=0x8076008, fd=6,
    filename=0xbf7fca54 "/usr/lib/libguile.so", level=0) at tccelf.c:2192
#5  0x08063e98 in tcc_add_file_internal (s1=0x8076008,
    filename=0xbf7fca54 "/usr/lib/libguile.so", flags=0) at tcc.c:9931
#6  0x0806401f in tcc_add_dll (s=0x8076008,
    filename=0xbf7fce84 "libguile.so", flags=0) at tcc.c:9991
#7  0x080640a6 in tcc_add_library (s=0x8076008,
    libraryname=0xbf7ff92e "guile") at tcc.c:10010
#8  0x08064e58 in main (argc=4, argv=0xbf7fd794) at tcc.c:10647
(gdb) frame 1
#1  0x0806285a in tcc_load_dll (s1=0x8076008, fd=7,
    filename=0xbf7fc4e4 "/usr/lib/libguile-ltdl.so.1", level=1)
    at tccelf.c:2189
2189                    if (!strcmp(name, dllref->name))
(gdb) info local
ehdr = {e_ident = "\177ELF\001\001\001\000\000\000\000\000\000\000\000",
  e_type = 3, e_machine = 3, e_version = 1, 
  e_entry = 3920, e_phoff = 52, e_shoff = 23220,
  e_flags = 0, e_ehsize = 52, e_phentsize = 32, e_phnum = 4, 
  e_shentsize = 40, e_shnum = 22, e_shstrndx = 21}
shdr = (Elf32_Shdr *) 0x808f570
sh = (Elf32_Shdr *) 0x808f8e0
sh1 = (Elf32_Shdr *) 0x808f5e8
i = 0
nb_syms = 77
nb_dts = 29
sym_bind = 1
ret = 0
sym = (Elf32_Sym *) 0x808fdb8
dynsym = (Elf32_Sym *) 0x808f8e8
dt = (Elf32_Dyn *) 0x8085b10
dynamic = (Elf32_Dyn *) 0x8085a20
dynstr = (unsigned char *) 0x80857d8 ""
name = 0x6c6ac144 <Address 0x6c6ac144 out of bounds>
soname = 0x80859de "libguile-ltdl.so.1"
p = 0xbf7fc4ec "/libguile-ltdl.so.1"
dllref = (DLLReference *) 0x8086af8
(gdb) print/x [EMAIL PROTECTED]
$1 = {{d_tag = 0x1, d_un = {d_val = 0x1b1, d_ptr = 0x1b1}},
      {d_tag = 0x1, d_un = {d_val = 0x1bc, d_ptr = 0x1bc}},
      {d_tag = 0x1, d_un = {d_val = 0x1cc, d_ptr = 0x1cc}},
      {d_tag = 0x1, d_un = {d_val = 0x1da, d_ptr = 0x1da}},
      {d_tag = 0x1, d_un = {d_val = 0x1e4, d_ptr = 0x1e4}},
      {d_tag = 0xe, d_un = {d_val = 0x206, d_ptr = 0x206}},
      {d_tag = 0xc, d_un = {d_val = 0xd34, d_ptr = 0xd34}},
      {d_tag = 0xd, d_un = {d_val = 0x5130, d_ptr = 0x5130}},
      {d_tag = 0x4, d_un = {d_val = 0xb4, d_ptr = 0xb4}},
      {d_tag = 0x5, d_un = {d_val = 0x7cc, d_ptr = 0x7cc}},
      {d_tag = 0x6, d_un = {d_val = 0x2fc, d_ptr = 0x2fc}},
      {d_tag = 0xa, d_un = {d_val = 0x243, d_ptr = 0x243}},
      {d_tag = 0xb, d_un = {d_val = 0x10, d_ptr = 0x10}},
      {d_tag = 0x3, d_un = {d_val = 0x6980, d_ptr = 0x6980}},
      {d_tag = 0x2, d_un = {d_val = 0xf8, d_ptr = 0xf8}},
      {d_tag = 0x14, d_un = {d_val = 0x11, d_ptr = 0x11}},
      {d_tag = 0x17, d_un = {d_val = 0xc3c, d_ptr = 0xc3c}},
      {d_tag = 0x11, d_un = {d_val = 0xb2c, d_ptr = 0xb2c}},
      {d_tag = 0x12, d_un = {d_val = 0x110, d_ptr = 0x110}},
      {d_tag = 0x13, d_un = {d_val = 0x8, d_ptr = 0x8}},
      {d_tag = 0x6ffffffe, d_un = {d_val = 0xaac, d_ptr = 0xaac}},
      {d_tag = 0x6fffffff, d_un = {d_val = 0x2, d_ptr = 0x2}},
      {d_tag = 0x6ffffff0, d_un = {d_val = 0xa10, d_ptr = 0xa10}},
      {d_tag = 0x6ffffffa, d_un = {d_val = 0x1c, d_ptr = 0x1c}},
      {d_tag = 0x0, d_un = {d_val = 0x0, d_ptr = 0x0}},
      {d_tag = 0x0, d_un = {d_val = 0x0, d_ptr = 0x0}},
      {d_tag = 0x0, d_un = {d_val = 0x0, d_ptr = 0x0}},
      {d_tag = 0x0, d_un = {d_val = 0x0, d_ptr = 0x0}},
      {d_tag = 0x0, d_un = {d_val = 0x0, d_ptr = 0x0}}}
(gdb) print dt - dynamic
$2 = 30
(gdb) quit
The program is running.  Exit anyway? (y or n) y
$ 

Obviously, dt == dynamic + i was intended, but the inner loop
messes this up by using the same loop variable.

--- tccelf.c.~1~        2005-06-18 01:09:15.000000000 +0300
+++ tccelf.c    2007-04-09 14:03:33.000000000 +0300
@@ -2095,7 +2095,7 @@ static int tcc_load_dll(TCCState *s1, in
 { 
     Elf32_Ehdr ehdr;
     Elf32_Shdr *shdr, *sh, *sh1;
-    int i, nb_syms, nb_dts, sym_bind, ret;
+    int i, j, nb_syms, nb_dts, sym_bind, ret;
     Elf32_Sym *sym, *dynsym;
     Elf32_Dyn *dt, *dynamic;
     unsigned char *dynstr;
@@ -2184,8 +2184,8 @@ static int tcc_load_dll(TCCState *s1, in
         switch(dt->d_tag) {
         case DT_NEEDED:
             name = dynstr + dt->d_un.d_val;
-            for(i = 0; i < s1->nb_loaded_dlls; i++) {
-                dllref = s1->loaded_dlls[i];
+            for(j = 0; j < s1->nb_loaded_dlls; j++) {
+                dllref = s1->loaded_dlls[j];
                 if (!strcmp(name, dllref->name))
                     goto already_loaded;
             }

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 
'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/dash
Kernel: Linux 2.6.12-1-k7
Locale: LANG=fi_FI.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)

Versions of packages tcc depends on:
ii  libc6                         2.3.6-7    GNU C Library: Shared libraries

Versions of packages tcc recommends:
ii  libc6-dev [libc-dev]          2.3.6-7    GNU C Library: Development Librari

-- no debconf information

Attachment: pgpB9sfdwcR0W.pgp
Description: PGP signature

Reply via email to