From 5ef5b7ebec21ac99a61466cf5861b7d301bc7da0 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.

---
 opends/src/server/org/opends/server/controls/ServerSideSortRequestControl.java |   46 +++++++++++++++++++---------------------------
 1 files changed, 19 insertions(+), 27 deletions(-)

diff --git a/opends/src/server/org/opends/server/controls/ServerSideSortRequestControl.java b/opends/src/server/org/opends/server/controls/ServerSideSortRequestControl.java
index a9c1361..b44f866 100644
--- a/opends/src/server/org/opends/server/controls/ServerSideSortRequestControl.java
+++ b/opends/src/server/org/opends/server/controls/ServerSideSortRequestControl.java
@@ -124,37 +124,28 @@
 
           OrderingMatchingRule orderingRule = null;
           boolean ascending = true;
-
-          while(reader.hasNextElement())
+          if(reader.hasNextElement() &&
+              reader.peekType() == TYPE_ORDERING_RULE_ID)
           {
-            switch (reader.peekType())
+            String orderingRuleID =
+                toLowerCase(reader.readOctetStringAsString());
+            orderingRule =
+                DirectoryServer.getOrderingMatchingRule(orderingRuleID);
+            if (orderingRule == null)
             {
-              case TYPE_ORDERING_RULE_ID:
-                String orderingRuleID =
-                               toLowerCase(reader.readOctetStringAsString());
-                orderingRule =
-                    DirectoryServer.getOrderingMatchingRule(orderingRuleID);
-                if (orderingRule == null)
-                {
-                  Message message =
-                      INFO_SORTREQ_CONTROL_UNDEFINED_ORDERING_RULE.
-                          get(orderingRuleID);
-                  throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
-                      message);
-                }
-                break;
-
-              case TYPE_REVERSE_ORDER:
-                ascending = ! reader.readBoolean();
-                break;
-
-              default:
-                Message message = INFO_SORTREQ_CONTROL_INVALID_SEQ_ELEMENT_TYPE.
-                    get(byteToHex(reader.peekType()));
-                throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
-                    message);
+              Message message =
+                  INFO_SORTREQ_CONTROL_UNDEFINED_ORDERING_RULE.
+                      get(orderingRuleID);
+              throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
+                  message);
             }
           }
+          if(reader.hasNextElement() &&
+              reader.peekType() == TYPE_REVERSE_ORDER)
+          {
+            ascending = ! reader.readBoolean();
+          }
+          reader.readEndSequence();
 
           if ((orderingRule == null) &&
               (attrType.getOrderingMatchingRule() == null))
@@ -167,6 +158,7 @@
 
           sortKeys.add(new SortKey(attrType, ascending, orderingRule));
         }
+        reader.readEndSequence();
 
         return new ServerSideSortRequestControl(isCritical,
             new SortOrder(sortKeys.toArray(new SortKey[0])));

--
Gitblit v1.10.0