Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2]) by hub.org (8.9.3/8.9.3) with ESMTP id TAA26623 for ; Wed, 8 Sep 1999 19:07:02 -0400 (EDT) (envelope-from tgl@sss.pgh.pa.us) Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id TAA01505; Wed, 8 Sep 1999 19:05:57 -0400 (EDT) To: "Ken J. Wright" cc: pgsql-interfaces@postgreSQL.org Subject: Re: [INTERFACES] firewall crashes backend In-reply-to: Your message of Wed, 08 Sep 1999 13:31:25 -0700 <3.0.1.32.19990908133125.0095bb50@ori-ind.com> Date: Wed, 08 Sep 1999 19:05:57 -0400 Message-ID: <1503.936831957@sss.pgh.pa.us> From: Tom Lane "Ken J. Wright" writes: > When connecting to postgresql 6.5.1 through a socks5 firewall via ODBC, the > following error occurs: > ERROR: postmaster: StreamConnection: accept: No route to host > Then the backend crashes. Ken, here is a patch. I can't test it very well since I don't have any easy way of provoking a failure at this stage of the connection. Would you check it? Line numbers are for 6.5, but it should apply against current with a few lines' offset, if you are using current. regards, tom lane *** src/backend/libpq/pqcomm.c.orig Wed Jul 7 13:17:47 1999 --- src/backend/libpq/pqcomm.c Wed Sep 8 19:00:51 1999 *************** *** 339,344 **** --- 339,348 ---- * the Postmaster uses select() to tell when the server master * socket is ready for accept(). * + * NB: this can NOT call elog() because it is invoked in the postmaster, + * not in standard backend context. If we get an error, the best we can do + * is log it to stderr. + * * RETURNS: STATUS_OK or STATUS_ERROR */ int *************** *** 352,358 **** (struct sockaddr *) & port->raddr, &addrlen)) < 0) { ! elog(ERROR, "postmaster: StreamConnection: accept: %m"); return STATUS_ERROR; } --- 356,362 ---- (struct sockaddr *) & port->raddr, &addrlen)) < 0) { ! perror("postmaster: StreamConnection: accept"); return STATUS_ERROR; } *************** *** 361,367 **** if (getsockname(port->sock, (struct sockaddr *) & port->laddr, &addrlen) < 0) { ! elog(ERROR, "postmaster: StreamConnection: getsockname: %m"); return STATUS_ERROR; } --- 365,371 ---- if (getsockname(port->sock, (struct sockaddr *) & port->laddr, &addrlen) < 0) { ! perror("postmaster: StreamConnection: getsockname"); return STATUS_ERROR; } *************** *** 374,386 **** pe = getprotobyname("TCP"); if (pe == NULL) { ! elog(ERROR, "postmaster: getprotobyname failed"); return STATUS_ERROR; } if (setsockopt(port->sock, pe->p_proto, TCP_NODELAY, &on, sizeof(on)) < 0) { ! elog(ERROR, "postmaster: setsockopt failed: %m"); return STATUS_ERROR; } } --- 378,390 ---- pe = getprotobyname("TCP"); if (pe == NULL) { ! perror("postmaster: StreamConnection: getprotobyname"); return STATUS_ERROR; } if (setsockopt(port->sock, pe->p_proto, TCP_NODELAY, &on, sizeof(on)) < 0) { ! perror("postmaster: StreamConnection: setsockopt"); return STATUS_ERROR; } }