This commit is contained in:
Jesper Wilhelmsson 2021-07-22 00:46:18 +00:00
commit c36755dedf
33 changed files with 483 additions and 114 deletions

View file

@ -1001,7 +1001,7 @@ void RangeCheckEliminator::calc_bounds(BlockBegin *block, BlockBegin *loop_heade
} else { } else {
// Has no upper bound // Has no upper bound
Instruction *instr = ai->length(); Instruction *instr = ai->length();
if (instr != NULL) instr = ai->array(); if (instr == NULL) instr = ai->array();
update_bound(pushed, ai->index(), Instruction::lss, instr, 0); update_bound(pushed, ai->index(), Instruction::lss, instr, 0);
} }
} }

View file

@ -1237,9 +1237,9 @@ class ConcreteMethodFinder : public AbstractClassHierarchyWalker {
virtual Klass* find_witness_in(KlassDepChange& changes); virtual Klass* find_witness_in(KlassDepChange& changes);
virtual Klass* find_witness_anywhere(InstanceKlass* context_type); virtual Klass* find_witness_anywhere(InstanceKlass* context_type);
public:
bool witnessed_reabstraction_in_supers(Klass* k); bool witnessed_reabstraction_in_supers(Klass* k);
public:
ConcreteMethodFinder(Method* m, Klass* participant = NULL) : AbstractClassHierarchyWalker(participant) { ConcreteMethodFinder(Method* m, Klass* participant = NULL) : AbstractClassHierarchyWalker(participant) {
assert(m != NULL && m->is_method(), "sanity"); assert(m != NULL && m->is_method(), "sanity");
_name = m->name(); _name = m->name();
@ -1752,20 +1752,90 @@ Klass* Dependencies::find_unique_concrete_subtype(InstanceKlass* ctxk) {
} }
} }
// Try to determine whether root method in some context is concrete or not based on the information about the unique method
// in that context. It exploits the fact that concrete root method is always inherited into the context when there's a unique method.
// Hence, unique method holder is always a supertype of the context class when root method is concrete.
// Examples for concrete_root_method
// C (C.m uniqm)
// |
// CX (ctxk) uniqm is inherited into context.
//
// CX (ctxk) (CX.m uniqm) here uniqm is defined in ctxk.
// Examples for !concrete_root_method
// CX (ctxk)
// |
// C (C.m uniqm) uniqm is in subtype of ctxk.
bool Dependencies::is_concrete_root_method(Method* uniqm, InstanceKlass* ctxk) {
if (uniqm == NULL) {
return false; // match Dependencies::is_concrete_method() behavior
}
// Theoretically, the "direction" of subtype check matters here.
// On one hand, in case of interface context with a single implementor, uniqm can be in a superclass of the implementor which
// is not related to context class.
// On another hand, uniqm could come from an interface unrelated to the context class, but right now it is not possible:
// it is required that uniqm->method_holder() is the participant (uniqm->method_holder() <: ctxk), hence a default method
// can't be used as unique.
if (ctxk->is_interface()) {
InstanceKlass* implementor = ctxk->implementor();
assert(implementor != ctxk, "single implementor only"); // should have been invalidated earlier
ctxk = implementor;
}
InstanceKlass* holder = uniqm->method_holder();
assert(!holder->is_interface(), "no default methods allowed");
assert(ctxk->is_subclass_of(holder) || holder->is_subclass_of(ctxk), "not related");
return ctxk->is_subclass_of(holder);
}
// If a class (or interface) has a unique concrete method uniqm, return NULL. // If a class (or interface) has a unique concrete method uniqm, return NULL.
// Otherwise, return a class that contains an interfering method. // Otherwise, return a class that contains an interfering method.
Klass* Dependencies::check_unique_concrete_method(InstanceKlass* ctxk, Klass* Dependencies::check_unique_concrete_method(InstanceKlass* ctxk,
Method* uniqm, Method* uniqm,
NewKlassDepChange* changes) { NewKlassDepChange* changes) {
// Here is a missing optimization: If uniqm->is_final(),
// we don't really need to search beneath it for overrides.
// This is probably not important, since we don't use dependencies
// to track final methods. (They can't be "definalized".)
ConcreteMethodFinder wf(uniqm, uniqm->method_holder()); ConcreteMethodFinder wf(uniqm, uniqm->method_holder());
Klass* k = wf.find_witness(ctxk, changes); Klass* k = wf.find_witness(ctxk, changes);
return k; if (k != NULL) {
return k;
}
if (!Dependencies::is_concrete_root_method(uniqm, ctxk) || changes != NULL) {
Klass* conck = find_witness_AME(ctxk, uniqm, changes);
if (conck != NULL) {
// Found a concrete subtype 'conck' which does not override abstract root method.
return conck;
}
}
return NULL;
} }
// Search for AME.
// There are two version of checks.
// 1) Spot checking version(Classload time). Newly added class is checked for AME.
// Checks whether abstract/overpass method is inherited into/declared in newly added concrete class.
// 2) Compile time analysis for abstract/overpass(abstract klass) root_m. The non uniqm subtrees are checked for concrete classes.
Klass* Dependencies::find_witness_AME(InstanceKlass* ctxk, Method* m, KlassDepChange* changes) {
if (m != NULL) {
if (changes != NULL) {
// Spot checking version.
ConcreteMethodFinder wf(m);
Klass* new_type = changes->as_new_klass_change()->new_type();
if (wf.witnessed_reabstraction_in_supers(new_type)) {
return new_type;
}
} else {
// Note: It is required that uniqm->method_holder() is the participant (see ClassHierarchyWalker::found_method()).
ConcreteSubtypeFinder wf(m->method_holder());
Klass* conck = wf.find_witness(ctxk);
if (conck != NULL) {
Method* cm = InstanceKlass::cast(conck)->find_instance_method(m->name(), m->signature(), Klass::PrivateLookupMode::skip);
if (!Dependencies::is_concrete_method(cm, conck)) {
return conck;
}
}
}
}
return NULL;
}
// Find the set of all non-abstract methods under ctxk that match m. // Find the set of all non-abstract methods under ctxk that match m.
// (The method m must be defined or inherited in ctxk.) // (The method m must be defined or inherited in ctxk.)
// Include m itself in the set, unless it is abstract. // Include m itself in the set, unless it is abstract.
@ -1787,6 +1857,9 @@ Method* Dependencies::find_unique_concrete_method(InstanceKlass* ctxk, Method* m
if (participant != NULL) { if (participant != NULL) {
(*participant) = wf.participant(0); (*participant) = wf.participant(0);
} }
if (!Dependencies::is_concrete_method(fm, NULL)) {
fm = NULL; // ignore abstract methods
}
if (Dependencies::is_concrete_method(m, ctxk)) { if (Dependencies::is_concrete_method(m, ctxk)) {
if (fm == NULL) { if (fm == NULL) {
// It turns out that m was always the only implementation. // It turns out that m was always the only implementation.
@ -1796,7 +1869,11 @@ Method* Dependencies::find_unique_concrete_method(InstanceKlass* ctxk, Method* m
// (This can happen if m is inherited into ctxk and fm overrides it.) // (This can happen if m is inherited into ctxk and fm overrides it.)
return NULL; return NULL;
} }
} else if (Dependencies::find_witness_AME(ctxk, fm) != NULL) {
// Found a concrete subtype which does not override abstract root method.
return NULL;
} }
assert(Dependencies::is_concrete_root_method(fm, ctxk) == Dependencies::is_concrete_method(m, ctxk), "mismatch");
#ifndef PRODUCT #ifndef PRODUCT
// Make sure the dependency mechanism will pass this discovery: // Make sure the dependency mechanism will pass this discovery:
if (VerifyDependencies && fm != NULL) { if (VerifyDependencies && fm != NULL) {

View file

@ -384,6 +384,9 @@ class Dependencies: public ResourceObj {
static bool is_concrete_method(Method* m, Klass* k); // m is invocable static bool is_concrete_method(Method* m, Klass* k); // m is invocable
static Klass* find_finalizable_subclass(InstanceKlass* ik); static Klass* find_finalizable_subclass(InstanceKlass* ik);
static bool is_concrete_root_method(Method* uniqm, InstanceKlass* ctxk);
static Klass* find_witness_AME(InstanceKlass* ctxk, Method* m, KlassDepChange* changes = NULL);
// These versions of the concreteness queries work through the CI. // These versions of the concreteness queries work through the CI.
// The CI versions are allowed to skew sometimes from the VM // The CI versions are allowed to skew sometimes from the VM
// (oop-based) versions. The cost of such a difference is a // (oop-based) versions. The cost of such a difference is a

View file

@ -458,10 +458,6 @@ C2V_VMENTRY_NULL(jobject, findUniqueConcreteMethod, (JNIEnv* env, jobject, jobje
JVMCI_THROW_MSG_NULL(InternalError, err_msg("Effectively static method %s.%s should be handled in Java code", method->method_holder()->external_name(), method->external_name())); JVMCI_THROW_MSG_NULL(InternalError, err_msg("Effectively static method %s.%s should be handled in Java code", method->method_holder()->external_name(), method->external_name()));
} }
if (method->is_abstract()) {
return NULL;
}
methodHandle ucm; methodHandle ucm;
{ {
MutexLocker locker(Compile_lock); MutexLocker locker(Compile_lock);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -151,7 +151,7 @@ class NTLM {
int readShort(int offset) throws NTLMException { int readShort(int offset) throws NTLMException {
try { try {
return (internal[offset] & 0xff) + return (internal[offset] & 0xff) +
((internal[offset+1] & 0xff << 8)); (((internal[offset+1] & 0xff) << 8));
} catch (ArrayIndexOutOfBoundsException ex) { } catch (ArrayIndexOutOfBoundsException ex) {
throw new NTLMException(NTLMException.PACKET_READ_ERROR, throw new NTLMException(NTLMException.PACKET_READ_ERROR,
"Input message incorrect size"); "Input message incorrect size");

View file

@ -430,7 +430,10 @@ public final class ZoneRules implements Serializable {
} }
/** /**
* Reads the state from the stream. * Reads the state from the stream. The 1,024 limit to the lengths
* of stdTrans and savSize is intended to be the size well enough
* to accommodate the max number of transitions in current tzdb data
* (203 for Asia/Tehran).
* *
* @param in the input stream, not null * @param in the input stream, not null
* @return the created object, not null * @return the created object, not null
@ -438,6 +441,9 @@ public final class ZoneRules implements Serializable {
*/ */
static ZoneRules readExternal(DataInput in) throws IOException, ClassNotFoundException { static ZoneRules readExternal(DataInput in) throws IOException, ClassNotFoundException {
int stdSize = in.readInt(); int stdSize = in.readInt();
if (stdSize > 1024) {
throw new InvalidObjectException("Too many transitions");
}
long[] stdTrans = (stdSize == 0) ? EMPTY_LONG_ARRAY long[] stdTrans = (stdSize == 0) ? EMPTY_LONG_ARRAY
: new long[stdSize]; : new long[stdSize];
for (int i = 0; i < stdSize; i++) { for (int i = 0; i < stdSize; i++) {
@ -448,6 +454,9 @@ public final class ZoneRules implements Serializable {
stdOffsets[i] = Ser.readOffset(in); stdOffsets[i] = Ser.readOffset(in);
} }
int savSize = in.readInt(); int savSize = in.readInt();
if (savSize > 1024) {
throw new InvalidObjectException("Too many saving offsets");
}
long[] savTrans = (savSize == 0) ? EMPTY_LONG_ARRAY long[] savTrans = (savSize == 0) ? EMPTY_LONG_ARRAY
: new long[savSize]; : new long[savSize];
for (int i = 0; i < savSize; i++) { for (int i = 0; i < savSize; i++) {
@ -458,6 +467,9 @@ public final class ZoneRules implements Serializable {
savOffsets[i] = Ser.readOffset(in); savOffsets[i] = Ser.readOffset(in);
} }
int ruleSize = in.readByte(); int ruleSize = in.readByte();
if (ruleSize > 16) {
throw new InvalidObjectException("Too many transition rules");
}
ZoneOffsetTransitionRule[] rules = (ruleSize == 0) ? ZoneOffsetTransitionRule[] rules = (ruleSize == 0) ?
EMPTY_LASTRULES : new ZoneOffsetTransitionRule[ruleSize]; EMPTY_LASTRULES : new ZoneOffsetTransitionRule[ruleSize];
for (int i = 0; i < ruleSize; i++) { for (int i = 0; i < ruleSize; i++) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -419,7 +419,13 @@ public class JarFile extends ZipFile {
if (verify) { if (verify) {
byte[] b = getBytes(manEntry); byte[] b = getBytes(manEntry);
if (!jvInitialized) { if (!jvInitialized) {
jv = new JarVerifier(b); if (JUZFA.getManifestNum(this) == 1) {
jv = new JarVerifier(manEntry.getName(), b);
} else {
if (JarVerifier.debug != null) {
JarVerifier.debug.println("Multiple MANIFEST.MF found. Treat JAR file as unsigned");
}
}
} }
man = new Manifest(jv, new ByteArrayInputStream(b), getName()); man = new Manifest(jv, new ByteArrayInputStream(b), getName());
} else { } else {
@ -745,7 +751,7 @@ public class JarFile extends ZipFile {
mev = new ManifestEntryVerifier mev = new ManifestEntryVerifier
(getManifestFromReference()); (getManifestFromReference());
} }
if (name.equals(MANIFEST_NAME)) { if (name.equalsIgnoreCase(MANIFEST_NAME)) {
b = jv.manifestRawBytes; b = jv.manifestRawBytes;
} else { } else {
b = getBytes(e); b = getBytes(e);

View file

@ -94,7 +94,7 @@ public class JarInputStream extends ZipInputStream {
man.read(new ByteArrayInputStream(bytes)); man.read(new ByteArrayInputStream(bytes));
closeEntry(); closeEntry();
if (doVerify) { if (doVerify) {
jv = new JarVerifier(bytes); jv = new JarVerifier(e.getName(), bytes);
mev = new ManifestEntryVerifier(man); mev = new ManifestEntryVerifier(man);
} }
return (JarEntry)super.getNextEntry(); return (JarEntry)super.getNextEntry();

View file

@ -84,6 +84,9 @@ class JarVerifier {
/** the bytes for the manDig object */ /** the bytes for the manDig object */
byte manifestRawBytes[] = null; byte manifestRawBytes[] = null;
/** the manifest name this JarVerifier is created upon */
final String manifestName;
/** controls eager signature validation */ /** controls eager signature validation */
boolean eagerValidation; boolean eagerValidation;
@ -93,7 +96,8 @@ class JarVerifier {
/** collect -DIGEST-MANIFEST values for deny list */ /** collect -DIGEST-MANIFEST values for deny list */
private List<Object> manifestDigests; private List<Object> manifestDigests;
public JarVerifier(byte rawBytes[]) { public JarVerifier(String name, byte rawBytes[]) {
manifestName = name;
manifestRawBytes = rawBytes; manifestRawBytes = rawBytes;
sigFileSigners = new Hashtable<>(); sigFileSigners = new Hashtable<>();
verifiedSigners = new Hashtable<>(); verifiedSigners = new Hashtable<>();
@ -180,7 +184,7 @@ class JarVerifier {
// only set the jev object for entries that have a signature // only set the jev object for entries that have a signature
// (either verified or not) // (either verified or not)
if (!name.equals(JarFile.MANIFEST_NAME)) { if (!name.equalsIgnoreCase(JarFile.MANIFEST_NAME)) {
if (sigFileSigners.get(name) != null || if (sigFileSigners.get(name) != null ||
verifiedSigners.get(name) != null) { verifiedSigners.get(name) != null) {
mev.setEntry(name, je); mev.setEntry(name, je);
@ -270,7 +274,8 @@ class JarVerifier {
} }
sfv.setSignatureFile(bytes); sfv.setSignatureFile(bytes);
sfv.process(sigFileSigners, manifestDigests); sfv.process(sigFileSigners, manifestDigests,
manifestName);
} }
} }
return; return;
@ -313,7 +318,7 @@ class JarVerifier {
sfv.setSignatureFile(bytes); sfv.setSignatureFile(bytes);
} }
} }
sfv.process(sigFileSigners, manifestDigests); sfv.process(sigFileSigners, manifestDigests, manifestName);
} catch (IOException | CertificateException | } catch (IOException | CertificateException |
NoSuchAlgorithmException | SignatureException e) { NoSuchAlgorithmException | SignatureException e) {
@ -419,9 +424,9 @@ class JarVerifier {
manDig = null; manDig = null;
// MANIFEST.MF is always treated as signed and verified, // MANIFEST.MF is always treated as signed and verified,
// move its signers from sigFileSigners to verifiedSigners. // move its signers from sigFileSigners to verifiedSigners.
if (sigFileSigners.containsKey(JarFile.MANIFEST_NAME)) { if (sigFileSigners.containsKey(manifestName)) {
CodeSigner[] codeSigners = sigFileSigners.remove(JarFile.MANIFEST_NAME); CodeSigner[] codeSigners = sigFileSigners.remove(manifestName);
verifiedSigners.put(JarFile.MANIFEST_NAME, codeSigners); verifiedSigners.put(manifestName, codeSigners);
} }
} }
@ -873,7 +878,7 @@ class JarVerifier {
*/ */
boolean isTrustedManifestEntry(String name) { boolean isTrustedManifestEntry(String name) {
// How many signers? MANIFEST.MF is always verified // How many signers? MANIFEST.MF is always verified
CodeSigner[] forMan = verifiedSigners.get(JarFile.MANIFEST_NAME); CodeSigner[] forMan = verifiedSigners.get(manifestName);
if (forMan == null) { if (forMan == null) {
return true; return true;
} }

View file

@ -226,6 +226,7 @@ public class ZipFile implements ZipConstants, Closeable {
Integer.toHexString(mode)); Integer.toHexString(mode));
} }
String name = file.getPath(); String name = file.getPath();
file = new File(name);
@SuppressWarnings("removal") @SuppressWarnings("removal")
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null) { if (sm != null) {
@ -1032,6 +1033,18 @@ public class ZipFile implements ZipConstants, Closeable {
} }
} }
/**
* Returns the number of the META-INF/MANIFEST.MF entries, case insensitive.
* When this number is greater than 1, JarVerifier will treat a file as
* unsigned.
*/
private int getManifestNum() {
synchronized (this) {
ensureOpen();
return res.zsrc.manifestNum;
}
}
/** /**
* Returns the name of the META-INF/MANIFEST.MF entry, ignoring * Returns the name of the META-INF/MANIFEST.MF entry, ignoring
* case. If {@code onlyIfSignatureRelatedFiles} is true, we only return the * case. If {@code onlyIfSignatureRelatedFiles} is true, we only return the
@ -1079,6 +1092,10 @@ public class ZipFile implements ZipConstants, Closeable {
return ((ZipFile)jar).getManifestAndSignatureRelatedFiles(); return ((ZipFile)jar).getManifestAndSignatureRelatedFiles();
} }
@Override @Override
public int getManifestNum(JarFile jar) {
return ((ZipFile)jar).getManifestNum();
}
@Override
public String getManifestName(JarFile jar, boolean onlyIfHasSignatureRelatedFiles) { public String getManifestName(JarFile jar, boolean onlyIfHasSignatureRelatedFiles) {
return ((ZipFile)jar).getManifestName(onlyIfHasSignatureRelatedFiles); return ((ZipFile)jar).getManifestName(onlyIfHasSignatureRelatedFiles);
} }
@ -1131,6 +1148,7 @@ public class ZipFile implements ZipConstants, Closeable {
private byte[] comment; // zip file comment private byte[] comment; // zip file comment
// list of meta entries in META-INF dir // list of meta entries in META-INF dir
private int manifestPos = -1; // position of the META-INF/MANIFEST.MF, if exists private int manifestPos = -1; // position of the META-INF/MANIFEST.MF, if exists
private int manifestNum = 0; // number of META-INF/MANIFEST.MF, case insensitive
private int[] signatureMetaNames; // positions of signature related entries, if such exist private int[] signatureMetaNames; // positions of signature related entries, if such exist
private int[] metaVersions; // list of unique versions found in META-INF/versions/ private int[] metaVersions; // list of unique versions found in META-INF/versions/
private final boolean startsWithLoc; // true, if zip file starts with LOCSIG (usually true) private final boolean startsWithLoc; // true, if zip file starts with LOCSIG (usually true)
@ -1313,6 +1331,7 @@ public class ZipFile implements ZipConstants, Closeable {
entries = null; entries = null;
table = null; table = null;
manifestPos = -1; manifestPos = -1;
manifestNum = 0;
signatureMetaNames = null; signatureMetaNames = null;
metaVersions = EMPTY_META_VERSIONS; metaVersions = EMPTY_META_VERSIONS;
} }
@ -1504,6 +1523,7 @@ public class ZipFile implements ZipConstants, Closeable {
int pos = 0; int pos = 0;
int entryPos = CENHDR; int entryPos = CENHDR;
int limit = cen.length - ENDHDR; int limit = cen.length - ENDHDR;
manifestNum = 0;
while (entryPos <= limit) { while (entryPos <= limit) {
if (idx >= entriesLength) { if (idx >= entriesLength) {
// This will only happen if the zip file has an incorrect // This will only happen if the zip file has an incorrect
@ -1522,6 +1542,7 @@ public class ZipFile implements ZipConstants, Closeable {
// nlen is at least META_INF_LENGTH // nlen is at least META_INF_LENGTH
if (isManifestName(entryPos + META_INF_LEN, nlen - META_INF_LEN)) { if (isManifestName(entryPos + META_INF_LEN, nlen - META_INF_LEN)) {
manifestPos = pos; manifestPos = pos;
manifestNum++;
} else { } else {
if (isSignatureRelated(entryPos, nlen)) { if (isSignatureRelated(entryPos, nlen)) {
if (signatureNames == null) if (signatureNames == null)

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -37,6 +37,7 @@ public interface JavaUtilZipFileAccess {
public boolean startsWithLocHeader(ZipFile zip); public boolean startsWithLocHeader(ZipFile zip);
public List<String> getManifestAndSignatureRelatedFiles(JarFile zip); public List<String> getManifestAndSignatureRelatedFiles(JarFile zip);
public String getManifestName(JarFile zip, boolean onlyIfSignatureRelatedFiles); public String getManifestName(JarFile zip, boolean onlyIfSignatureRelatedFiles);
public int getManifestNum(JarFile zip);
public int[] getMetaInfVersions(JarFile zip); public int[] getMetaInfVersions(JarFile zip);
public Enumeration<JarEntry> entries(ZipFile zip); public Enumeration<JarEntry> entries(ZipFile zip);
public Stream<JarEntry> stream(ZipFile zip); public Stream<JarEntry> stream(ZipFile zip);

View file

@ -538,6 +538,9 @@ public class ClassReader {
} else if (Constants.SYNTHETIC.equals(attributeName)) { } else if (Constants.SYNTHETIC.equals(attributeName)) {
accessFlags |= Opcodes.ACC_SYNTHETIC; accessFlags |= Opcodes.ACC_SYNTHETIC;
} else if (Constants.SOURCE_DEBUG_EXTENSION.equals(attributeName)) { } else if (Constants.SOURCE_DEBUG_EXTENSION.equals(attributeName)) {
if (attributeLength > classFileBuffer.length - currentAttributeOffset) {
throw new IllegalArgumentException();
}
sourceDebugExtension = sourceDebugExtension =
readUtf(currentAttributeOffset, attributeLength, new char[attributeLength]); readUtf(currentAttributeOffset, attributeLength, new char[attributeLength]);
} else if (Constants.RUNTIME_INVISIBLE_ANNOTATIONS.equals(attributeName)) { } else if (Constants.RUNTIME_INVISIBLE_ANNOTATIONS.equals(attributeName)) {
@ -1548,6 +1551,9 @@ public class ClassReader {
final int maxLocals = readUnsignedShort(currentOffset + 2); final int maxLocals = readUnsignedShort(currentOffset + 2);
final int codeLength = readInt(currentOffset + 4); final int codeLength = readInt(currentOffset + 4);
currentOffset += 8; currentOffset += 8;
if (codeLength > classFileBuffer.length - currentOffset) {
throw new IllegalArgumentException();
}
// Read the bytecode 'code' array to create a label for each referenced instruction. // Read the bytecode 'code' array to create a label for each referenced instruction.
final int bytecodeStartOffset = currentOffset; final int bytecodeStartOffset = currentOffset;

View file

@ -24,16 +24,36 @@
*/ */
package sun.net.ftp.impl; package sun.net.ftp.impl;
import java.net.*;
import java.io.*;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.text.DateFormat; import java.text.DateFormat;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException; import java.time.format.DateTimeParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64; import java.util.Base64;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
@ -44,7 +64,11 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocketFactory;
import sun.net.ftp.*; import sun.net.ftp.FtpDirEntry;
import sun.net.ftp.FtpDirParser;
import sun.net.ftp.FtpProtocolException;
import sun.net.ftp.FtpReplyCode;
import sun.net.util.IPAddressUtil;
import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger;
@ -107,13 +131,15 @@ public class FtpClient extends sun.net.ftp.FtpClient {
private static Pattern[] patterns; private static Pattern[] patterns;
private static Pattern linkp = Pattern.compile("(\\p{Print}+) \\-\\> (\\p{Print}+)$"); private static Pattern linkp = Pattern.compile("(\\p{Print}+) \\-\\> (\\p{Print}+)$");
private DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, java.util.Locale.US); private DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, java.util.Locale.US);
private static final boolean acceptPasvAddressVal;
static { static {
final int vals[] = {0, 0}; final int vals[] = {0, 0};
final String acceptPasvAddress[] = {null};
@SuppressWarnings("removal") @SuppressWarnings("removal")
final String enc = AccessController.doPrivileged( final String enc = AccessController.doPrivileged(
new PrivilegedAction<String>() { new PrivilegedAction<String>() {
public String run() { public String run() {
acceptPasvAddress[0] = System.getProperty("jdk.net.ftp.trustPasvAddress", "false");
vals[0] = Integer.getInteger("sun.net.client.defaultReadTimeout", 300_000).intValue(); vals[0] = Integer.getInteger("sun.net.client.defaultReadTimeout", 300_000).intValue();
vals[1] = Integer.getInteger("sun.net.client.defaultConnectTimeout", 300_000).intValue(); vals[1] = Integer.getInteger("sun.net.client.defaultConnectTimeout", 300_000).intValue();
return System.getProperty("file.encoding", "ISO8859_1"); return System.getProperty("file.encoding", "ISO8859_1");
@ -144,6 +170,8 @@ public class FtpClient extends sun.net.ftp.FtpClient {
for (int i = 0; i < patStrings.length; i++) { for (int i = 0; i < patStrings.length; i++) {
patterns[i] = Pattern.compile(patStrings[i]); patterns[i] = Pattern.compile(patStrings[i]);
} }
acceptPasvAddressVal = Boolean.parseBoolean(acceptPasvAddress[0]);
} }
/** /**
@ -610,7 +638,6 @@ public class FtpClient extends sun.net.ftp.FtpClient {
// //
// The regular expression is a bit more complex this time, because // The regular expression is a bit more complex this time, because
// the parenthesis are optionals and we have to use 3 groups. // the parenthesis are optionals and we have to use 3 groups.
if (pasvPat == null) { if (pasvPat == null) {
pasvPat = Pattern.compile("227 .* \\(?(\\d{1,3},\\d{1,3},\\d{1,3},\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)?"); pasvPat = Pattern.compile("227 .* \\(?(\\d{1,3},\\d{1,3},\\d{1,3},\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)?");
} }
@ -622,8 +649,15 @@ public class FtpClient extends sun.net.ftp.FtpClient {
port = Integer.parseInt(m.group(3)) + (Integer.parseInt(m.group(2)) << 8); port = Integer.parseInt(m.group(3)) + (Integer.parseInt(m.group(2)) << 8);
// IP address is simple // IP address is simple
String s = m.group(1).replace(',', '.'); String s = m.group(1).replace(',', '.');
dest = new InetSocketAddress(s, port); if (!IPAddressUtil.isIPv4LiteralAddress(s))
throw new FtpProtocolException("PASV failed : " + serverAnswer);
if (acceptPasvAddressVal) {
dest = new InetSocketAddress(s, port);
} else {
dest = validatePasvAddress(port, s, server.getInetAddress());
}
} }
// Got everything, let's open the socket! // Got everything, let's open the socket!
Socket s; Socket s;
if (proxy != null) { if (proxy != null) {
@ -678,6 +712,80 @@ public class FtpClient extends sun.net.ftp.FtpClient {
return s; return s;
} }
static final String ERROR_MSG = "Address should be the same as originating server";
/**
* Returns an InetSocketAddress, based on value of acceptPasvAddressVal
* and other conditions such as the server address returned by pasv
* is not a hostname, is a socks proxy, or the loopback. An exception
* is thrown if none of the valid conditions are met.
*/
private InetSocketAddress validatePasvAddress(int port, String s, InetAddress address)
throws FtpProtocolException
{
if (address == null) {
return InetSocketAddress.createUnresolved(serverAddr.getHostName(), port);
}
String serverAddress = address.getHostAddress();
if (serverAddress.equals(s)) {
return new InetSocketAddress(s, port);
} else if (address.isLoopbackAddress() && s.startsWith("127.")) { // can be 127.0
return new InetSocketAddress(s, port);
} else if (address.isLoopbackAddress()) {
if (privilegedLocalHost().getHostAddress().equals(s)) {
return new InetSocketAddress(s, port);
} else {
throw new FtpProtocolException(ERROR_MSG);
}
} else if (s.startsWith("127.")) {
if (privilegedLocalHost().equals(address)) {
return new InetSocketAddress(s, port);
} else {
throw new FtpProtocolException(ERROR_MSG);
}
}
String hostName = address.getHostName();
if (!(IPAddressUtil.isIPv4LiteralAddress(hostName) || IPAddressUtil.isIPv6LiteralAddress(hostName))) {
InetAddress[] names = privilegedGetAllByName(hostName);
String resAddress = Arrays
.stream(names)
.map(InetAddress::getHostAddress)
.filter(s::equalsIgnoreCase)
.findFirst()
.orElse(null);
if (resAddress != null) {
return new InetSocketAddress(s, port);
}
}
throw new FtpProtocolException(ERROR_MSG);
}
private static InetAddress privilegedLocalHost() throws FtpProtocolException {
PrivilegedExceptionAction<InetAddress> action = InetAddress::getLocalHost;
try {
@SuppressWarnings("removal")
var tmp = AccessController.doPrivileged(action);
return tmp;
} catch (Exception e) {
var ftpEx = new FtpProtocolException(ERROR_MSG);
ftpEx.initCause(e);
throw ftpEx;
}
}
private static InetAddress[] privilegedGetAllByName(String hostName) throws FtpProtocolException {
PrivilegedExceptionAction<InetAddress[]> pAction = () -> InetAddress.getAllByName(hostName);
try {
@SuppressWarnings("removal")
var tmp =AccessController.doPrivileged(pAction);
return tmp;
} catch (Exception e) {
var ftpEx = new FtpProtocolException(ERROR_MSG);
ftpEx.initCause(e);
throw ftpEx;
}
}
/** /**
* Opens a data connection with the server according to the set mode * Opens a data connection with the server according to the set mode
* (ACTIVE or PASSIVE) then send the command passed as an argument. * (ACTIVE or PASSIVE) then send the command passed as an argument.
@ -688,7 +796,6 @@ public class FtpClient extends sun.net.ftp.FtpClient {
*/ */
private Socket openDataConnection(String cmd) throws sun.net.ftp.FtpProtocolException, IOException { private Socket openDataConnection(String cmd) throws sun.net.ftp.FtpProtocolException, IOException {
Socket clientSocket; Socket clientSocket;
if (passiveMode) { if (passiveMode) {
try { try {
return openPassiveDataConnection(cmd); return openPassiveDataConnection(cmd);

View file

@ -331,7 +331,18 @@ public class SignerInfo implements DerEncoder {
throws NoSuchAlgorithmException, SignatureException { throws NoSuchAlgorithmException, SignatureException {
try { try {
Timestamp timestamp = getTimestamp(); Timestamp timestamp = null;
try {
timestamp = getTimestamp();
} catch (Exception e) {
// Log exception and continue. This allows for the case
// where, if there are no other errors, the code is
// signed but w/o a timestamp.
if (debug != null) {
debug.println("Unexpected exception while getting" +
" timestamp: " + e);
}
}
ContentInfo content = block.getContentInfo(); ContentInfo content = block.getContentInfo();
if (data == null) { if (data == null) {
@ -471,7 +482,7 @@ public class SignerInfo implements DerEncoder {
if (sig.verify(encryptedDigest)) { if (sig.verify(encryptedDigest)) {
return this; return this;
} }
} catch (IOException | CertificateException e) { } catch (IOException e) {
throw new SignatureException("Error verifying signature", e); throw new SignatureException("Error verifying signature", e);
} }
return null; return null;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -270,7 +270,7 @@ public class SignatureFileVerifier {
* *
*/ */
public void process(Hashtable<String, CodeSigner[]> signers, public void process(Hashtable<String, CodeSigner[]> signers,
List<Object> manifestDigests) List<Object> manifestDigests, String manifestName)
throws IOException, SignatureException, NoSuchAlgorithmException, throws IOException, SignatureException, NoSuchAlgorithmException,
JarException, CertificateException JarException, CertificateException
{ {
@ -279,7 +279,7 @@ public class SignatureFileVerifier {
Object obj = null; Object obj = null;
try { try {
obj = Providers.startJarVerification(); obj = Providers.startJarVerification();
processImpl(signers, manifestDigests); processImpl(signers, manifestDigests, manifestName);
} finally { } finally {
Providers.stopJarVerification(obj); Providers.stopJarVerification(obj);
} }
@ -287,7 +287,7 @@ public class SignatureFileVerifier {
} }
private void processImpl(Hashtable<String, CodeSigner[]> signers, private void processImpl(Hashtable<String, CodeSigner[]> signers,
List<Object> manifestDigests) List<Object> manifestDigests, String manifestName)
throws IOException, SignatureException, NoSuchAlgorithmException, throws IOException, SignatureException, NoSuchAlgorithmException,
JarException, CertificateException JarException, CertificateException
{ {
@ -368,7 +368,7 @@ public class SignatureFileVerifier {
} }
// MANIFEST.MF is always regarded as signed // MANIFEST.MF is always regarded as signed
updateSigners(newSigners, signers, JarFile.MANIFEST_NAME); updateSigners(newSigners, signers, manifestName);
} }
/** /**

View file

@ -25,6 +25,7 @@
package java.awt.datatransfer; package java.awt.datatransfer;
import java.io.ByteArrayOutputStream;
import java.io.Externalizable; import java.io.Externalizable;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInput; import java.io.ObjectInput;
@ -321,9 +322,12 @@ MimeTypeParameterList(rawdata.substring(semIndex));
ClassNotFoundException { ClassNotFoundException {
String s = in.readUTF(); String s = in.readUTF();
if (s == null || s.length() == 0) { // long mime type if (s == null || s.length() == 0) { // long mime type
byte[] ba = new byte[in.readInt()]; ByteArrayOutputStream baos = new ByteArrayOutputStream();
in.readFully(ba); int len = in.readInt();
s = new String(ba); while (len-- > 0) {
baos.write(in.readByte());
}
s = baos.toString();
} }
try { try {
parse(s); parse(s);

View file

@ -426,7 +426,6 @@ abstract class CMap {
try { try {
this.uvs = new UVS(buffer, offset); this.uvs = new UVS(buffer, offset);
} catch (Throwable t) { } catch (Throwable t) {
t.printStackTrace();
} }
} }
return; return;

View file

@ -518,6 +518,10 @@ public class TrueTypeFont extends FileFont {
&& getDirectoryEntry(hheaTag) == null) { && getDirectoryEntry(hheaTag) == null) {
throw new FontFormatException("missing hhea table"); throw new FontFormatException("missing hhea table");
} }
ByteBuffer maxpTable = getTableBuffer(maxpTag);
if (maxpTable.getChar(4) == 0) {
throw new FontFormatException("zero glyphs");
}
initNames(); initNames();
} catch (Exception e) { } catch (Exception e) {
if (FontUtilities.isLogging()) { if (FontUtilities.isLogging()) {
@ -981,24 +985,36 @@ public class TrueTypeFont extends FileFont {
private void setStrikethroughMetrics(ByteBuffer os_2Table, int upem) { private void setStrikethroughMetrics(ByteBuffer os_2Table, int upem) {
if (os_2Table == null || os_2Table.capacity() < 30 || upem < 0) { if (os_2Table == null || os_2Table.capacity() < 30 || upem < 0) {
stSize = .05f; stSize = 0.05f;
stPos = -.4f; stPos = -0.4f;
return; return;
} }
ShortBuffer sb = os_2Table.asShortBuffer(); ShortBuffer sb = os_2Table.asShortBuffer();
stSize = sb.get(13) / (float)upem; stSize = sb.get(13) / (float)upem;
stPos = -sb.get(14) / (float)upem; stPos = -sb.get(14) / (float)upem;
if (stSize < 0f) {
stSize = 0.05f;
}
if (Math.abs(stPos) > 2.0f) {
stPos = -0.4f;
}
} }
private void setUnderlineMetrics(ByteBuffer postTable, int upem) { private void setUnderlineMetrics(ByteBuffer postTable, int upem) {
if (postTable == null || postTable.capacity() < 12 || upem < 0) { if (postTable == null || postTable.capacity() < 12 || upem < 0) {
ulSize = .05f; ulSize = 0.05f;
ulPos = .1f; ulPos = 0.1f;
return; return;
} }
ShortBuffer sb = postTable.asShortBuffer(); ShortBuffer sb = postTable.asShortBuffer();
ulSize = sb.get(5) / (float)upem; ulSize = sb.get(5) / (float)upem;
ulPos = -sb.get(4) / (float)upem; ulPos = -sb.get(4) / (float)upem;
if (ulSize < 0f) {
ulSize = 0.05f;
}
if (Math.abs(ulPos) > 2.0f) {
ulPos = 0.1f;
}
} }
@Override @Override

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
*/ */
/* /*
@ -39,6 +39,8 @@ import java.io.IOException;
* *
* @author Michael Glavassevich, IBM * @author Michael Glavassevich, IBM
* @author Neil Graham, IBM * @author Neil Graham, IBM
*
* @LastModified: Apr 2021
*/ */
public class XML11EntityScanner public class XML11EntityScanner
@ -696,7 +698,7 @@ public class XML11EntityScanner
sawIncompleteSurrogatePair)){ sawIncompleteSurrogatePair)){
fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN, fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,
"IllegalQName", "IllegalQName",
null, new Object[]{rawname},
XMLErrorReporter.SEVERITY_FATAL_ERROR); XMLErrorReporter.SEVERITY_FATAL_ERROR);
} }
//check the result: localpart //check the result: localpart

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
*/ */
/* /*
@ -55,6 +55,7 @@ import java.util.Locale;
* @author Arnaud Le Hors, IBM * @author Arnaud Le Hors, IBM
* @author K.Venugopal Sun Microsystems * @author K.Venugopal Sun Microsystems
* *
* @LastModified: Apr 2021
*/ */
public class XMLEntityScanner implements XMLLocator { public class XMLEntityScanner implements XMLLocator {
@ -860,6 +861,14 @@ public class XMLEntityScanner implements XMLLocator {
prefix = fSymbolTable.addSymbol(fCurrentEntity.ch, prefix = fSymbolTable.addSymbol(fCurrentEntity.ch,
offset, prefixLength); offset, prefixLength);
int len = length - prefixLength - 1; int len = length - prefixLength - 1;
int startLocal = index +1;
if (!XMLChar.isNCNameStart(fCurrentEntity.ch[startLocal])){
fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,
"IllegalQName",
new Object[]{rawname},
XMLErrorReporter.SEVERITY_FATAL_ERROR);
}
//check the result: localpart //check the result: localpart
checkLimit(Limit.MAX_NAME_LIMIT, fCurrentEntity, index + 1, len); checkLimit(Limit.MAX_NAME_LIMIT, fCurrentEntity, index + 1, len);
localpart = fSymbolTable.addSymbol(fCurrentEntity.ch, localpart = fSymbolTable.addSymbol(fCurrentEntity.ch,

View file

@ -278,7 +278,7 @@
# Namespaces support # Namespaces support
# 4. Using Qualified Names # 4. Using Qualified Names
IllegalQName = Element or attribute do not match QName production: QName::=(NCName':')?NCName. IllegalQName = Element or attribute \"{0}\" do not match QName production: QName::=(NCName':')?NCName.
ElementXMLNSPrefix = Element \"{0}\" cannot have \"xmlns\" as its prefix. ElementXMLNSPrefix = Element \"{0}\" cannot have \"xmlns\" as its prefix.
ElementPrefixUnbound = The prefix \"{0}\" for element \"{1}\" is not bound. ElementPrefixUnbound = The prefix \"{0}\" for element \"{1}\" is not bound.
AttributePrefixUnbound = The prefix \"{2}\" for attribute \"{1}\" associated with an element type \"{0}\" is not bound. AttributePrefixUnbound = The prefix \"{2}\" for attribute \"{1}\" associated with an element type \"{0}\" is not bound.

View file

@ -43,6 +43,7 @@ import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer; import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import jdk.xml.internal.JdkConstants; import jdk.xml.internal.JdkConstants;
import jdk.xml.internal.JdkXmlUtils;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler; import org.xml.sax.ContentHandler;
@ -1978,21 +1979,21 @@ abstract public class ToStream extends SerializerBase {
String doctypeSystem = getDoctypeSystem(); String doctypeSystem = getDoctypeSystem();
if (null != doctypeSystem) if (null != doctypeSystem)
{ {
if (null == doctypePublic) char quote = JdkXmlUtils.getQuoteChar(doctypeSystem);
writer.write(" SYSTEM \""); if (null == doctypePublic) {
else writer.write(" SYSTEM");
writer.write(" \""); }
writer.write(" ");
writer.write(quote);
writer.write(doctypeSystem); writer.write(doctypeSystem);
writer.write(quote);
if (closeDecl) if (closeDecl)
{ {
writer.write("\">"); writer.write(">");
writer.write(m_lineSep, 0, m_lineSepLen); writer.write(m_lineSep, 0, m_lineSepLen);
closeDecl = false; // done closing closeDecl = false; // done closing
} }
else
writer.write('\"');
} }
boolean dothis = false; boolean dothis = false;
if (dothis) if (dothis)

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
*/ */
/* /*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
@ -33,6 +33,7 @@ import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import jdk.xml.internal.JdkXmlUtils;
import org.w3c.dom.Attr; import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection; import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment; import org.w3c.dom.Comment;
@ -62,7 +63,7 @@ import org.xml.sax.helpers.LocatorImpl;
* parameters and filters if any during serialization. * parameters and filters if any during serialization.
* *
* @xsl.usage internal * @xsl.usage internal
* @LastModified: Oct 2017 * @LastModified: Apr 2021
*/ */
final class DOM3TreeWalker { final class DOM3TreeWalker {
@ -501,7 +502,7 @@ final class DOM3TreeWalker {
// DOCTYPE internal subset via an event call, so we write it // DOCTYPE internal subset via an event call, so we write it
// out here. // out here.
Writer writer = fSerializer.getWriter(); Writer writer = fSerializer.getWriter();
StringBuffer dtd = new StringBuffer(); StringBuilder dtd = new StringBuilder();
dtd.append("<!DOCTYPE "); dtd.append("<!DOCTYPE ");
dtd.append(docTypeName); dtd.append(docTypeName);
@ -512,13 +513,14 @@ final class DOM3TreeWalker {
} }
if (null != systemId) { if (null != systemId) {
char quote = JdkXmlUtils.getQuoteChar(systemId);
if (null == publicId) { if (null == publicId) {
dtd.append(" SYSTEM \""); dtd.append(" SYSTEM ").append(quote);
} else { } else {
dtd.append(" \""); dtd.append(" ").append(quote);
} }
dtd.append(systemId); dtd.append(systemId);
dtd.append('\"'); dtd.append(quote);
} }
dtd.append(" [ "); dtd.append(" [ ");

View file

@ -366,6 +366,22 @@ public class JdkXmlUtils {
return tf; return tf;
} }
/**
* Returns the character to be used to quote the input content. Between
* single and double quotes, this method returns the one that is not found
* in the input. Returns double quote by default.
*
* @param s the input string
* @return returns the quote not found in the input
*/
public static char getQuoteChar(String s) {
if (s != null && s.indexOf('"') > -1) {
return '\'';
} else {
return '"';
}
}
private static XMLReader getXMLReaderWSAXFactory(boolean overrideDefaultParser) { private static XMLReader getXMLReaderWSAXFactory(boolean overrideDefaultParser) {
SAXParserFactory saxFactory = getSAXFactory(overrideDefaultParser); SAXParserFactory saxFactory = getSAXFactory(overrideDefaultParser);
try { try {

View file

@ -582,17 +582,42 @@ class ServerImpl implements TimeSource {
start = space+1; start = space+1;
String version = requestLine.substring (start); String version = requestLine.substring (start);
Headers headers = req.headers(); Headers headers = req.headers();
String s = headers.getFirst ("Transfer-encoding"); /* check key for illegal characters */
for (var k : headers.keySet()) {
if (!isValidHeaderKey(k)) {
reject(Code.HTTP_BAD_REQUEST, requestLine,
"Header key contains illegal characters");
return;
}
}
/* checks for unsupported combinations of lengths and encodings */
if (headers.containsKey("Content-Length") &&
(headers.containsKey("Transfer-encoding") || headers.get("Content-Length").size() > 1)) {
reject(Code.HTTP_BAD_REQUEST, requestLine,
"Conflicting or malformed headers detected");
return;
}
long clen = 0L; long clen = 0L;
if (s !=null && s.equalsIgnoreCase ("chunked")) { String headerValue = null;
clen = -1L; List<String> teValueList = headers.get("Transfer-encoding");
if (teValueList != null && !teValueList.isEmpty()) {
headerValue = teValueList.get(0);
}
if (headerValue != null) {
if (headerValue.equalsIgnoreCase("chunked") && teValueList.size() == 1) {
clen = -1L;
} else {
reject(Code.HTTP_NOT_IMPLEMENTED,
requestLine, "Unsupported Transfer-Encoding value");
return;
}
} else { } else {
s = headers.getFirst ("Content-Length"); headerValue = headers.getFirst("Content-Length");
if (s != null) { if (headerValue != null) {
clen = Long.parseLong(s); clen = Long.parseLong(headerValue);
} }
if (clen == 0) { if (clen == 0) {
requestCompleted (connection); requestCompleted(connection);
} }
} }
ctx = contexts.findContext (protocol, uri.getPath()); ctx = contexts.findContext (protocol, uri.getPath());
@ -907,4 +932,24 @@ class ServerImpl implements TimeSource {
return secs * 1000; return secs * 1000;
} }
} }
/*
* Validates a RFC 7230 header-key.
*/
static boolean isValidHeaderKey(String token) {
if (token == null) return false;
boolean isValidChar;
char[] chars = token.toCharArray();
String validSpecialChars = "!#$%&'*+-.^_`|~";
for (char c : chars) {
isValidChar = ((c >= 'a') && (c <= 'z')) ||
((c >= 'A') && (c <= 'Z')) ||
((c >= '0') && (c <= '9'));
if (!isValidChar && validSpecialChars.indexOf(c) == -1) {
return false;
}
}
return !token.isEmpty();
}
} }

View file

@ -795,8 +795,12 @@ public class Main {
CodeSigner[] signers = je.getCodeSigners(); CodeSigner[] signers = je.getCodeSigners();
boolean isSigned = (signers != null); boolean isSigned = (signers != null);
anySigned |= isSigned; anySigned |= isSigned;
hasUnsignedEntry |= !je.isDirectory() && !isSigned
&& !signatureRelated(name); boolean unsignedEntry = !isSigned
&& ((!je.isDirectory() && !signatureRelated(name))
// a directory entry but with a suspicious size
|| (je.isDirectory() && je.getSize() > 0));
hasUnsignedEntry |= unsignedEntry;
int inStoreWithAlias = inKeyStore(signers); int inStoreWithAlias = inKeyStore(signers);
@ -818,7 +822,9 @@ public class Main {
sb.append(isSigned ? rb.getString("s") : rb.getString("SPACE")) sb.append(isSigned ? rb.getString("s") : rb.getString("SPACE"))
.append(inManifest ? rb.getString("m") : rb.getString("SPACE")) .append(inManifest ? rb.getString("m") : rb.getString("SPACE"))
.append(inStore ? rb.getString("k") : rb.getString("SPACE")) .append(inStore ? rb.getString("k") : rb.getString("SPACE"))
.append((inStoreWithAlias & NOT_ALIAS) != 0 ? 'X' : ' ') .append((inStoreWithAlias & NOT_ALIAS) != 0 ?
rb.getString("X") : rb.getString("SPACE"))
.append(unsignedEntry ? rb.getString("q") : rb.getString("SPACE"))
.append(rb.getString("SPACE")); .append(rb.getString("SPACE"));
sb.append('|'); sb.append('|');
} }
@ -846,10 +852,14 @@ public class Main {
.append(rb .append(rb
.getString(".Signature.related.entries.")) .getString(".Signature.related.entries."))
.append("\n\n"); .append("\n\n");
} else { } else if (unsignedEntry) {
sb.append('\n').append(tab) sb.append('\n').append(tab)
.append(rb.getString(".Unsigned.entries.")) .append(rb.getString(".Unsigned.entries."))
.append("\n\n"); .append("\n\n");
} else {
sb.append('\n').append(tab)
.append(rb.getString(".Directory.entries."))
.append("\n\n");
} }
} }
@ -924,6 +934,11 @@ public class Main {
System.out.println(rb.getString( System.out.println(rb.getString(
".X.not.signed.by.specified.alias.es.")); ".X.not.signed.by.specified.alias.es."));
} }
if (hasUnsignedEntry) {
System.out.println(rb.getString(
".q.unsigned.entry"));
}
} }
if (man == null) { if (man == null) {
System.out.println(); System.out.println();

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -133,6 +133,8 @@ public class Resources extends java.util.ListResourceBundle {
{"s", "s"}, {"s", "s"},
{"m", "m"}, {"m", "m"},
{"k", "k"}, {"k", "k"},
{"X", "X"},
{"q", "?"},
{".and.d.more.", "(and %d more)"}, {".and.d.more.", "(and %d more)"},
{".s.signature.was.verified.", {".s.signature.was.verified.",
" s = signature was verified "}, " s = signature was verified "},
@ -142,9 +144,12 @@ public class Resources extends java.util.ListResourceBundle {
" k = at least one certificate was found in keystore"}, " k = at least one certificate was found in keystore"},
{".X.not.signed.by.specified.alias.es.", {".X.not.signed.by.specified.alias.es.",
" X = not signed by specified alias(es)"}, " X = not signed by specified alias(es)"},
{".q.unsigned.entry",
" ? = unsigned entry"},
{"no.manifest.", "no manifest."}, {"no.manifest.", "no manifest."},
{".Signature.related.entries.","(Signature related entries)"}, {".Signature.related.entries.","(Signature related entries)"},
{".Unsigned.entries.", "(Unsigned entries)"}, {".Unsigned.entries.", "(Unsigned entries)"},
{".Directory.entries.", "(Directory entries)"},
{"jar.is.unsigned", {"jar.is.unsigned",
"jar is unsigned."}, "jar is unsigned."},
{"jar.treated.unsigned", {"jar.treated.unsigned",

View file

@ -329,6 +329,7 @@ public class TestLargePagesFlags {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args); ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args);
OutputAnalyzer output = new OutputAnalyzer(pb.start()); OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);
return output; return output;
} }

View file

@ -62,6 +62,7 @@ public class ReadFromNoaccessArea {
if (output.getStdout() != null && output.getStdout().contains("WB_ReadFromNoaccessArea method is useless")) { if (output.getStdout() != null && output.getStdout().contains("WB_ReadFromNoaccessArea method is useless")) {
throw new SkippedException("There is no protected page in ReservedHeapSpace in these circumstance"); throw new SkippedException("There is no protected page in ReservedHeapSpace in these circumstance");
} }
output.shouldNotHaveExitValue(0);
if (Platform.isWindows()) { if (Platform.isWindows()) {
output.shouldContain("EXCEPTION_ACCESS_VIOLATION"); output.shouldContain("EXCEPTION_ACCESS_VIOLATION");
} else if (Platform.isOSX()) { } else if (Platform.isOSX()) {
@ -76,7 +77,6 @@ public class ReadFromNoaccessArea {
// This method calls whitebox method reading from noaccess area // This method calls whitebox method reading from noaccess area
public static void main(String args[]) throws Exception { public static void main(String args[]) throws Exception {
WhiteBox.getWhiteBox().readFromNoaccessArea(); WhiteBox.getWhiteBox().readFromNoaccessArea();
throw new Exception("Call of readFromNoaccessArea succeeded! This is wrong. Crash expected. Test failed.");
} }
} }

View file

@ -44,27 +44,27 @@ import sun.hotspot.WhiteBox;
public class ReserveMemory { public class ReserveMemory {
public static void main(String args[]) throws Exception { public static void main(String args[]) throws Exception {
if (args.length > 0) { if (args.length > 0) {
// expected to crash
WhiteBox.getWhiteBox().readReservedMemory(); WhiteBox.getWhiteBox().readReservedMemory();
throw new Exception("Read of reserved/uncommitted memory unexpectedly succeeded, expected crash!");
}
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:-CreateCoredumpOnCrash",
"-Xmx128m",
"ReserveMemory",
"test");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
if (Platform.isWindows()) {
output.shouldContain("EXCEPTION_ACCESS_VIOLATION");
} else if (Platform.isOSX()) {
output.shouldContain("SIGBUS");
} else { } else {
output.shouldContain("SIGSEGV"); ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:-CreateCoredumpOnCrash",
"-Xmx128m",
"ReserveMemory",
"test");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
if (Platform.isWindows()) {
output.shouldContain("EXCEPTION_ACCESS_VIOLATION");
} else if (Platform.isOSX()) {
output.shouldContain("SIGBUS");
} else {
output.shouldContain("SIGSEGV");
}
} }
} }
} }

View file

@ -226,7 +226,6 @@ java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java 8196440 linux-all
java/awt/Window/ShapedAndTranslucentWindows/SetShapeAndClick.java 8197936 macosx-all java/awt/Window/ShapedAndTranslucentWindows/SetShapeAndClick.java 8197936 macosx-all
java/awt/Window/ShapedAndTranslucentWindows/SetShapeDynamicallyAndClick.java 8013450 macosx-all java/awt/Window/ShapedAndTranslucentWindows/SetShapeDynamicallyAndClick.java 8013450 macosx-all
java/awt/Window/ShapedAndTranslucentWindows/ShapedTranslucentWindowClick.java 8013450 macosx-all java/awt/Window/ShapedAndTranslucentWindows/ShapedTranslucentWindowClick.java 8013450 macosx-all
java/awt/Window/MultiWindowApp/MultiWindowAppTest.java 8159904 linux-all
java/awt/Window/MultiWindowApp/ChildAlwaysOnTopTest.java 8222323 windows-all java/awt/Window/MultiWindowApp/ChildAlwaysOnTopTest.java 8222323 windows-all
java/awt/Window/ShapedAndTranslucentWindows/FocusAWTTest.java 8222328 windows-all,linux-all,macosx-all java/awt/Window/ShapedAndTranslucentWindows/FocusAWTTest.java 8222328 windows-all,linux-all,macosx-all
java/awt/Window/ShapedAndTranslucentWindows/Shaped.java 8222328 windows-all,linux-all,macosx-all java/awt/Window/ShapedAndTranslucentWindows/Shaped.java 8222328 windows-all,linux-all,macosx-all
@ -243,7 +242,7 @@ java/awt/FontMetrics/FontCrash.java 8198336 windows-all
java/awt/image/BufferedImage/ICMColorDataTest/ICMColorDataTest.java 8233028 generic-all java/awt/image/BufferedImage/ICMColorDataTest/ICMColorDataTest.java 8233028 generic-all
java/awt/image/DrawImage/IncorrectAlphaSurface2SW.java 8056077 linux-all java/awt/image/DrawImage/IncorrectAlphaSurface2SW.java 8056077 linux-all
java/awt/image/DrawImage/BlitRotateClippedArea.java 8255724 linux-all java/awt/image/DrawImage/BlitRotateClippedArea.java 8255724 linux-all
java/awt/image/multiresolution/MultiresolutionIconTest.java 8169187 macosx-all,windows-all java/awt/image/multiresolution/MultiresolutionIconTest.java 8169187,8252812 macosx-all,windows-all,linux-x64
java/awt/print/Headless/HeadlessPrinterJob.java 8196088 windows-all java/awt/print/Headless/HeadlessPrinterJob.java 8196088 windows-all
sun/awt/datatransfer/SuplementaryCharactersTransferTest.java 8011371 generic-all sun/awt/datatransfer/SuplementaryCharactersTransferTest.java 8011371 generic-all
sun/awt/shell/ShellFolderMemoryLeak.java 8197794 windows-all sun/awt/shell/ShellFolderMemoryLeak.java 8197794 windows-all
@ -529,6 +528,8 @@ java/awt/MenuBar/TestNoScreenMenuBar.java 8265987 macosx-all
java/awt/Graphics2D/DrawString/DrawRotatedStringUsingRotatedFont.java 8266283 generic-all java/awt/Graphics2D/DrawString/DrawRotatedStringUsingRotatedFont.java 8266283 generic-all
java/awt/KeyboardFocusmanager/TypeAhead/ButtonActionKeyTest/ButtonActionKeyTest.java 8257529 windows-x64 java/awt/KeyboardFocusmanager/TypeAhead/ButtonActionKeyTest/ButtonActionKeyTest.java 8257529 windows-x64
java/awt/Window/GetScreenLocation/GetScreenLocationTest.java 8225787 linux-x64
############################################################################ ############################################################################
# jdk_beans # jdk_beans
@ -746,6 +747,8 @@ javax/swing/JEditorPane/6917744/bug6917744.java 8213124 macosx-all
javax/swing/JRootPane/4670486/bug4670486.java 8042381 macosx-all javax/swing/JRootPane/4670486/bug4670486.java 8042381 macosx-all
javax/swing/JPopupMenu/4634626/bug4634626.java 8017175 macosx-all javax/swing/JPopupMenu/4634626/bug4634626.java 8017175 macosx-all
javax/swing/plaf/basic/BasicHTML/4251579/bug4251579.java 8137101 linux-x64
sanity/client/SwingSet/src/ToolTipDemoTest.java 8225012 windows-all,macosx-all sanity/client/SwingSet/src/ToolTipDemoTest.java 8225012 windows-all,macosx-all
sanity/client/SwingSet/src/ScrollPaneDemoTest.java 8225013 linux-all sanity/client/SwingSet/src/ScrollPaneDemoTest.java 8225013 linux-all
sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java 8265770 macosx-all sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java 8265770 macosx-all

View file

@ -21,7 +21,7 @@
* questions. * questions.
*/ */
/** /*
* @test * @test
* @summary After calling frame.toBack() dialog goes to the back on Ubuntu 12.04 * @summary After calling frame.toBack() dialog goes to the back on Ubuntu 12.04
* @key headful * @key headful
@ -38,22 +38,24 @@ public class MultiWindowAppTest {
Window win1 = new Frame(); Window win1 = new Frame();
Window win2 = new Dialog((Frame) null); Window win2 = new Dialog((Frame) null);
int delay = 300;
win1.setBounds(100, 100, 200, 200); win1.setBounds(100, 100, 200, 200);
win1.setBackground(Color.RED); win1.setBackground(Color.RED);
win1.setVisible(true); win1.setVisible(true);
Robot robot = new Robot(); Robot robot = new Robot();
robot.delay(200); robot.delay(delay);
robot.waitForIdle(); robot.waitForIdle();
win2.setBounds(win1.getBounds()); win2.setBounds(win1.getBounds());
win2.setVisible(true); win2.setVisible(true);
robot.delay(200); robot.delay(delay);
robot.waitForIdle(); robot.waitForIdle();
win1.toFront(); win1.toFront();
robot.delay(200); robot.delay(delay);
robot.waitForIdle(); robot.waitForIdle();
Point point = win1.getLocationOnScreen(); Point point = win1.getLocationOnScreen();
@ -66,7 +68,7 @@ public class MultiWindowAppTest {
} }
win1.toBack(); win1.toBack();
robot.delay(200); robot.delay(delay);
robot.waitForIdle(); robot.waitForIdle();
color = robot.getPixelColor(point.x + 100, point.y + 100); color = robot.getPixelColor(point.x + 100, point.y + 100);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 6802846 8172529 8227758 * @bug 6802846 8172529 8227758 8260960
* @summary jarsigner needs enhanced cert validation(options) * @summary jarsigner needs enhanced cert validation(options)
* @library /test/lib * @library /test/lib
* @run main/timeout=240 ConciseJarsigner * @run main/timeout=240 ConciseJarsigner
@ -112,23 +112,26 @@ public class ConciseJarsigner {
.filter(s -> s.contains(year)) .filter(s -> s.contains(year))
.count() == 12); .count() == 12);
// 4 groups: MANIFST, unrelated, signed, unsigned // 5 groups: MANIFEST, signature related entries, directory entries,
// signed entries, and unsigned entries.
Asserts.assertTrue(js("-verify a.jar -verbose:summary") Asserts.assertTrue(js("-verify a.jar -verbose:summary")
.asLines().stream() .asLines().stream()
.filter(s -> s.contains(year)) .filter(s -> s.contains(year))
.count() == 4); .count() == 5);
// still 4 groups, but MANIFEST group has no other file // still 5 groups, but MANIFEST group and directiry entry group
// have no other file
Asserts.assertTrue(js("-verify a.jar -verbose:summary") Asserts.assertTrue(js("-verify a.jar -verbose:summary")
.asLines().stream() .asLines().stream()
.filter(s -> s.contains("more)")) .filter(s -> s.contains("more)"))
.count() == 3); .count() == 3);
// 5 groups: MANIFEST, unrelated, signed by a1/a2, signed by a2, unsigned // 6 groups: MANIFEST, signature related entries, directory entries,
// signed entries by a1/a2, signed entries by a2, and unsigned entries.
Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs") Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs")
.asLines().stream() .asLines().stream()
.filter(s -> s.contains(year)) .filter(s -> s.contains(year))
.count() == 5); .count() == 6);
// 2 for MANIFEST, 2*2 for A1/A2, 2 for A3/A4 // 2 for MANIFEST, 2*2 for A1/A2, 2 for A3/A4
Asserts.assertTrue(js("-verify a.jar -verbose -certs") Asserts.assertTrue(js("-verify a.jar -verbose -certs")
@ -148,7 +151,8 @@ public class ConciseJarsigner {
.filter(s -> s.contains("[certificate")) .filter(s -> s.contains("[certificate"))
.count() == 5); .count() == 5);
// still 5 groups, but MANIFEST group has no other file // still 6 groups, but MANIFEST group and directory entry group
// have no other file
Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs") Asserts.assertTrue(js("-verify a.jar -verbose:summary -certs")
.asLines().stream() .asLines().stream()
.filter(s -> s.contains("more)")) .filter(s -> s.contains("more)"))