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!
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!