==== //depot/google3/third_party/libsrtp/README.google#8 - None ====
# action=edit type=text
--- google3/third_party/libsrtp/README.google	2011-02-22 19:05:30.000000000 -0800
+++ google3/third_party/libsrtp/README.google	2011-05-27 17:56:49.000000000 -0700
@@ -21,4 +21,6 @@
 - all patches are stored individually in the googlepatches subdirectory
 - iOS related changes.
   undefine HAVE_BYTESWAP_H in config.h
-  Fix debug build compile errors: added static keyword to inline methods and undefined DEBUG before #define DEBUG
\ No newline at end of file
+  Fix debug build compile errors: added static keyword to inline methods and undefined DEBUG before #define DEBUG
+- Fixed a bug related to replay detection when sequence number rolls back
+  arround 0. (Currently contacting libsrtp developers for upstream.)
==== //depot/google3/third_party/libsrtp/crypto/replay/rdbx.c#5 - None ====
# action=edit type=text
--- google3/third_party/libsrtp/crypto/replay/rdbx.c	2010-02-25 06:36:30.000000000 -0800
+++ google3/third_party/libsrtp/crypto/replay/rdbx.c	2011-05-27 17:56:49.000000000 -0700
@@ -145,7 +145,16 @@
   if (local_seq < seq_num_median) {
     if (s - local_seq > seq_num_median) {
       guess_roc = local_roc - 1;
-      difference = seq_num_max - s + local_seq;
+      // The return value is the relative difference from local_seq to s.
+      // The original value is negation of its purpose.  According to document
+      // http://www.ietf.org/rfc/rfc3711.txt, when this condition is true, the
+      // resulting new index should be (local_roc-1, s).  But original logic
+      // will end up positive difference and rdbx_check would pass.  Hence after
+      // rdbx_add_index would make local index to be the wrong value because
+      // local index should not be updated in this case.  For example, when
+      // local index is (1, 100) and next sequence is 65530, the wrong updated
+      // index would be (1, 205).
+      difference = s - local_seq - seq_num_max;
     } else {
       guess_roc = local_roc;
       difference = s - local_seq;
==== //depot/google3/third_party/libsrtp/test/rdbx_driver.c#5 - None ====
# action=edit type=text
--- google3/third_party/libsrtp/test/rdbx_driver.c	2010-02-25 06:36:30.000000000 -0800
+++ google3/third_party/libsrtp/test/rdbx_driver.c	2011-05-27 17:56:49.000000000 -0700
@@ -226,7 +226,7 @@
    *  test sequential insertion 
    */
   printf("\ttesting sequential insertion...");
-  for (idx=0; idx < num_trials; idx++) {
+  for (idx=0; idx < (uint32_t)num_trials; idx++) {
     status = rdbx_check_add(&rdbx, idx);
     if (status)
       return status;
@@ -245,7 +245,7 @@
     printf("warning: no false positive tests performed\n");
   }
   printf("\ttesting for false positives...");
-  for (idx=0; idx < num_fp_trials; idx++) {
+  for (idx=0; idx < (uint32_t)num_fp_trials; idx++) {
     status = rdbx_check_expect_failure(&rdbx, idx);
     if (status)
       return status;
@@ -269,12 +269,34 @@
   ut_init(&utc);
 
   printf("\ttesting non-sequential insertion...");  
-  for (idx=0; idx < num_trials; idx++) {
+  for (idx=0; idx < (uint32_t)num_trials; idx++) {
     ircvd = ut_next_index(&utc);
     status = rdbx_check_unordered(&rdbx, ircvd);
     if (status)
       return status;
   }
+  printf("passed\n");
+
+  /*
+   * test a replay condition close to zero.
+   */
+  rdbx_uninit(&rdbx);
+
+  if (rdbx_init(&rdbx, ws) != err_status_ok) {
+    printf("replay_init failed\n");
+    return err_status_init_fail;
+  }
+
+  printf("\ttesting replay close to zero...");
+  status = rdbx_check_add(&rdbx, 1);
+  if (status)
+    return status;
+  status = rdbx_check_expect_failure(&rdbx, 64500);
+  if (status)
+    return status;
+  status = rdbx_check_add(&rdbx, 2);
+  if (status)
+    return status;
   printf("passed\n");
 
   rdbx_uninit(&rdbx);
@@ -303,7 +325,7 @@
 
   failures = 0;
   timer = clock();
-  for(i=0; i < num_trials; i++) {
+  for(i=0; i < (uint32_t)num_trials; i++) {
     
     delta = index_guess(&rdbx.index, &est, i);
     
@@ -321,4 +343,3 @@
 
   return (double) CLOCKS_PER_SEC * num_trials / timer;
 }
-
