PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] String Verarbeitung: Merkwürdiges Problem



Trillian
26-06-2003, 22:03
Hallo,
ein User hat Schwierigkeiten mit folgendem Code:

(Ich verlinke lieber auf ViewCVS als den Code hier zu pasten, da hats Syntax Highlighting)
http://cvs.berlios.de/cgi-bin/viewcvs.cgi/gift-opennap/giFT-OpenNap/src/opn_node.c?rev=1.10&content-type=text/vnd.viewcvs-markup

Es geht um die Funktion on_napigator_read()

Diese füllt den Puffer char buf[RW_BUFFER] mit 0en und liest dann Daten vom Socket in den Puffer rein.
Die Daten werden per HTTP übertragen, also gucke ich zuerst, ob ich einen HTTP-Header empfangen habe - wenn ja, wird ans Ende des Headers gesprungen (der endet immer mit \r\n\r\n, das habe ich überprüft).

Anschließend werden die Daten zeilenweise ausgewertet.

Beim User (Mac OS X 10.2, gcc 3.1 20020420 Prerelease) gibts dann folgendes:

#0 0x9000ea20 in strchr ()
#1 0x0029f6b0 in on_napigator_read (fd=10, input=4, udata=0x25dd60)
at opn_node.c:132
...
(gdb) f 1
#1 0x0029f6b0 in on_napigator_read (fd=10, input=4, udata=0x25dd60)
at opn_node.c:132
132 if (!(ptr = strchr(ptr, '\n')) || !(++ptr) ||
!strlen(ptr))
(gdb) p ptr
$1 = 0x78393500 <Address 0x78393500 out of bounds>
(gdb) p buf
$2 = "HTTP/1.1 200 OK\r\nDate: Thu, 26 Jun 2003 00:52:49
GMT\r\nServer: Apache/1.3.27 (Unix) mod_throttle/3.1.2
PHP/4.2.3\r\nX-Powered-By: PHP/4.2.3\r\nExpires: Mon, 26 Jul 1997
05:00:00 GMT\r\nLast-Modified: Thu, 26"...

In "buf" steht genau das drin, was drin stehen sollte, Format stimmt auch etc.

Ich kann mir nicht erklären, wieso ptr out-of-bounds laufen kann - bei jeder Zuweisung überprüfe ich, ob er nicht NULL geworden ist! Zur Sicherheit fülle ich auch noch buf am Anfang der Funktion mit 0en... da stimmt doch was nicht :/

Die Zuweisung am Ende der Schleife habe ich auch schonmal umgestellt:



ptr = strchr(...);
if (!ptr)
break;

ptr++;
if (!ptr && 0 == strlen(ptr))
break;


...weil ich an einen Compiler-Bug gedacht hatte.

Ich weiß einfach nicht mehr, was ich noch überprüfen soll! Kann mir jemand helfen?

Danke im Voraus!

anda_skoa
27-06-2003, 08:51
Hmm.

Vielleicht liegts am !(++ptr)

wenn ptr schon ans Ende zeigt, macht ++ptr einen Zugriff auf einen ungültigen Bereich.

Ciao,
_

wraith
27-06-2003, 12:31
Teste vorher doch mal,ob sich ptr noch im gültigen Bereich befindet.
Du kennst die max. Größe vun buf,also ist das kein Problem (reicht ja ein Test gegen die obere Grenze).


Beim lesen eines Strings mit sscanf,sollte man immer die maximale Anzahl an Zeichen angeben,sonst droht Buffer-overflow.

Obwohl es in diesem speziellen Fall egal ist,ist die Verwendung von memset gefährlich
Ein char buf[RW_BUFFER] = {0},macht das gleiche,aber sicher.
Sonst machst du irgend ein memset 0 mit einem Feld von integern,und das kann böse ende.

Trillian
29-06-2003, 17:32
Gna gna gna...

Es lag am sscanf(). Dämlicher Anfänger-Fehler :o

Danke für's Draufstubsen :)

Trillian
02-07-2003, 18:54
Um, noch 'ne dumme Frage:

Wie geb ich denn die maximale Anzahl der zu lesenden Zeichen an, wenn die in 'nem Makro drinsteht?