blob: 54e3e9e5bbba46a6b9401ecf3b3452da8c88c187 [file] [log] [blame]
diff --git a/google3/third_party/libsrtp/crypto/include/integers.h b/google3/third_party/libsrtp/crypto/include/integers.h
index 7010efd..3515d13 100644
--- a/google3/third_party/libsrtp/crypto/include/integers.h
+++ b/google3/third_party/libsrtp/crypto/include/integers.h
@@ -98,7 +98,6 @@ typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
#endif
-
#ifdef NO_64BIT_MATH
typedef double uint64_t;
/* assert that sizeof(double) == 8 */
diff --git a/google3/third_party/libsrtp/include/srtp.h b/google3/third_party/libsrtp/include/srtp.h
index 7f17853..bbaac95 100644
--- a/google3/third_party/libsrtp/include/srtp.h
+++ b/google3/third_party/libsrtp/include/srtp.h
@@ -50,10 +50,6 @@
extern "C" {
#endif
-#ifdef _MSC_VER
-#pragma pack(4)
-#endif
-
#include "crypto_kernel.h"
/**
@@ -930,10 +926,6 @@ srtp_install_event_handler(srtp_event_handler_func_t func);
#define SRTCP_E_BYTE_BIT 0x80
#define SRTCP_INDEX_MASK 0x7fffffff
-#ifdef _MSC_VER
-#pragma pack()
-#endif
-
#ifdef __cplusplus
}
#endif
diff --git a/google3/third_party/libsrtp/srtp/srtp.c b/google3/third_party/libsrtp/srtp/srtp.c
index 6010dd4..3fc52ee 100644
--- a/google3/third_party/libsrtp/srtp/srtp.c
+++ b/google3/third_party/libsrtp/srtp/srtp.c
@@ -1657,6 +1657,8 @@ srtp_unprotect_rtcp(srtp_t ctx, void *srtcp_hdr, int *pkt_octet_len) {
srtp_stream_ctx_t *stream;
int prefix_len;
uint32_t seq_num;
+ int e_bit_in_packet; /* whether the E-bit was found in the packet */
+ int sec_serv_confidentiality; /* whether confidentiality was requested */
/* we assume the hdr is 32-bit aligned to start */
/*
@@ -1694,7 +1696,10 @@ srtp_unprotect_rtcp(srtp_t ctx, void *srtcp_hdr, int *pkt_octet_len) {
return err_status_no_ctx;
}
}
-
+
+ sec_serv_confidentiality = stream->rtcp_services == sec_serv_conf ||
+ stream->rtcp_services == sec_serv_conf_and_auth;
+
/* get tag length from stream context */
tag_len = auth_get_tag_length(stream->rtcp_auth);
@@ -1714,8 +1719,12 @@ srtp_unprotect_rtcp(srtp_t ctx, void *srtcp_hdr, int *pkt_octet_len) {
*/
trailer = (uint32_t *) ((char *) hdr +
*pkt_octet_len -(tag_len + sizeof(srtcp_trailer_t)));
- if (*((unsigned char *) trailer) & SRTCP_E_BYTE_BIT) {
- enc_start = (uint32_t *)hdr + uint32s_in_rtcp_header;
+ e_bit_in_packet = (*((unsigned char *) trailer) & SRTCP_E_BYTE_BIT) == SRTCP_E_BYTE_BIT;
+ if (e_bit_in_packet != sec_serv_confidentiality) {
+ return err_status_cant_check;
+ }
+ if (sec_serv_confidentiality) {
+ enc_start = (uint32_t *)hdr + uint32s_in_rtcp_header;
} else {
enc_octet_len = 0;
enc_start = NULL; /* this indicates that there's no encryption */
diff --git a/google3/third_party/libsrtp/test/srtp_driver.c b/google3/third_party/libsrtp/test/srtp_driver.c
index f6a84f9..3c97072 100644
--- a/google3/third_party/libsrtp/test/srtp_driver.c
+++ b/google3/third_party/libsrtp/test/srtp_driver.c
@@ -1246,7 +1246,7 @@ srtp_create_big_policy(srtp_policy_t **list) {
* loop over policy list, mallocing a new list and copying values
* into it (and incrementing the SSRC value as we go along)
*/
- tmp = NULL;
+ tmp = p = NULL;
while (policy_array[i] != NULL) {
p = (srtp_policy_t*) malloc(sizeof(srtp_policy_t));
if (p == NULL)