Changeset 1021 for pjproject/trunk/pjlib-util/src/pjlib-util/stun_msg.c
- Timestamp:
- Mar 1, 2007 12:08:27 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib-util/src/pjlib-util/stun_msg.c
r1003 r1021 518 518 int attr_type, 519 519 pj_bool_t xor_ed, 520 const pj_sockaddr_t *addr, 520 521 unsigned addr_len, 521 const pj_sockaddr_t *addr,522 522 pj_stun_generic_ip_addr_attr **p_attr) 523 523 { … … 560 560 int attr_type, 561 561 pj_bool_t xor_ed, 562 unsigned addr_len,563 const pj_sockaddr_t *addr)562 const pj_sockaddr_t *addr, 563 unsigned addr_len) 564 564 { 565 565 pj_stun_generic_ip_addr_attr *attr; … … 567 567 568 568 status = pj_stun_generic_ip_addr_attr_create(pool, attr_type, xor_ed, 569 addr _len, addr, &attr);569 addr, addr_len, &attr); 570 570 if (status != PJ_SUCCESS) 571 571 return status; … … 1435 1435 PJ_INLINE(pj_uint16_t) GET_VAL16(const pj_uint8_t *pdu, unsigned pos) 1436 1436 { 1437 pj_uint16_t val = (pj_uint16_t) ((pdu[pos] << 8) + pdu[pos+1]); 1438 return pj_ntohs(val); 1437 return (pj_uint16_t) ((pdu[pos] << 8) + pdu[pos+1]); 1439 1438 } 1440 1439 1441 1440 PJ_INLINE(pj_uint32_t) GET_VAL32(const pj_uint8_t *pdu, unsigned pos) 1442 1441 { 1443 pj_uint32_t val = (pdu[pos+0] << 24) + 1444 (pdu[pos+1] << 16) + 1445 (pdu[pos+2] << 8) + 1446 (pdu[pos+3]); 1447 return pj_ntohl(val); 1442 return (pdu[pos+0] << 24) + 1443 (pdu[pos+1] << 16) + 1444 (pdu[pos+2] << 8) + 1445 (pdu[pos+3]); 1448 1446 } 1449 1447 … … 1466 1464 return PJLIB_UTIL_ESTUNINMSGTYPE; 1467 1465 1466 /* Check the PDU length */ 1467 msg_len = GET_VAL16(pdu, 2); 1468 if ((msg_len + 20 > pdu_len) || 1469 ((options & PJ_STUN_IS_DATAGRAM) && msg_len + 20 != pdu_len)) 1470 { 1471 return PJLIB_UTIL_ESTUNINMSGLEN; 1472 } 1473 1468 1474 /* If magic is set, then there is great possibility that this is 1469 1475 * a STUN message. 1470 1476 */ 1471 if (GET_VAL32(pdu, 4) != PJ_STUN_MAGIC) 1472 return PJLIB_UTIL_ESTUNNOTMAGIC; 1473 1474 /* Check the PDU length */ 1475 msg_len = GET_VAL16(pdu, 2); 1476 if ((msg_len > pdu_len) || 1477 ((options & PJ_STUN_IS_DATAGRAM) && msg_len != pdu_len)) 1478 { 1479 return PJLIB_UTIL_ESTUNINMSGLEN; 1480 } 1481 1482 /* Check if FINGERPRINT attribute is present */ 1483 if (GET_VAL16(pdu, msg_len + 20) == PJ_STUN_ATTR_FINGERPRINT) { 1484 pj_uint16_t attr_len = GET_VAL16(pdu, msg_len + 22); 1485 pj_uint32_t fingerprint = GET_VAL32(pdu, msg_len + 24); 1486 pj_uint32_t crc; 1487 1488 if (attr_len != 4) 1489 return PJLIB_UTIL_ESTUNINATTRLEN; 1490 1491 crc = pj_crc32_calc(pdu, msg_len + 20); 1492 crc ^= STUN_XOR_FINGERPRINT; 1493 1494 if (crc != fingerprint) 1495 return PJLIB_UTIL_ESTUNFINGERPRINT; 1477 if (GET_VAL32(pdu, 4) == PJ_STUN_MAGIC) { 1478 1479 /* Check if FINGERPRINT attribute is present */ 1480 if (GET_VAL16(pdu, msg_len + 20) == PJ_STUN_ATTR_FINGERPRINT) { 1481 pj_uint16_t attr_len = GET_VAL16(pdu, msg_len + 22); 1482 pj_uint32_t fingerprint = GET_VAL32(pdu, msg_len + 24); 1483 pj_uint32_t crc; 1484 1485 if (attr_len != 4) 1486 return PJLIB_UTIL_ESTUNINATTRLEN; 1487 1488 crc = pj_crc32_calc(pdu, msg_len + 20); 1489 crc ^= STUN_XOR_FINGERPRINT; 1490 1491 if (crc != fingerprint) 1492 return PJLIB_UTIL_ESTUNFINGERPRINT; 1493 } 1496 1494 } 1497 1495 … … 1820 1818 * Print the message structure to a buffer. 1821 1819 */ 1822 PJ_DEF(pj_status_t) pj_stun_msg_encode( constpj_stun_msg *msg,1820 PJ_DEF(pj_status_t) pj_stun_msg_encode(pj_stun_msg *msg, 1823 1821 pj_uint8_t *buf, unsigned buf_size, 1824 1822 unsigned options, … … 1834 1832 unsigned printed; 1835 1833 pj_status_t status; 1836 unsigned i , length;1834 unsigned i; 1837 1835 1838 1836 … … 1899 1897 */ 1900 1898 if (amsg_integrity && afingerprint) { 1901 length = (pj_uint16_t)((buf - start) - 20 + 24 + 8);1899 msg->hdr.length = (pj_uint16_t)((buf - start) - 20 + 24 + 8); 1902 1900 } else if (amsg_integrity) { 1903 length = (pj_uint16_t)((buf - start) - 20 + 24);1901 msg->hdr.length = (pj_uint16_t)((buf - start) - 20 + 24); 1904 1902 } else if (afingerprint) { 1905 length = (pj_uint16_t)((buf - start) - 20 + 8);1903 msg->hdr.length = (pj_uint16_t)((buf - start) - 20 + 8); 1906 1904 } else { 1907 length = (pj_uint16_t)((buf - start) - 20);1905 msg->hdr.length = (pj_uint16_t)((buf - start) - 20); 1908 1906 } 1909 1907 1910 1908 /* hdr->length = pj_htons(length); */ 1911 *(buf+2) = (pj_uint8_t)((length >> 8) & 0x00FF);1912 *(buf+3) = (pj_uint8_t)(length & 0x00FF);1909 start[2] = (pj_uint8_t)((msg->hdr.length >> 8) & 0x00FF); 1910 start[3] = (pj_uint8_t)(msg->hdr.length & 0x00FF); 1913 1911 1914 1912 /* Calculate message integrity, if present */ … … 2089 2087 *p_response = NULL; 2090 2088 2091 if ( PJ_STUN_IS_REQUEST(msg->hdr.type))2089 if (!PJ_STUN_IS_REQUEST(msg->hdr.type)) 2092 2090 p_response = NULL; 2093 2091
Note: See TracChangeset
for help on using the changeset viewer.