mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8344078: Remove security manager dependency in java.nio
Reviewed-by: alanb, rriggs
This commit is contained in:
parent
2649406323
commit
922b12f30c
67 changed files with 285 additions and 1480 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -34,15 +34,12 @@ import sun.nio.cs.ThreadLocalCoders;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.charset.spi.CharsetProvider;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.ServiceConfigurationError;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
|
@ -346,9 +343,7 @@ public abstract class Charset
|
|||
cache1 = new Object[] { charsetName, cs };
|
||||
}
|
||||
|
||||
// Creates an iterator that walks over the available providers, ignoring
|
||||
// those whose lookup or instantiation causes a security exception to be
|
||||
// thrown. Should be invoked with full privileges.
|
||||
// Creates an iterator that walks over the available providers
|
||||
//
|
||||
private static Iterator<CharsetProvider> providers() {
|
||||
return new Iterator<>() {
|
||||
|
@ -360,17 +355,9 @@ public abstract class Charset
|
|||
|
||||
private boolean getNext() {
|
||||
while (next == null) {
|
||||
try {
|
||||
if (!i.hasNext())
|
||||
return false;
|
||||
next = i.next();
|
||||
} catch (ServiceConfigurationError sce) {
|
||||
if (sce.getCause() instanceof SecurityException) {
|
||||
// Ignore security exceptions
|
||||
continue;
|
||||
}
|
||||
throw sce;
|
||||
}
|
||||
if (!i.hasNext())
|
||||
return false;
|
||||
next = i.next();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -406,7 +393,6 @@ public abstract class Charset
|
|||
ThreadTrackHolder.TRACKER.end(key);
|
||||
}
|
||||
|
||||
@SuppressWarnings("removal")
|
||||
private static Charset lookupViaProviders(final String charsetName) {
|
||||
|
||||
// The runtime startup sequence looks up standard charsets as a
|
||||
|
@ -426,20 +412,13 @@ public abstract class Charset
|
|||
return null;
|
||||
}
|
||||
try {
|
||||
return AccessController.doPrivileged(
|
||||
new PrivilegedAction<>() {
|
||||
public Charset run() {
|
||||
for (Iterator<CharsetProvider> i = providers();
|
||||
i.hasNext();) {
|
||||
CharsetProvider cp = i.next();
|
||||
Charset cs = cp.charsetForName(charsetName);
|
||||
if (cs != null)
|
||||
return cs;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
for (Iterator<CharsetProvider> i = providers(); i.hasNext();) {
|
||||
CharsetProvider cp = i.next();
|
||||
Charset cs = cp.charsetForName(charsetName);
|
||||
if (cs != null)
|
||||
return cs;
|
||||
}
|
||||
return null;
|
||||
} finally {
|
||||
endLookup(key);
|
||||
}
|
||||
|
@ -449,22 +428,18 @@ public abstract class Charset
|
|||
private static class ExtendedProviderHolder {
|
||||
static final CharsetProvider[] extendedProviders = extendedProviders();
|
||||
// returns ExtendedProvider, if installed
|
||||
@SuppressWarnings("removal")
|
||||
private static CharsetProvider[] extendedProviders() {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<>() {
|
||||
public CharsetProvider[] run() {
|
||||
CharsetProvider[] cps = new CharsetProvider[1];
|
||||
int n = 0;
|
||||
ServiceLoader<CharsetProvider> sl =
|
||||
ServiceLoader.loadInstalled(CharsetProvider.class);
|
||||
for (CharsetProvider cp : sl) {
|
||||
if (n + 1 > cps.length) {
|
||||
cps = Arrays.copyOf(cps, cps.length << 1);
|
||||
}
|
||||
cps[n++] = cp;
|
||||
}
|
||||
return n == cps.length ? cps : Arrays.copyOf(cps, n);
|
||||
}});
|
||||
CharsetProvider[] cps = new CharsetProvider[1];
|
||||
int n = 0;
|
||||
ServiceLoader<CharsetProvider> sl =
|
||||
ServiceLoader.loadInstalled(CharsetProvider.class);
|
||||
for (CharsetProvider cp : sl) {
|
||||
if (n + 1 > cps.length) {
|
||||
cps = Arrays.copyOf(cps, cps.length << 1);
|
||||
}
|
||||
cps[n++] = cp;
|
||||
}
|
||||
return n == cps.length ? cps : Arrays.copyOf(cps, n);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -628,26 +603,20 @@ public abstract class Charset
|
|||
* @return An immutable, case-insensitive map from canonical charset names
|
||||
* to charset objects
|
||||
*/
|
||||
@SuppressWarnings("removal")
|
||||
public static SortedMap<String,Charset> availableCharsets() {
|
||||
return AccessController.doPrivileged(
|
||||
new PrivilegedAction<>() {
|
||||
public SortedMap<String,Charset> run() {
|
||||
TreeMap<String,Charset> m =
|
||||
new TreeMap<>(
|
||||
String.CASE_INSENSITIVE_ORDER);
|
||||
put(standardProvider.charsets(), m);
|
||||
CharsetProvider[] ecps = ExtendedProviderHolder.extendedProviders;
|
||||
for (CharsetProvider ecp :ecps) {
|
||||
put(ecp.charsets(), m);
|
||||
}
|
||||
for (Iterator<CharsetProvider> i = providers(); i.hasNext();) {
|
||||
CharsetProvider cp = i.next();
|
||||
put(cp.charsets(), m);
|
||||
}
|
||||
return Collections.unmodifiableSortedMap(m);
|
||||
}
|
||||
});
|
||||
TreeMap<String,Charset> m =
|
||||
new TreeMap<>(
|
||||
String.CASE_INSENSITIVE_ORDER);
|
||||
put(standardProvider.charsets(), m);
|
||||
CharsetProvider[] ecps = ExtendedProviderHolder.extendedProviders;
|
||||
for (CharsetProvider ecp :ecps) {
|
||||
put(ecp.charsets(), m);
|
||||
}
|
||||
for (Iterator<CharsetProvider> i = providers(); i.hasNext();) {
|
||||
CharsetProvider cp = i.next();
|
||||
put(cp.charsets(), m);
|
||||
}
|
||||
return Collections.unmodifiableSortedMap(m);
|
||||
}
|
||||
|
||||
private @Stable static Charset defaultCharset;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue