summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-05-22 21:55:31 +0000
committerBenny Prijono <bennylp@teluu.com>2007-05-22 21:55:31 +0000
commit9d72f1aa58317d2667feef40e54eef4d9fb5df29 (patch)
tree08f705b5f4413ffe0364a066fe3a1b1c3d6af179
parenta8a95675cba90ecd5ba2b7b36432641d4bf5703d (diff)
Fixed ticket #286: Bug in STUN FINGERPRINT verification and logging STUN message
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1289 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjnath/src/pjnath/stun_msg.c8
-rw-r--r--pjnath/src/pjnath/stun_msg_dump.c8
-rw-r--r--pjnath/src/pjstun-srv-test/main.c2
-rw-r--r--pjnath/src/pjstun-srv-test/server.h1
-rw-r--r--pjnath/src/pjstun-srv-test/turn_usage.c7
5 files changed, 16 insertions, 10 deletions
diff --git a/pjnath/src/pjnath/stun_msg.c b/pjnath/src/pjnath/stun_msg.c
index 74dbcfa9..5088954d 100644
--- a/pjnath/src/pjnath/stun_msg.c
+++ b/pjnath/src/pjnath/stun_msg.c
@@ -1656,15 +1656,15 @@ PJ_DEF(pj_status_t) pj_stun_msg_check(const pj_uint8_t *pdu, unsigned pdu_len,
if (GETVAL32H(pdu, 4) == PJ_STUN_MAGIC) {
/* Check if FINGERPRINT attribute is present */
- if (GETVAL16H(pdu, msg_len + 20) == PJ_STUN_ATTR_FINGERPRINT) {
- pj_uint16_t attr_len = GETVAL16H(pdu, msg_len + 22);
- pj_uint32_t fingerprint = GETVAL32H(pdu, msg_len + 24);
+ if (GETVAL16H(pdu, msg_len + 20 - 8) == PJ_STUN_ATTR_FINGERPRINT) {
+ pj_uint16_t attr_len = GETVAL16H(pdu, msg_len + 20 - 8 + 2);
+ pj_uint32_t fingerprint = GETVAL32H(pdu, msg_len + 20 - 8 + 4);
pj_uint32_t crc;
if (attr_len != 4)
return PJNATH_ESTUNINATTRLEN;
- crc = pj_crc32_calc(pdu, msg_len + 20);
+ crc = pj_crc32_calc(pdu, msg_len + 20 - 8);
crc ^= STUN_XOR_FINGERPRINT;
if (crc != fingerprint)
diff --git a/pjnath/src/pjnath/stun_msg_dump.c b/pjnath/src/pjnath/stun_msg_dump.c
index cbf29a00..d8aab42c 100644
--- a/pjnath/src/pjnath/stun_msg_dump.c
+++ b/pjnath/src/pjnath/stun_msg_dump.c
@@ -96,6 +96,7 @@ static int print_attr(char *buffer, unsigned length,
len = pj_ansi_snprintf(p, end-p,
", INVALID ADDRESS FAMILY!\n");
}
+ APPLY();
}
break;
@@ -117,6 +118,7 @@ static int print_attr(char *buffer, unsigned length,
", value=%d (0x%x)\n",
(pj_uint32_t)attr->value,
(pj_uint32_t)attr->value);
+ APPLY();
}
break;
@@ -133,6 +135,7 @@ static int print_attr(char *buffer, unsigned length,
", value=\"%.*s\"\n",
(int)attr->value.slen,
attr->value.ptr);
+ APPLY();
}
break;
@@ -146,6 +149,7 @@ static int print_attr(char *buffer, unsigned length,
attr->err_code,
(int)attr->reason.slen,
attr->reason.ptr);
+ APPLY();
}
break;
@@ -191,12 +195,10 @@ static int print_attr(char *buffer, unsigned length,
case PJ_STUN_ATTR_USE_CANDIDATE:
default:
len = pj_ansi_snprintf(p, end-p, "\n");
-
+ APPLY();
break;
}
- APPLY();
-
return (p-buffer);
on_return:
diff --git a/pjnath/src/pjstun-srv-test/main.c b/pjnath/src/pjstun-srv-test/main.c
index aad1c0f2..bfad859f 100644
--- a/pjnath/src/pjstun-srv-test/main.c
+++ b/pjnath/src/pjstun-srv-test/main.c
@@ -132,7 +132,7 @@ int main(int argc, char *argv[])
*/
status = pj_stun_turn_usage_create(srv, PJ_SOCK_DGRAM, NULL,
- 3478, &turn);
+ 3478, o.use_fingerprint, &turn);
if (status != PJ_SUCCESS) {
pj_stun_perror(THIS_FILE, "Unable to create bind usage", status);
return 1;
diff --git a/pjnath/src/pjstun-srv-test/server.h b/pjnath/src/pjstun-srv-test/server.h
index f06d7f85..2be148d8 100644
--- a/pjnath/src/pjstun-srv-test/server.h
+++ b/pjnath/src/pjstun-srv-test/server.h
@@ -122,6 +122,7 @@ PJ_DECL(pj_status_t) pj_stun_turn_usage_create(pj_stun_server *srv,
int type,
const pj_str_t *ip_addr,
unsigned port,
+ pj_bool_t use_fingerprint,
pj_stun_usage **p_bu);
PJ_DECL(pj_status_t) pj_stun_turn_usage_set_credential(pj_stun_usage *turn,
diff --git a/pjnath/src/pjstun-srv-test/turn_usage.c b/pjnath/src/pjstun-srv-test/turn_usage.c
index c3e53577..bbed6480 100644
--- a/pjnath/src/pjstun-srv-test/turn_usage.c
+++ b/pjnath/src/pjstun-srv-test/turn_usage.c
@@ -79,6 +79,7 @@ struct turn_usage
pj_stun_session *default_session;
pj_hash_table_t *client_htable;
pj_stun_auth_cred *cred;
+ pj_bool_t use_fingerprint;
unsigned max_bw_kbps;
unsigned max_lifetime;
@@ -146,6 +147,7 @@ PJ_DEF(pj_status_t) pj_stun_turn_usage_create(pj_stun_server *srv,
int type,
const pj_str_t *ip_addr,
unsigned port,
+ pj_bool_t use_fingerprint,
pj_stun_usage **p_bu)
{
pj_pool_t *pool;
@@ -172,6 +174,7 @@ PJ_DEF(pj_status_t) pj_stun_turn_usage_create(pj_stun_server *srv,
tu->next_port = START_PORT;
tu->max_bw_kbps = 64;
tu->max_lifetime = 10 * 60;
+ tu->use_fingerprint = use_fingerprint;
status = pj_sockaddr_in_init(&local_addr, ip_addr, (pj_uint16_t)port);
if (status != PJ_SUCCESS)
@@ -199,7 +202,7 @@ PJ_DEF(pj_status_t) pj_stun_turn_usage_create(pj_stun_server *srv,
sess_cb.on_send_msg = &tu_sess_on_send_msg;
sess_cb.on_rx_request = &tu_sess_on_rx_request;
status = pj_stun_session_create(&si->stun_cfg, "turns%p", &sess_cb,
- PJ_FALSE, &tu->default_session);
+ use_fingerprint, &tu->default_session);
if (status != PJ_SUCCESS) {
pj_stun_usage_destroy(tu->usage);
return status;
@@ -637,7 +640,7 @@ static pj_status_t client_create(struct turn_usage *tu,
sess_cb.on_rx_request = &client_sess_on_rx_msg;
sess_cb.on_rx_indication = &client_sess_on_rx_msg;
status = pj_stun_session_create(tu->cfg, client->obj_name,
- &sess_cb, PJ_FALSE,
+ &sess_cb, tu->use_fingerprint,
&client->session);
if (status != PJ_SUCCESS) {
pj_pool_release(pool);