From 6a45ddbfa87978d32e35656f947e6ef8da9f1faf Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Mon, 28 May 2007 12:58:57 +0000 Subject: Fixed ticket #306: Error in SIP transport lookup because of memory alignment problem (thanks Samuel Vinson) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1310 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/include/pjsip/sip_transport.h | 26 ++++++++++++++++++++++---- pjsip/src/pjsip/sip_transport.c | 15 +++++---------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/pjsip/include/pjsip/sip_transport.h b/pjsip/include/pjsip/sip_transport.h index aadd51ea..a86a0319 100644 --- a/pjsip/include/pjsip/sip_transport.h +++ b/pjsip/include/pjsip/sip_transport.h @@ -605,8 +605,29 @@ PJ_DECL(pj_status_t) pjsip_tx_data_set_transport(pjsip_tx_data *tdata, * TRANSPORT * *****************************************************************************/ +/** + * Type of callback to receive transport operation status. + */ typedef void (*pjsip_transport_callback)(pjsip_transport *tp, void *token, pj_ssize_t sent_bytes); + +/** + * This structure describes transport key to be registered to hash table. + */ +typedef struct pjsip_transport_key +{ + /** + * Transport type. + */ + long type; + + /** + * Destination address. + */ + pj_sockaddr rem_addr; + +} pjsip_transport_key; + /** * This structure represent the "public" interface of a SIP transport. * Applications normally extend this structure to include transport @@ -623,10 +644,7 @@ struct pjsip_transport pj_bool_t is_shutdown; /**< Being shutdown? */ /** Key for indexing this transport in hash table. */ - struct { - pjsip_transport_type_e type; /**< Transport type. */ - pj_sockaddr rem_addr; /**< Remote addr (zero for UDP) */ - } key; + pjsip_transport_key key; char *type_name; /**< Type name. */ unsigned flag; /**< #pjsip_transport_flags_e */ diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c index 49afe464..7dcfb711 100644 --- a/pjsip/src/pjsip/sip_transport.c +++ b/pjsip/src/pjsip/sip_transport.c @@ -81,12 +81,6 @@ struct pjsip_tpmgr pj_status_t (*on_tx_msg)(pjsip_endpoint*, pjsip_tx_data*); }; -/* Key for looking up hash table */ -struct transport_key -{ - pjsip_transport_type_e type; - pj_sockaddr addr; -}; /***************************************************************************** * @@ -1351,15 +1345,16 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr, * specific transport/listener to be used to send message to. * In this case, lookup the transport from the hash table. */ - struct transport_key key; + pjsip_transport_key key; int key_len; pjsip_transport *transport; + pj_bzero(&key, sizeof(key)); key_len = sizeof(key.type) + addr_len; /* First try to get exact destination. */ key.type = type; - pj_memcpy(&key.addr, remote, addr_len); + pj_memcpy(&key.rem_addr, remote, addr_len); transport = (pjsip_transport*) pj_hash_get(mgr->table, &key, key_len, NULL); @@ -1371,7 +1366,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr, if (type == PJSIP_TRANSPORT_LOOP || type == PJSIP_TRANSPORT_LOOP_DGRAM) { - pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.addr; + pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.rem_addr; pj_bzero(addr, sizeof(pj_sockaddr_in)); key_len = sizeof(key.type) + sizeof(pj_sockaddr_in); @@ -1383,7 +1378,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr, else if ((flag & PJSIP_TRANSPORT_DATAGRAM) && (remote_addr->addr.sa_family == PJ_AF_INET)) { - pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.addr; + pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.rem_addr; pj_bzero(addr, sizeof(pj_sockaddr_in)); addr->sin_family = PJ_AF_INET; -- cgit v1.2.3