I got the same bug and found it in BTS.     

The last comment is incorrect.
The problem isn't "{"", 0}" - kernel doesn't treat it as terminator,
moreover it stops earlier - on  {"linux-gate.so.1", 15}.

The problem is special location of dl_sysinfo_dso.
On my system using "cat /proc/self/maps":
ffffe000-fffff000 ---p 00000000 00:00 0

Base address of linux-gate.so.1 is greater than TASK_SIZE (c0000000).

This DSO is acessible from user space, but not from kernel space :-(

Can be tested by this:

----------------------------------------------------
#include <unistd.h>
#include <string.h>
#include <stdio.h>

#define DSO_BASE 0xffffe
int main()
{
  char buf[4096], *gate;
  int i;

  gate = (char *)(DSO_BASE << 12);
  memcpy(buf, gate, 4096);

  i = write(1, buf+1, 3);       /* "ELF" */
  printf("\n%d\n", i);
 
  i = write(1, gate+1, 3);      /* "ELF" */
  printf("\n%d\n", i);
  return 0;
}
----------------------------------------------------
It prints "ELF" only once.

I think, that workaround might be to use something like
strdup() instead of simply passing pointer to l->l_libname->name.          

around line 1200 in elf/rtld.c:

 if (l->l_info[DT_SONAME] != NULL)
            l->l_libname->name = ((char *) D_PTR (l, l_info[DT_STRTAB])
                                  + l->l_info[DT_SONAME]->d_un.d_val); 

    

Regards

        Petr




-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to