Merge "Move from Android SSL_MODE_SMALL_BUFFERS to OpenSSL v1.0.1 SSL_MODE_RELEASE_BUFFERS"
diff --git a/dalvik/src/main/java/dalvik/system/DexPathList.java b/dalvik/src/main/java/dalvik/system/DexPathList.java
index 3088ca5..3d9ee3e 100644
--- a/dalvik/src/main/java/dalvik/system/DexPathList.java
+++ b/dalvik/src/main/java/dalvik/system/DexPathList.java
@@ -54,10 +54,14 @@
     /** class definition context */
     private final ClassLoader definingContext;
 
-    /** list of dex/resource (class path) elements */
-    private final Element[] pathElements;
+    /**
+     * List of dex/resource (class path) elements.
+     * Should be called pathElements, but the Facebook app uses reflection
+     * to modify 'dexElements' (http://b/7726934).
+     */
+    private final Element[] dexElements;
 
-    /** list of native library directory elements */
+    /** List of native library directories. */
     private final File[] nativeLibraryDirectories;
 
     /**
@@ -99,12 +103,12 @@
         }
 
         this.definingContext = definingContext;
-        this.pathElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory);
+        this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory);
         this.nativeLibraryDirectories = splitLibraryPath(libraryPath);
     }
 
     @Override public String toString() {
-        return "DexPathList[pathElements=" + Arrays.toString(pathElements) +
+        return "DexPathList[" + Arrays.toString(dexElements) +
             ",nativeLibraryDirectories=" + Arrays.toString(nativeLibraryDirectories) + "]";
     }
 
@@ -302,7 +306,7 @@
      * found in any of the dex files
      */
     public Class findClass(String name) {
-        for (Element element : pathElements) {
+        for (Element element : dexElements) {
             DexFile dex = element.dexFile;
 
             if (dex != null) {
@@ -325,7 +329,7 @@
      * resource is not found in any of the zip/jar files
      */
     public URL findResource(String name) {
-        for (Element element : pathElements) {
+        for (Element element : dexElements) {
             URL url = element.findResource(name);
             if (url != null) {
                 return url;
@@ -343,7 +347,7 @@
     public Enumeration<URL> findResources(String name) {
         ArrayList<URL> result = new ArrayList<URL>();
 
-        for (Element element : pathElements) {
+        for (Element element : dexElements) {
             URL url = element.findResource(name);
             if (url != null) {
                 result.add(url);
diff --git a/dalvik/src/main/java/dalvik/system/profiler/SamplingProfiler.java b/dalvik/src/main/java/dalvik/system/profiler/SamplingProfiler.java
index 0266103..744977c 100644
--- a/dalvik/src/main/java/dalvik/system/profiler/SamplingProfiler.java
+++ b/dalvik/src/main/java/dalvik/system/profiler/SamplingProfiler.java
@@ -74,7 +74,7 @@
 
     /**
      * A sampler is created every time profiling starts and cleared
-     * everytime profiling stops because once a {@code TimerTask} is
+     * every time profiling stops because once a {@code TimerTask} is
      * canceled it cannot be reused.
      */
     private Sampler sampler;
@@ -94,7 +94,7 @@
      *  Real hprof output examples don't start the thread and trace
      *  identifiers at one but seem to start at these arbitrary
      *  constants. It certainly seems useful to have relatively unique
-     *  identifers when manual searching hprof output.
+     *  identifiers when manual searching hprof output.
      */
     private int nextThreadId = 200001;
     private int nextStackTraceId = 300001;
@@ -146,9 +146,9 @@
      *
      * @param threadSet The thread set specifies which threads to
      * sample. In a general purpose program, all threads typically
-     * should be sample with a ThreadSet such as provied by {@link
-     * #newThreadGroupTheadSet newThreadGroupTheadSet}. For a
-     * benchmark a fixed set such as provied by {@link
+     * should be sample with a ThreadSet such as provided by {@link
+     * #newThreadGroupThreadSet newThreadGroupThreadSet}. For a
+     * benchmark a fixed set such as provided by {@link
      * #newArrayThreadSet newArrayThreadSet} can reduce the overhead
      * of profiling.
      */
@@ -188,7 +188,7 @@
     /**
      * Returns a ThreadSet for a fixed set of threads that will not
      * vary at runtime. This has less overhead than a dynamically
-     * calculated set, such as {@link #newThreadGroupTheadSet}, which has
+     * calculated set, such as {@link #newThreadGroupThreadSet}, which has
      * to enumerate the threads each time profiler wants to collect
      * samples.
      */
@@ -218,7 +218,7 @@
      * threads found in the specified ThreadGroup and that
      * ThreadGroup's children.
      */
-    public static ThreadSet newThreadGroupTheadSet(ThreadGroup threadGroup) {
+    public static ThreadSet newThreadGroupThreadSet(ThreadGroup threadGroup) {
         return new ThreadGroupThreadSet(threadGroup);
     }
 
diff --git a/expectations/taggedtests.txt b/expectations/taggedtests.txt
index 883864c..aa220d0 100644
--- a/expectations/taggedtests.txt
+++ b/expectations/taggedtests.txt
@@ -7,12 +7,12 @@
   description: "large tests",
   result: SUCCESS,
   names: [
-    "java.util.EnumSet.EnumSetBash",
-    "org.apache.harmony.tests.java.util.regex.MatcherTest#testAllCodePoints",
-    "libcore.javax.net.ssl.SSLSocketTest",
+    /* libcore tests that take over 15 minutes on device because of DHParametersHelper.generateSafePrimes */
     "org.apache.harmony.crypto.tests.javax.crypto.func.KeyAgreementFunctionalTest",
     "org.apache.harmony.crypto.tests.javax.crypto.interfaces.DHPrivateKeyTest",
     "org.apache.harmony.crypto.tests.javax.crypto.interfaces.DHPublicKeyTest",
+    /* non-AOSP tests http://b/8027066 */
+    "java.util.EnumSet.EnumSetBash",
     "java.io.PipedInputStream.CloseAndAvailableRC",
     "java.io.PrintStream.OversynchronizedTest",
     "java.io.PrintWriter.OversynchronizedTest",
@@ -42,4 +42,4 @@
   ],
   "tags": [ "large" ]
 }
-]
\ No newline at end of file
+]
diff --git a/luni/src/main/java/org/apache/harmony/security/x509/Extensions.java b/luni/src/main/java/org/apache/harmony/security/x509/Extensions.java
index 1856777..9539054 100644
--- a/luni/src/main/java/org/apache/harmony/security/x509/Extensions.java
+++ b/luni/src/main/java/org/apache/harmony/security/x509/Extensions.java
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -256,23 +257,7 @@
      * null if does not.
      */
     public Collection<List<?>> valueOfSubjectAlternativeName() throws IOException {
-        Extension extension = getExtensionByOID("2.5.29.17");
-        if (extension == null) {
-            return null;
-        }
-
-        Collection<List<?>> collection = ((GeneralNames) GeneralNames.ASN1.decode(extension
-                .getExtnValue())).getPairsList();
-
-        /*
-         * If the extension had any invalid entries, we may have an empty
-         * collection at this point, so just return null.
-         */
-        if (collection.size() == 0) {
-            return null;
-        }
-
-        return collection;
+        return decodeGeneralNames(getExtensionByOID("2.5.29.17"));
     }
 
     /**
@@ -291,11 +276,31 @@
      * null if does not.
      */
     public Collection<List<?>> valueOfIssuerAlternativeName() throws IOException {
-        Extension extension = getExtensionByOID("2.5.29.18");
+        return decodeGeneralNames(getExtensionByOID("2.5.29.18"));
+    }
+
+    /**
+     * Given an X.509 extension that encodes GeneralNames, return it in the
+     * format expected by APIs.
+     */
+    private static Collection<List<?>> decodeGeneralNames(Extension extension)
+            throws IOException {
         if (extension == null) {
             return null;
         }
-        return ((GeneralNames) GeneralNames.ASN1.decode(extension.getExtnValue())).getPairsList();
+
+        Collection<List<?>> collection = ((GeneralNames) GeneralNames.ASN1.decode(extension
+                .getExtnValue())).getPairsList();
+
+        /*
+         * If the extension had any invalid entries, we may have an empty
+         * collection at this point, so just return null.
+         */
+        if (collection.size() == 0) {
+            return null;
+        }
+
+        return Collections.unmodifiableCollection(collection);
     }
 
     /**
diff --git a/luni/src/test/java/libcore/java/security/cert/X509CertificateTest.java b/luni/src/test/java/libcore/java/security/cert/X509CertificateTest.java
index 5e24dba..9e0e2f8 100644
--- a/luni/src/test/java/libcore/java/security/cert/X509CertificateTest.java
+++ b/luni/src/test/java/libcore/java/security/cert/X509CertificateTest.java
@@ -47,6 +47,7 @@
 import java.security.cert.X509Certificate;
 import java.security.spec.X509EncodedKeySpec;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
@@ -801,6 +802,15 @@
     private void checkAlternativeNames(Collection<List<?>> col) {
         assertNotNull(col);
 
+        /* Check to see that the Collection is unmodifiable. */
+        {
+            try {
+                col.add(new ArrayList<Object>());
+                fail("should be an unmodifiable list");
+            } catch (UnsupportedOperationException expected) {
+            }
+        }
+
         /*
          * There should be 9 types of alternative names in this test
          * certificate.
@@ -808,6 +818,15 @@
         boolean[] typesFound = new boolean[9];
 
         for (List<?> item : col) {
+            /* Check to see that the List is unmodifiable. */
+            {
+                try {
+                    item.remove(0);
+                    fail("should be an unmodifiable list");
+                } catch (UnsupportedOperationException expected) {
+                }
+            }
+
             assertTrue(item.get(0) instanceof Integer);
             int type = (Integer) item.get(0);
             typesFound[type] = true;
@@ -901,7 +920,21 @@
 
         /* OID:1.2.3.4, UTF8:test1 */
         final byte[] der = getOIDTestBytes();
-        assertEquals(Arrays.toString(der), Arrays.toString((byte[]) item.get(1)));
+        final byte[] actual = (byte[]) item.get(1);
+        assertEquals(Arrays.toString(der), Arrays.toString(actual));
+
+        /* Make sure the byte[] array isn't modified by our test. */
+        {
+            actual[0] ^= (byte) 0xFF;
+            byte[] actual2 = (byte[]) c.getSubjectAlternativeNames().iterator().next().get(1);
+
+            if (!StandardNames.IS_RI) {
+                assertEquals(Arrays.toString(der), Arrays.toString(actual2));
+            } else {
+                /* RI is broken here. */
+                assertEquals(Arrays.toString(actual), Arrays.toString(actual2));
+            }
+        }
     }
 
     private void getSubjectAlternativeNames_Email(CertificateFactory f) throws Exception {
@@ -992,7 +1025,7 @@
 
     private void getIssuerAlternativeNames(CertificateFactory f) throws Exception {
         X509Certificate c = getCertificate(f, CERT_RSA);
-        Collection<List<?>> col = c.getSubjectAlternativeNames();
+        Collection<List<?>> col = c.getIssuerAlternativeNames();
 
         checkAlternativeNames(col);
     }