Program received signal SIGPIPE, Broken pipe
-
Ich kriege bei einem Programm immer:
Program received signal SIGPIPE, Broken pipe. 0xb7f7295e in write () from /lib/tls/libc.so.6 (gdb) backtrace #0 0xb7f7295e in write () from /lib/tls/libc.so.6 ... ... ...
Die verantwortliche Funktion ist:[cpp]int sock;
char* data;/*
blablabla
...
...
/
write (sock, data, strlen(data))[/cpp]
edit: char data; natuerlich und nicht char data;
OS ist Linux.Woran liegt das?
-
char data; ist nur ein einziges zeichen. write und strlen erwarten adressen auf die daten.
-
sorry, ich haette dazu schreiben sollen: die Parameter sind korrekt. Dadurch kommt er das Problem nicht zustande.
-
Ich würde einfach mal die folgenden Dinge überprüfen:
Socket geöffnet ja/nein
Socket bereit zum senden (mal nen Teststring schicken und gucken ob er ankommt) ja/nein
String nullterminiert ja/nein
String länger als erlaubt (vielleicht nen max bei write) ja/neinVielleicht hilfts ja.
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Eigentlich sollten alle Kriterien erfuellt sein...
->Socket ist offen(Das sieht man daran, dass ja die ersten 8 Schreibvorgaenge erfolgreich waren)
->Bereit zum senden muesste er auch sein(selbe Begruendung wie oben)
->String ist konsistent(selbe Begruendung wie oben)Hier ist mal ein Ausschnitt des relevanten Codes:[cpp]
void xp_write(char *data)
{if(write (sock, data, strlen(data)) < 0)
{
printf("write() failed\n");
exit(-1);
}
}void build3(....)
{
/...
...
.../for(i=0; i<count; i++)
{
printf("%d. schreiben erfolgreich\n",i);
xp_write(b2);
}
}
[/cpp]Hab mir auch mal die Muehe gemacht, das durch den gdb zu jagen
UniX:~/Desktop/XsploitS$ gdb ./a.out GNU gdb 6.3-debian Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) run Starting program: /home/raptor/Desktop/a.out 0. schreiben erfolgreich 1. schreiben erfolgreich 2. schreiben erfolgreich 3. schreiben erfolgreich 4. schreiben erfolgreich 5. schreiben erfolgreich 6. schreiben erfolgreich 7. schreiben erfolgreich Program received signal SIGPIPE, Broken pipe. 0xb7f7295e in write () from /lib/tls/libc.so.6 (gdb) backtrace #0 0xb7f7295e in write () from /lib/tls/libc.so.6 #1 0x08048743 in xp_write () #2 0x08048a73 in build3 () #3 0x08048b4e in foo () #4 0x08048bb6 in main () (gdb)
Was mich halt n bisschen irritiert, ist, dass ich 8 Mal erfolgreich schreiben kann, beim neunten Mal aber ein SIGPIPE kommt.
Woran liegt das denn?!
-
Was ist das denn für ein Socket und was passiert mit der Gegenstelle, also dem Leser? Wenn der sich verabschiedet und Du weiter Kram sendest, dann kommt der SIGPIPE. Du kannst ihn dann einfach mit signal(SIGPIPE, SIG_IGN) ignorieren lassen, dann bekommt write einen Fehlercode.
-
Ich moechte den kompletten Code hier nur ungerne Posten, da er etwas "brisanterer" Natur ist. Ich schicke ihn denjenigen Leuten, die nachfragen aber gern per mail.
-
Na, was passiert jetzt nach einem signal(SIGPIPE, SIG_IGN)? Was sagt write dann?
-
Hab den code jetzt mal wie folgt modifiziert:
void xp_write(char *data) { signal(SIGPIPE, SIG_IGN); if(write (sock, data, strlen(data)) < 0) { printf("write() failed\n"); exit(-1); } }
Hoffe, dass das so richtig ist. (Benutze signal() normalerweise nicht.)
Ich bekomme aber wieder ein:Program received signal SIGPIPE, Broken pipe. 0xb7f7295e in write () from /lib/tls/libc.so.6
-
Du brauchst nicht zehn mal signal aufzurufen, sondern packst den Code halt zu deinen Initialisierungsroutinen; statt SIG_ING kannst Du auch deinen eigenen Signalhandler schreiben:
#include <signal.h> void foo(int n) { fputs("SIGPIPE gefangen und ignoriert", stderr); } int main() { signal(SIGPIPE, foo);
Wenn dein Code schon top secret ist, dann würde ich _vielleicht_ mal in die Doku schauen, sonst kann dir nämlich wirklich niemand helfen ...
-
Ok, ich poste mal den link:
http://www.securiteam.com/exploits/6T00L2ABPW.html
-
Ok, frage ich vielleicht erstmal was einfacheres
->Haben andere auch so ein Problem?
->Funktioniert der Exploit bei einigen von euch?Bitte um rege Antworten!
-
Kann den bitte mal jemand ausprobieren?
Biiitte