Date: Fri, 2 Oct 1998 15:44:29 +0200 (MET DST) From: Jean-Francois Dockes <dockes@cdkit.remcomp.fr> To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: bin/8129: libc_r write() on broken pipe returns no error Message-ID: <199810021344.PAA24308@yquem.cdkit.remcomp.fr>
next in thread | raw e-mail | index | archive | help
>Number: 8129 >Category: bin >Synopsis: libc_r write() on broken pipe, no error return. >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Oct 2 07:00:00 PDT 1998 >Last-Modified: >Originator: Jean-Francois Dockes >Organization: CDKIT >Release: FreeBSD 2.2.7-RELEASE i386 >Environment: Standard 2.2.7 RELEASE on pentium machine. >Description: When linking with libc_r and catching SIGPIPE, a write() call on a pipe or socket with no reader doesn't return an error. The program seems to be looping sending/catching SIGPIPES. This is a real problem for a network server that talks to the client before forking, or needs to cleanup when the client goes away. >How-To-Repeat: The following trivial program can be used. Pipe it to 'more' and type 'q'. If the program was linked normally, it prints the normal error (write: Broken pipe). If linked with libc_r it loops forever, printing "Got sig 13". #include <stdio.h> #include <signal.h> void sigshow(int sig) { fprintf(stderr, "Got sig %d\n", sig); } main() { struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = sigshow; sigaction(SIGPIPE, &sa, NULL); for (;;) { if (write(1, "THIS IS DATA\n", 13) != 13) { perror("write"); exit(1); } } } >Fix: No idea. >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810021344.PAA24308>