[testsuite patch] race: server-kill.exp: Connection reset by peer [Re: [patch+7.6] Fix 7.5 regression crashing GDB if gdbserver dies]

Jan Kratochvil
2013-04-06T19:26:47Z

[-- Attachment #1: Type: text/plain, Size: 1919 bytes --]

On Fri, 22 Mar 2013 20:18:41 +0100, Jan Kratochvil wrote:
> +set server_pid [exp_pid -i [board_info target fileid]]
> +remote_exec target "kill -9 $server_pid"
> +
> +gdb_test "step" "Remote connection closed"

Getting occasionally randomly:
Remote communication error. Target disconnected.: Connection reset by peer.
(gdb) FAIL: gdb.server/server-kill.exp: tstatus

(it was FAILing on "step" before, "tstatus" vs. "step" does not matter)

I even Googled one may get ECONNRESET by writing into a closed TCP socket:
http://stackoverflow.com/questions/2974021/what-does-econnreset-mean-in-the-context-of-an-af-local-socket

But I was unable to reproduce it myself (kernel-3.8.4-202.fc18.x86_64) with
the attached testcase:
sleeping ... done
write ok
ssize=0
read ok
send: send.c:53: main: Unexpected error: Broken pipe.
Aborted
by:
* nc -l 5000
* ./send (starts sleeping)
* kill -9 `pidof ncat` (Fedora nc is ncat)
* # send resumes sleeping

I get at most EPIPE but never ECONNRESET. send vs. write and recv vs. read
also make no difference there.

With no answer I will check in this patch as this issue seems unrelated to the
problem, GDB still works properly even with ECONNRESET. I was just curious.

Jan

gdb/testsuite/
2013-04-06 Jan Kratochvil <jan.kratochvil@redhat.com>

* gdb.server/server-kill.exp (tstatus): Permit also ECONNRESET
response.

diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp
index 1b48152..75c9627 100644
--- a/gdb/testsuite/gdb.server/server-kill.exp
+++ b/gdb/testsuite/gdb.server/server-kill.exp
@@ -42,4 +42,4 @@ remote_exec target "kill -9 $server_pid"

# Force GDB to talk with GDBserver, so that we can get the
# "connection closed" error.
-gdb_test "tstatus" "Remote connection closed"
+gdb_test "tstatus" {Remote connection closed|Remote communication error\. Target disconnected\.: Connection reset by peer\.}

[-- Attachment #2: send.c --]
[-- Type: text/plain, Size: 1333 bytes --]

#define _GNU_SOURCE 1
#include <sys/socket.h>
#include <assert.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

static volatile int piped;
static void handler(int signo) {
piped=1;
}

int main (void) {
setbuf(stdout,NULL);
signal(SIGPIPE,handler);
int fd=socket(PF_INET,SOCK_STREAM,0);
assert(fd!=-1);
struct sockaddr_in addr;
memset(&addr,0,sizeof addr);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
addr.sin_port=htons(5000);
int i=connect(fd,(struct sockaddr *)&addr,sizeof(addr));
assert(i==0);
char charbuf='a';
ssize_t ssize=send(fd,&charbuf,1,0);
assert(ssize==1);
fputs("sleeping ...",stdout);
sleep(5);
charbuf='b';
puts(" done");
errno=0;
// ssize=send(fd,&charbuf,1,0);
ssize=write(fd,&charbuf,1);
assert_perror(errno);
assert(ssize==1);
// puts("send ok");
puts("write ok");
errno=0;
// ssize=recv(fd,&charbuf,1,0);
ssize=read(fd,&charbuf,1);
assert_perror(errno);
printf("ssize=%zd\n",ssize);
assert(ssize==0);
// puts("recv ok");
puts("read ok");
errno=0;
ssize=send(fd,&charbuf,1,0);
// ssize=write(fd,&charbuf,1);
assert_perror(errno);
assert(ssize==1);
puts("send ok");
// puts("write ok");
if (piped)
puts("SIGPIPE");
return 0;
}