summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2011-03-23 06:08:36 +0000
committerLiong Sauw Ming <ming@teluu.com>2011-03-23 06:08:36 +0000
commite538ab09fe8139da507eeab044243a79e6bf9ba2 (patch)
treee46b8c9f44f55d91155649d01ed12a1558606914
parentcc4a3ae0cbdb2d86ce6480d030006c9592375baa (diff)
Fixed #1221: Crash when SIP transport tried to write to a broken pipe.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3478 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/include/pj/sock.h9
-rw-r--r--pjlib/src/pj/sock_bsd.c5
-rw-r--r--pjlib/src/pj/sock_common.c5
-rw-r--r--pjlib/src/pj/sock_symbian.cpp1
-rw-r--r--pjsip-apps/src/pjsua/main.c12
-rw-r--r--pjsip/src/pjsip/sip_transport_tcp.c5
-rw-r--r--pjsip/src/pjsip/sip_transport_tls.c5
-rw-r--r--pjsip/src/pjsip/sip_transport_tls_ossl.c5
8 files changed, 47 insertions, 0 deletions
diff --git a/pjlib/include/pj/sock.h b/pjlib/include/pj/sock.h
index bdb24f03..cb3993cb 100644
--- a/pjlib/include/pj/sock.h
+++ b/pjlib/include/pj/sock.h
@@ -297,6 +297,9 @@ extern const pj_uint16_t PJ_TCP_NODELAY;
* @see pj_SO_REUSEADDR */
extern const pj_uint16_t PJ_SO_REUSEADDR;
+/** Do not generate SIGPIPE. @see pj_SO_NOSIGPIPE */
+extern const pj_uint16_t PJ_SO_NOSIGPIPE;
+
/** Set the protocol-defined priority for all packets to be sent on socket.
*/
extern const pj_uint16_t PJ_SO_PRIORITY;
@@ -333,6 +336,9 @@ extern const pj_uint16_t PJ_IP_DROP_MEMBERSHIP;
/** Get #PJ_SO_REUSEADDR constant */
PJ_DECL(pj_uint16_t) pj_SO_REUSEADDR(void);
+ /** Get #PJ_SO_NOSIGPIPE constant */
+ PJ_DECL(pj_uint16_t) pj_SO_NOSIGPIPE(void);
+
/** Get #PJ_SO_PRIORITY constant */
PJ_DECL(pj_uint16_t) pj_SO_PRIORITY(void);
@@ -366,6 +372,9 @@ extern const pj_uint16_t PJ_IP_DROP_MEMBERSHIP;
/** Get #PJ_SO_REUSEADDR constant */
# define pj_SO_REUSEADDR() PJ_SO_REUSEADDR
+ /** Get #PJ_SO_NOSIGPIPE constant */
+# define pj_SO_NOSIGPIPE() PJ_SO_NOSIGPIPE
+
/** Get #PJ_SO_PRIORITY constant */
# define pj_SO_PRIORITY() PJ_SO_PRIORITY
diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c
index 47e3fd14..4dbdc5c6 100644
--- a/pjlib/src/pj/sock_bsd.c
+++ b/pjlib/src/pj/sock_bsd.c
@@ -135,6 +135,11 @@ const pj_uint16_t PJ_SO_RCVBUF = SO_RCVBUF;
const pj_uint16_t PJ_SO_SNDBUF = SO_SNDBUF;
const pj_uint16_t PJ_TCP_NODELAY= TCP_NODELAY;
const pj_uint16_t PJ_SO_REUSEADDR= SO_REUSEADDR;
+#ifdef SO_NOSIGPIPE
+const pj_uint16_t PJ_SO_NOSIGPIPE = SO_NOSIGPIPE;
+#else
+const pj_uint16_t PJ_SO_NOSIGPIPE = 0xFFFF;
+#endif
#if defined(SO_PRIORITY)
const pj_uint16_t PJ_SO_PRIORITY = SO_PRIORITY;
#else
diff --git a/pjlib/src/pj/sock_common.c b/pjlib/src/pj/sock_common.c
index fa5858fd..564f2036 100644
--- a/pjlib/src/pj/sock_common.c
+++ b/pjlib/src/pj/sock_common.c
@@ -1137,6 +1137,11 @@ PJ_DEF(pj_uint16_t) pj_SO_REUSEADDR(void)
return PJ_SO_REUSEADDR;
}
+PJ_DEF(pj_uint16_t) pj_SO_NOSIGPIPE(void)
+{
+ return PJ_SO_NOSIGPIPE;
+}
+
PJ_DEF(pj_uint16_t) pj_SO_PRIORITY(void)
{
return PJ_SO_PRIORITY;
diff --git a/pjlib/src/pj/sock_symbian.cpp b/pjlib/src/pj/sock_symbian.cpp
index b1697642..10eb1fa6 100644
--- a/pjlib/src/pj/sock_symbian.cpp
+++ b/pjlib/src/pj/sock_symbian.cpp
@@ -53,6 +53,7 @@ const pj_uint16_t PJ_SOL_IP = 0xFFFF;
const pj_uint16_t PJ_SOL_TCP = 0xFFFF;
const pj_uint16_t PJ_SOL_UDP = 0xFFFF;
const pj_uint16_t PJ_SOL_IPV6 = 0xFFFF;
+const pj_uint16_t PJ_SO_NOSIGPIPE = 0xFFFF;
/* TOS */
const pj_uint16_t PJ_IP_TOS = 0;
diff --git a/pjsip-apps/src/pjsua/main.c b/pjsip-apps/src/pjsua/main.c
index 37941efe..5adf996d 100644
--- a/pjsip-apps/src/pjsua/main.c
+++ b/pjsip-apps/src/pjsua/main.c
@@ -66,16 +66,28 @@ static void setup_signal_handler(void)
SetConsoleCtrlHandler(&CtrlHandler, TRUE);
}
+static void setup_socket_signal()
+{
+}
+
#else
+#include <signal.h>
static void setup_signal_handler(void)
{
}
+static void setup_socket_signal()
+{
+ signal(SIGPIPE, SIG_IGN);
+}
+
#endif
int main(int argc, char *argv[])
{
+ setup_socket_signal();
+
do {
app_restart = PJ_FALSE;
diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c
index 1ad8fedc..43c82ae8 100644
--- a/pjsip/src/pjsip/sip_transport_tcp.c
+++ b/pjsip/src/pjsip/sip_transport_tcp.c
@@ -544,6 +544,7 @@ static pj_status_t tcp_create( struct tcp_listener *listener,
pj_activesock_cfg asock_cfg;
pj_activesock_cb tcp_callback;
const pj_str_t ka_pkt = PJSIP_TCP_KEEP_ALIVE_DATA;
+ pj_int32_t val = 1;
pj_status_t status;
@@ -631,6 +632,10 @@ static pj_status_t tcp_create( struct tcp_listener *listener,
tcp->ka_timer.cb = &tcp_keep_alive_timer;
pj_ioqueue_op_key_init(&tcp->ka_op_key.key, sizeof(pj_ioqueue_op_key_t));
pj_strdup(tcp->base.pool, &tcp->ka_pkt, &ka_pkt);
+
+ /* Prevent SIGPIPE */
+ pj_sock_setsockopt(tcp->sock, pj_SOL_SOCKET(), pj_SO_NOSIGPIPE(),
+ &val, sizeof(val));
/* Done setting up basic transport. */
*p_tcp = tcp;
diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c
index 59c7e93d..5fcfc39e 100644
--- a/pjsip/src/pjsip/sip_transport_tls.c
+++ b/pjsip/src/pjsip/sip_transport_tls.c
@@ -527,6 +527,7 @@ static pj_status_t tls_create( struct tls_listener *listener,
{
struct tls_transport *tls;
const pj_str_t ka_pkt = PJSIP_TLS_KEEP_ALIVE_DATA;
+ pj_int32_t val = 1;
pj_status_t status;
@@ -616,6 +617,10 @@ static pj_status_t tls_create( struct tls_listener *listener,
pj_ioqueue_op_key_init(&tls->ka_op_key.key, sizeof(pj_ioqueue_op_key_t));
pj_strdup(tls->base.pool, &tls->ka_pkt, &ka_pkt);
+ /* Prevent SIGPIPE */
+ pj_sock_setsockopt(tcp->sock, pj_SOL_SOCKET(), pj_SO_NOSIGPIPE(),
+ &val, sizeof(val));
+
/* Done setting up basic transport. */
*p_tls = tls;
diff --git a/pjsip/src/pjsip/sip_transport_tls_ossl.c b/pjsip/src/pjsip/sip_transport_tls_ossl.c
index d652b0be..d2f1b423 100644
--- a/pjsip/src/pjsip/sip_transport_tls_ossl.c
+++ b/pjsip/src/pjsip/sip_transport_tls_ossl.c
@@ -1229,6 +1229,7 @@ static pj_status_t tls_create( struct tls_listener *listener,
pj_ioqueue_t *ioqueue;
pj_ioqueue_callback tls_callback;
int rc;
+ pj_int32_t val = 1;
pj_status_t status;
@@ -1332,6 +1333,10 @@ static pj_status_t tls_create( struct tls_listener *listener,
tls->ka_timer.user_data = (void*) tls;
tls->ka_timer.cb = &tls_keep_alive_timer;
+ /* Prevent SIGPIPE */
+ pj_sock_setsockopt(tcp->sock, pj_SOL_SOCKET(), pj_SO_NOSIGPIPE(),
+ &val, sizeof(val));
+
/* Done setting up basic transport. */
*p_tls = tls;