8298875: A module requiring "java.base" with flags ACC_SYNTHETIC should be rejected
Reviewed-by: jpai, mchung
This commit is contained in:
parent
0459159537
commit
11fd651ab1
src/java.base/share/classes/jdk/internal/module
test/jdk/java/lang/module
@ -401,6 +401,10 @@ public final class ModuleInfo {
|
||||
}
|
||||
|
||||
if (dn.equals("java.base")) {
|
||||
if (mods.contains(Requires.Modifier.SYNTHETIC)) {
|
||||
throw invalidModuleDescriptor("The requires entry for java.base"
|
||||
+ " has ACC_SYNTHETIC set");
|
||||
}
|
||||
if (major >= 54
|
||||
&& (mods.contains(Requires.Modifier.TRANSITIVE)
|
||||
|| mods.contains(Requires.Modifier.STATIC))) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2022, 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
|
||||
@ -23,6 +23,7 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8142968 8158456 8298875
|
||||
* @modules java.base/jdk.internal.access
|
||||
* java.base/jdk.internal.module
|
||||
* @run testng ModuleDescriptorTest
|
||||
@ -63,6 +64,7 @@ import static org.testng.Assert.*;
|
||||
|
||||
@Test
|
||||
public class ModuleDescriptorTest {
|
||||
private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
|
||||
|
||||
@DataProvider(name = "invalidNames")
|
||||
public Object[][] invalidNames() {
|
||||
@ -1084,7 +1086,6 @@ public class ModuleDescriptorTest {
|
||||
}
|
||||
|
||||
private ModuleDescriptor newModule(String name, String vs) {
|
||||
JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
|
||||
Builder builder = JLMA.newModuleBuilder(name, false, Set.of());
|
||||
if (vs != null)
|
||||
builder.version(vs);
|
||||
@ -1094,7 +1095,6 @@ public class ModuleDescriptorTest {
|
||||
}
|
||||
|
||||
private Requires newRequires(String name, String vs) {
|
||||
JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
|
||||
Builder builder = JLMA.newModuleBuilder("foo", false, Set.of());
|
||||
if (vs == null) {
|
||||
builder.requires(name);
|
||||
@ -1361,7 +1361,6 @@ public class ModuleDescriptorTest {
|
||||
* Test ModuleDescriptor with a packager finder that doesn't return the
|
||||
* complete set of packages.
|
||||
*/
|
||||
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
|
||||
public void testReadsWithBadPackageFinder() throws Exception {
|
||||
ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
|
||||
.requires("java.base")
|
||||
@ -1373,7 +1372,8 @@ public class ModuleDescriptorTest {
|
||||
ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
|
||||
|
||||
// package finder returns a set that doesn't include p
|
||||
ModuleDescriptor.read(bb, () -> Set.of("q"));
|
||||
assertThrows(InvalidModuleDescriptorException.class,
|
||||
() -> ModuleDescriptor.read(bb, () -> Set.of("q")));
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
|
||||
@ -1392,63 +1392,76 @@ public class ModuleDescriptorTest {
|
||||
ModuleDescriptor.read(bb);
|
||||
}
|
||||
|
||||
// The requires table for java.base must be 0 length
|
||||
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
|
||||
/**
|
||||
* Test ModuleDescriptor.read reading a module-info for java.base that has a non-0
|
||||
* length requires table.
|
||||
*/
|
||||
public void testReadOfJavaBaseWithRequires() {
|
||||
ModuleDescriptor descriptor
|
||||
= ModuleDescriptor.newModule("java.base")
|
||||
ModuleDescriptor descriptor = ModuleDescriptor.newModule("java.base")
|
||||
.requires("other")
|
||||
.build();
|
||||
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
|
||||
ModuleDescriptor.read(bb);
|
||||
assertThrows(InvalidModuleDescriptorException.class,
|
||||
() -> ModuleDescriptor.read(bb));
|
||||
}
|
||||
|
||||
// The requires table must have an entry for java.base
|
||||
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
|
||||
/**
|
||||
* Test ModuleDescriptor.read reading a module-info with a zero length requires table
|
||||
* (no entry for java.base).
|
||||
*/
|
||||
public void testReadWithEmptyRequires() {
|
||||
ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
|
||||
.newModuleBuilder("m1", false, Set.of()).build();
|
||||
// use non-strict builder to create module that does not require java.base
|
||||
ModuleDescriptor descriptor = JLMA.newModuleBuilder("m", false, Set.of()).build();
|
||||
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
|
||||
ModuleDescriptor.read(bb);
|
||||
assertThrows(InvalidModuleDescriptorException.class,
|
||||
() -> ModuleDescriptor.read(bb));
|
||||
}
|
||||
|
||||
// The requires table must have an entry for java.base
|
||||
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
|
||||
/**
|
||||
* Test ModuleDescriptor.read reading a module-info with a non-zero length requires
|
||||
* table that does not have entry for java.base.
|
||||
*/
|
||||
public void testReadWithNoRequiresBase() {
|
||||
ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
|
||||
.newModuleBuilder("m1", false, Set.of()).requires("m2").build();
|
||||
// use non-strict builder to create module that does not require java.base
|
||||
ModuleDescriptor descriptor = JLMA.newModuleBuilder("m1", false, Set.of())
|
||||
.requires("m2")
|
||||
.build();
|
||||
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
|
||||
ModuleDescriptor.read(bb);
|
||||
assertThrows(InvalidModuleDescriptorException.class,
|
||||
() -> ModuleDescriptor.read(bb));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test ModuleDescriptor.read reading a module-info with a requires entry for
|
||||
* java.base with the ACC_SYNTHETIC flag set.
|
||||
*/
|
||||
public void testReadWithSynethticRequiresBase() {
|
||||
ModuleDescriptor descriptor = ModuleDescriptor.newModule("m")
|
||||
.requires(Set.of(SYNTHETIC), "java.base")
|
||||
.build();
|
||||
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
|
||||
assertThrows(InvalidModuleDescriptorException.class,
|
||||
() -> ModuleDescriptor.read(bb));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test ModuleDescriptor.read with a null parameter.
|
||||
*/
|
||||
public void testReadWithNull() throws Exception {
|
||||
Module base = Object.class.getModule();
|
||||
|
||||
try {
|
||||
ModuleDescriptor.read((InputStream)null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
assertThrows(NullPointerException.class,
|
||||
() -> ModuleDescriptor.read((InputStream) null));
|
||||
assertThrows(NullPointerException.class,
|
||||
() -> ModuleDescriptor.read((ByteBuffer) null));
|
||||
|
||||
try (InputStream in = base.getResourceAsStream("module-info.class")) {
|
||||
try {
|
||||
ModuleDescriptor.read(in, null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
}
|
||||
assertThrows(NullPointerException.class,
|
||||
() -> ModuleDescriptor.read(in, null));
|
||||
|
||||
try {
|
||||
ModuleDescriptor.read((ByteBuffer)null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
|
||||
try (InputStream in = base.getResourceAsStream("module-info.class")) {
|
||||
ByteBuffer bb = ByteBuffer.wrap(in.readAllBytes());
|
||||
try {
|
||||
ModuleDescriptor.read(bb, null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
assertThrows(NullPointerException.class,
|
||||
() -> ModuleDescriptor.read(bb, null));
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user