Skip to content

Commit

Permalink
8298875: A module requiring "java.base" with flags ACC_SYNTHETIC shou…
Browse files Browse the repository at this point in the history
…ld be rejected

Reviewed-by: jpai, mchung
  • Loading branch information
Alan Bateman committed Dec 27, 2022
1 parent 0459159 commit 11fd651
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,10 @@ private Builder readModuleAttribute(DataInput in, ConstantPool cpool, int major)
}

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))) {
Expand Down
95 changes: 54 additions & 41 deletions test/jdk/java/lang/module/ModuleDescriptorTest.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -23,6 +23,7 @@

/**
* @test
* @bug 8142968 8158456 8298875
* @modules java.base/jdk.internal.access
* java.base/jdk.internal.module
* @run testng ModuleDescriptorTest
Expand Down Expand Up @@ -63,6 +64,7 @@

@Test
public class ModuleDescriptorTest {
private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();

@DataProvider(name = "invalidNames")
public Object[][] invalidNames() {
Expand Down Expand Up @@ -1084,7 +1086,6 @@ public void testUnparseableCompiledVersion(String vs1, String vs2) {
}

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);
Expand All @@ -1094,7 +1095,6 @@ private ModuleDescriptor newModule(String name, String vs) {
}

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);
Expand Down Expand Up @@ -1361,7 +1361,6 @@ public void testReadsWithPackageFinder() throws Exception {
* 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")
Expand All @@ -1373,7 +1372,8 @@ public void testReadsWithBadPackageFinder() throws Exception {
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)
Expand All @@ -1392,63 +1392,76 @@ public void testReadFromEmptyBuffer() {
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));
}
}

Expand Down

0 comments on commit 11fd651

Please sign in to comment.