Mailinglist Archive: opensuse-de (2782 mails)

< Previous Next >
Re: Scribus - Speicherzugriffsfehler
  • From: David Haller <david@xxxxxxxxxx>
  • Date: Thu, 21 Apr 2005 18:43:11 +0200
  • Message-id: <20050421164311.GC2460@xxxxxxxxxxxxxxxxxx>
Hallo,

Am Thu, 21 Apr 2005, Heinz W. Pahlke schrieb:
>On 21-Apr-2005 Thomas Klopf wrote:
[..]
>> Also wir wissen:
>> - Öffnen von /usr/X11R6/lib/X11/fonts/Type1/UTBI____.pfa klappt
>> - Die Fontdatei wird auch in den Speicher gemappt.
>> - Das Schliessen der Fontdatei klappt.
>
>Ach so, das "2357 SYS_close(7)" bezieht sich also darauf.

Jep. Die '7' ist der Filedescriptor (fd). Siehe den Rueckgabewert des
SYS_open() auf 'UTBI____.pfa'.

>Und ich dachte, es koennte evtl. an der Font-Datei liegen.

Das ist meine Vermutung. Denn die Datei ist ja noch im Zugriff per
MMap, da es noch kein 'munmap' auf die Speicheradresse gab, die mmap
zurueckgegeben hat. [1]

>> Sind wir sicher dass das Folgende korrekt ist ?
>> - Der Zugriff auf die gemappten Daten führt zu einem Seg Fault.
>>
>> Sicher ? Nein, ich bin mir da nicht sicher.
>>
>> Mich macht halt noch die Zeile vor dem Segfault stutzig:
>>
>> 1259 FT_Get_Postscript_Name(0x085ecb80, 0xbfffeb10, 0xbfffeb00, 1,
>> 0x402f052c <unfinished ...>
>
>Das war aber mit der vorher installierten Scribus-Version. Mit der
>scribus-1.2.1-1.0suse91 gibt es diese Meldung ja nicht mehr.
>
>Aber nachdem ich jetzt mal nach unfinished gesucht habe: die Meldung
>taucht einige Dutzend Male auf.

Das mit dem <unfinished ...> gibt's immer dann, wenn eine (nicht libc-)
Bibliotheksfunktion zu syscalls wechselt. Z.B:

XOpenDisplay(... 0x080495fc <unfinished ...>
SYS_...
[..]
SYS_...
<... XOpenDisplay resumed> ) = 0x080496f0

-dnh

[1] Zum Nachvollziehen:

dh@slarty[4]: /tmp/test8 (0)$ ls -lA
total 4
-rw-r--r-- 1 dh dh 793 Apr 21 18:21 mmap-test.c
dh@slarty[4]: /tmp/test8 (0)$ cat mmap-test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <errno.h>

int main(void) {
int fd;
void * ptr;

fd = open("foo", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR );
if( fd < 0) { perror(""); exit(errno); }
if( write(fd, "abc\n", 4) != 4 ) { close(fd); perror(""); exit(errno); }
if( close(fd) != 0 ) { perror(""); exit(errno); }

fd = open("foo", O_RDONLY);
if( fd < 0) { perror(""); exit(errno); }

ptr = mmap(NULL, 512, PROT_READ, MAP_PRIVATE, fd, 0);
if( ptr == MAP_FAILED ) { close(fd); perror(""); exit(errno); }

if( close(fd) != 0 ) { perror(""); exit(errno); }

if( write(1, ptr, 4) != 4 ) { perror(""); }

if( munmap(ptr, 512) != 0 ) { perror(""); exit(errno); }
return 0;
}
dh@slarty[4]: /tmp/test8 (0)$ gcc -Wall -W -o mmap-test mmap-test.c
dh@slarty[4]: /tmp/test8 (0)$ ./mmap-test
abc
dh@slarty[4]: /tmp/test8 (0)$ hex < foo
00000000 61 62 63 0A abc.
dh@slarty[4]: /tmp/test8 (0)$ rm foo
dh@slarty[4]: /tmp/test8 (0)$ unset LANG LD_LIBRARY_PATH
dh@slarty[4]: /tmp/test8 (0)$ ltrace -S -s 128 ./mmap-test
[.. Initkram bis inkl. "__register_frame_info" geloescht ..]
SYS_open("foo", 65, 0600) = 4
SYS_write(4, "abc\n", 4) = 4
SYS_close(4) = 0

[Das sind die ersten 4 Zeilen: open(2), write(2), close(2) (die Zahlen
sind die Sektionen der manpages).]

SYS_open("foo", 0, 04) = 4
SYS_mmap(0xbfffe7f4, 0, 0x40107618, 0x4000aa20, 0xbfffe894) = 0x40014000
SYS_close(4) = 0

[open(2), mmap(2), close(2). Die Datei wurde also erfolgreich geoeffnet,
mmapped und geschlossen(!).]

SYS_write(1, "abc\n", 4abc
) = 4

[Und huch, was ist das? Das ist das "write(1, ptr, 4);" samt Ausgabe.
Obwohl also Datei per close(fd) geschlossen wurde ist sie nach wie vor
ueber den Speicherbereich in den sie ge-mmap-ed wurde ansprechbar.]

SYS_munmap(0x40014000, 512) = 0

[und das abschliessende munmap(2).]

__deregister_frame_info(0x08049830, 0xbfffe82c, 0x08049930, 0x08048254, 0x4002dbac) = 0x0804994c
SYS_exit(0) = <void>
+++ exited (status 0) +++
dh@slarty[4]: /tmp/test8 (0)$

--
Es ist eine Gabe derer die Nichts anderes Kenn, das was sie da die
Dummheit nennen.
Und jeder, auch der es nich Mag
Bekommt davon was , jeden Tag. [WoKo in dag°]

< Previous Next >