Hallo Jan, On Tue, Oct 12, 2004 at 12:46:26AM +0200, Jan Trippler wrote:
Am Montag, 11. Oktober 2004 21:53 schrieb Daniel Lord:
On Fri, Oct 08, 2004 at 12:54:05AM +0200, Jan Trippler wrote:
/me
if ((sig[signatur].data = malloc(SIGLEN+1)) == NULL) { perror("malloc"); goto failed; } sig[signatur].data[0]=0x00;
while (fgets(tmp, SIGWIDTH, fd) != NULL) { if (emptyline(tmp) != 0) { strcat(sig[signatur].data,tmp); [...] Schlimmer: Du prüfst nicht, wie lang der Inhalt von .data bereits ist. Eine Signatur mit mehr als 6 Zeilen a 84 Zeichen würde wahrscheinlich einen Segmentation Fault bewirken, da in nicht initialisierten Speicher geschrieben wird.
Nein, malloc wird vorher immer ausgeführt. Die Signatur fällt später allerdings durchs Raster. [*]
Nein, das meine ich nicht. Du initialisierst mit SIGLEN+1, prüfst aber nicht, wieviele Zeilen Du an die aktuelle Signatur (also den .data-Speicher) anhängst. Da könnten 100 Zeilen je 80 Zeichen stehen, was weit über SIGLEN hinausgeht, Du hängst ungeprüft an .data an, wenn dazwischen keine Leerzeile kommt. Damit provozierst Du einen segfault, weil Du über den per malloc reservierten Bereich hinauskommst. Deine Größenprüfungen kommen ja erst nach dem Einlesen der kompletten Datei.
...jetzt hab ich's auch verstanden/gesehen. Gedacht war das anderst. Implemtiert mal kurz wie oben gesehen. Realloc sollte benutzt werden und immer nur um eine _Zeile_ erweitern. Wie gesagt sollte... also schon wieder PEBCAK so langsam mach ich mir sorgen :( Greetings Daniel, der sich wohl bald ne neue Tastatur kauft *fg* -- No user-serviceable parts inside!