am 5d911d77: am a37baf0a: reconcile main tree with open-source eclair

Merge commit '5d911d775a8467c383583edfbda280c122137ead'

* commit '5d911d775a8467c383583edfbda280c122137ead':
  android-2.1_r1 snapshot
diff --git a/l2tp.c b/l2tp.c
index 8d46e1b..4fda9d6 100644
--- a/l2tp.c
+++ b/l2tp.c
@@ -263,13 +263,13 @@
             return size;
         }
 
-        if (!secret || !vector) {
+        if (!secret || !vector || length < 2) {
             return 0;
         } else {
             uint8_t buffer[MAX_ATTRIBUTE_SIZE];
             uint8_t hash[MD5_DIGEST_LENGTH];
             MD5_CTX ctx;
-            int i = 0;
+            int i;
 
             MD5_Init(&ctx);
             MD5_Update(&ctx, &type, sizeof(uint16_t));
@@ -277,20 +277,20 @@
             MD5_Update(&ctx, vector, vector_length);
             MD5_Final(hash, &ctx);
 
-            while (i + MD5_DIGEST_LENGTH <= length) {
-                int j;
-                for (j = 0; j < MD5_DIGEST_LENGTH; ++j) {
-                    buffer[i + j] = p->value[i + j] ^ hash[j];
+            for (i = 0; i < length; ++i) {
+                int j = i % MD5_DIGEST_LENGTH;
+                if (i && !j) {
+                    MD5_Init(&ctx);
+                    MD5_Update(&ctx, secret, secret_length);
+                    MD5_Update(&ctx, &p->value[i - MD5_DIGEST_LENGTH],
+                        MD5_DIGEST_LENGTH);
+                    MD5_Final(hash, &ctx);
                 }
-                MD5_Init(&ctx);
-                MD5_Update(&ctx, secret, secret_length);
-                MD5_Update(&ctx, &buffer[i], MD5_DIGEST_LENGTH);
-                MD5_Final(hash, &ctx);
-                i += MD5_DIGEST_LENGTH;
+                buffer[i] = p->value[i] ^ hash[j];
             }
 
             length = buffer[0] << 8 | buffer[1];
-            if (i == 0 || length > i - 2) {
+            if (length > i - 2) {
                 return 0;
             }
             if (size > length) {