From 14c8bca1f415a6a6a6cd27cec775c2d1e52427aa Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Fri, 01 May 2009 01:14:55 +0000
Subject: [PATCH] Second fix for issue 3949: All ASN.1 parsing code now ignores trailing unrecognized SEQUENCE components.

---
 opendj-sdk/opends/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java |   64 ++++++++++++++------------------
 1 files changed, 28 insertions(+), 36 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java b/opendj-sdk/opends/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java
index ae6cc4e..b45f309 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/controls/PasswordPolicyResponseControl.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.controls;
 import org.opends.messages.Message;
@@ -81,43 +81,35 @@
 
         reader.readStartSequence();
 
-        while(reader.hasNextElement())
+        if(reader.hasNextElement() &&
+            reader.peekType() == TYPE_WARNING_ELEMENT)
         {
-          switch (reader.peekType())
+          // Its a CHOICE element. Read as sequence to retrieve
+          // nested element.
+          reader.readStartSequence();
+          warningType =
+              PasswordPolicyWarningType.valueOf(reader.peekType());
+          warningValue = (int)reader.readInteger();
+          if (warningType == null)
           {
-            case TYPE_WARNING_ELEMENT:
-              // Its a CHOICE element. Read as sequence to retrieve
-              // nested element.
-              reader.readStartSequence();
-              warningType =
-                  PasswordPolicyWarningType.valueOf(reader.peekType());
-              warningValue = (int)reader.readInteger();
-              if (warningType == null)
-              {
-                Message message = ERR_PWPOLICYRES_INVALID_WARNING_TYPE.get(
-                    byteToHex(reader.peekType()));
-                throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
-                    message);
-              }
-              reader.readEndSequence();
-              break;
-
-            case TYPE_ERROR_ELEMENT:
-              int errorValue = (int)reader.readInteger();
-              errorType = PasswordPolicyErrorType.valueOf(errorValue);
-              if (errorType == null)
-              {
-                Message message =
-                    ERR_PWPOLICYRES_INVALID_ERROR_TYPE.get(errorValue);
-                throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
-                    message);
-              }
-              break;
-
-            default:
-              Message message = ERR_PWPOLICYRES_INVALID_ELEMENT_TYPE.get(
-                  byteToHex(reader.peekType()));
-              throw new DirectoryException(ResultCode.PROTOCOL_ERROR, message);
+            Message message = ERR_PWPOLICYRES_INVALID_WARNING_TYPE.get(
+                byteToHex(reader.peekType()));
+            throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
+                message);
+          }
+          reader.readEndSequence();
+        }
+        if(reader.hasNextElement() &&
+            reader.peekType() == TYPE_ERROR_ELEMENT)
+        {
+          int errorValue = (int)reader.readInteger();
+          errorType = PasswordPolicyErrorType.valueOf(errorValue);
+          if (errorType == null)
+          {
+            Message message =
+                ERR_PWPOLICYRES_INVALID_ERROR_TYPE.get(errorValue);
+            throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
+                message);
           }
         }
 

--
Gitblit v1.10.0