Commit 0b257766 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Attempt an even more comprehensive fix for a bug in Solaris:

If the remote end RST's a TCP connection, all socket related syscalls
seems to return EINVAL.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@4868 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 9e51782b
......@@ -696,10 +696,12 @@ VRT_r_client_ip(const struct sess *sp)
struct sockaddr *
VRT_r_server_ip(struct sess *sp)
{
int i;
if (sp->mysockaddr->sa_family == AF_UNSPEC)
assert(!getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen)
|| errno == ECONNRESET);
if (sp->mysockaddr->sa_family == AF_UNSPEC) {
i = getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen);
assert(TCP_Check(i));
}
return (sp->mysockaddr);
}
......
......@@ -85,7 +85,7 @@ server_thread(void *priv)
{
struct server *s;
struct vtclog *vl;
int i, fd;
int i, j, fd;
struct sockaddr_storage addr_s;
struct sockaddr *addr;
socklen_t l;
......@@ -107,8 +107,9 @@ server_thread(void *priv)
vtc_log(vl, 3, "accepted fd %d", fd);
http_process(vl, s->spec, fd, s->sock);
vtc_log(vl, 3, "shutting fd %d", fd);
assert((shutdown(fd, SHUT_WR) == 0)
|| errno == ENOTCONN || errno == ECONNRESET);
j = shutdown(fd, SHUT_WR);
if (!TCP_Check(j))
vtc_log(vl, 0, "Shutdown failed: %s", strerror(errno));
TCP_close(&fd);
}
macro_def(s->vl, s->name, "addr", NULL);
......
......@@ -60,7 +60,16 @@ int SUB_run(struct vsb *sb, sub_func_f *func, void *priv, const char *name,
#define TCP_ADDRBUFSIZE 64
#define TCP_PORTBUFSIZE 16
#if defined (__SVR4) && defined (__sun)
/*
* Solaris returns EINVAL if the other end unexepectedly reset the
* connection. This is a bug in Solaris.
*/
#define TCP_Check(a) ((a) == 0 || errno == ECONNRESET || errno == ENOTCONN \
|| errno == EINVAL)
#else
#define TCP_Check(a) ((a) == 0 || errno == ECONNRESET || errno == ENOTCONN)
#endif
#define TCP_Assert(a) assert(TCP_Check(a))
......
......@@ -236,9 +236,11 @@ TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec)
void
TCP_close(int *s)
{
assert (close(*s) == 0 ||
errno == ECONNRESET ||
errno == ENOTCONN);
int i;
i = close(*s);
assert (TCP_Check(i));
*s = -1;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment