undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
This commit is contained in:
commit
0a580b313d
70422 changed files with 17213626 additions and 0 deletions
199
test/jdk/java/lang/IO/IO.java
Normal file
199
test/jdk/java/lang/IO/IO.java
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
/*
|
||||
* Copyright (c) 2023, 2025, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.Writer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
import org.junit.jupiter.api.Assumptions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.EnabledOnOs;
|
||||
import org.junit.jupiter.api.condition.OS;
|
||||
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
|
||||
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8305457 8342936 8351435 8344706 8361613
|
||||
* @summary java.lang.IO tests
|
||||
* @library /test/lib
|
||||
* @run junit IO
|
||||
*/
|
||||
@ExtendWith(IO.TimingExtension.class)
|
||||
public class IO {
|
||||
|
||||
@Nested
|
||||
@EnabledOnOs({OS.LINUX, OS.MAC})
|
||||
public class OSSpecificTests {
|
||||
|
||||
private static Path expect;
|
||||
|
||||
@BeforeAll
|
||||
public static void prepareTTY() {
|
||||
expect = Paths.get("/usr/bin/expect"); // os-specific path
|
||||
if (!Files.exists(expect) || !Files.isExecutable(expect)) {
|
||||
Assumptions.abort("'" + expect + "' not found");
|
||||
}
|
||||
try {
|
||||
var outputAnalyzer = ProcessTools.executeProcess(
|
||||
expect.toAbsolutePath().toString(), "-version");
|
||||
outputAnalyzer.reportDiagnosticSummary();
|
||||
} catch (Exception _) { }
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {"println", "print"})
|
||||
public void outputTestInteractive(String mode) throws Exception {
|
||||
var testSrc = System.getProperty("test.src", ".");
|
||||
OutputAnalyzer output = ProcessTools.executeProcess(
|
||||
expect.toString(),
|
||||
Path.of(testSrc, "output.exp").toAbsolutePath().toString(),
|
||||
System.getProperty("test.jdk") + "/bin/java",
|
||||
Path.of(testSrc, "Output.java").toAbsolutePath().toString(),
|
||||
mode);
|
||||
assertEquals(0, output.getExitValue());
|
||||
assertTrue(output.getStderr().isEmpty());
|
||||
output.reportDiagnosticSummary();
|
||||
String out = output.getStdout();
|
||||
// The first half of the output is produced by Console, the second
|
||||
// half is produced by IO: those halves must match.
|
||||
// Executing Console and IO in the same VM (as opposed to
|
||||
// consecutive VM runs, which are cleaner) to be able to compare string
|
||||
// representation of objects.
|
||||
assertFalse(out.isBlank());
|
||||
assertEquals(out.substring(0, out.length() / 2),
|
||||
out.substring(out.length() / 2));
|
||||
}
|
||||
|
||||
/*
|
||||
* This tests simulates terminal interaction (isatty), to check that the
|
||||
* prompt is output.
|
||||
*
|
||||
* To simulate a terminal, the test currently uses the EXPECT(1) Unix
|
||||
* command, which does not work for Windows. Later, a library like pty4j
|
||||
* or JPty might be used instead of EXPECT, to cover both Unix and Windows.
|
||||
*/
|
||||
@ParameterizedTest
|
||||
@MethodSource("args")
|
||||
public void inputTestInteractive(String prompt) throws Exception {
|
||||
var testSrc = System.getProperty("test.src", ".");
|
||||
var command = new ArrayList<String>();
|
||||
command.add(expect.toString());
|
||||
String expectInputName = PROMPT_NONE.equals(prompt) ? "input-no-prompt"
|
||||
: "input";
|
||||
command.add(Path.of(testSrc, expectInputName + ".exp").toAbsolutePath().toString());
|
||||
command.add(System.getProperty("test.jdk") + "/bin/java");
|
||||
command.add(Path.of(testSrc, "Input.java").toAbsolutePath().toString());
|
||||
command.add(prompt == null ? "0" : PROMPT_NONE.equals(prompt) ? "2" : "1");
|
||||
command.add(String.valueOf(prompt));
|
||||
OutputAnalyzer output = ProcessTools.executeProcess(command.toArray(new String[]{}));
|
||||
output.reportDiagnosticSummary();
|
||||
assertEquals(0, output.getExitValue());
|
||||
}
|
||||
|
||||
private static final String PROMPT_NONE = "prompt-none";
|
||||
|
||||
public static Stream<Arguments> args() {
|
||||
// prompts
|
||||
return Stream.of(null, "?", "%s", PROMPT_NONE).map(Arguments::of);
|
||||
}
|
||||
}
|
||||
|
||||
@Test //JDK-8342936
|
||||
public void printlnNoParamsTest() throws Exception {
|
||||
var file = Path.of("PrintlnNoParams.java");
|
||||
try (Writer w = Files.newBufferedWriter(file)) {
|
||||
w.write("""
|
||||
import static java.lang.IO.*;
|
||||
void main() {
|
||||
print("1 ");
|
||||
print("2 ");
|
||||
print("3 ");
|
||||
println();
|
||||
}
|
||||
""");
|
||||
}
|
||||
var pb = ProcessTools.createTestJavaProcessBuilder("-Xlog:aot=off", "-Xlog:cds=off", file.toString());
|
||||
OutputAnalyzer output = ProcessTools.executeProcess(pb);
|
||||
assertEquals(0, output.getExitValue());
|
||||
assertTrue(output.getStderr().isEmpty());
|
||||
output.reportDiagnosticSummary();
|
||||
String out = output.getStdout();
|
||||
String nl = System.getProperty("line.separator");
|
||||
assertEquals("1 2 3 " + nl, out);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// adapted from https://junit.org/junit5/docs/current/user-guide/#extensions-lifecycle-callbacks-timing-extension
|
||||
// remove after CODETOOLS-7903752 propagates to jtreg that this test is routinely run by
|
||||
|
||||
public static class TimingExtension implements BeforeTestExecutionCallback,
|
||||
AfterTestExecutionCallback {
|
||||
|
||||
private static final System.Logger logger = System.getLogger(
|
||||
TimingExtension.class.getName());
|
||||
|
||||
private static final String START_TIME = "start time";
|
||||
|
||||
@Override
|
||||
public void beforeTestExecution(ExtensionContext context) {
|
||||
getStore(context).put(START_TIME, time());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTestExecution(ExtensionContext context) {
|
||||
Method testMethod = context.getRequiredTestMethod();
|
||||
long startTime = getStore(context).remove(START_TIME, long.class);
|
||||
long duration = time() - startTime;
|
||||
|
||||
logger.log(System.Logger.Level.INFO, () ->
|
||||
String.format("Method [%s] took %s ms.", testMethod.getName(), duration));
|
||||
}
|
||||
|
||||
private ExtensionContext.Store getStore(ExtensionContext context) {
|
||||
return context.getStore(ExtensionContext.Namespace.create(getClass(),
|
||||
context.getRequiredTestMethod()));
|
||||
}
|
||||
|
||||
private long time() {
|
||||
return System.nanoTime() / 1_000_000;
|
||||
}
|
||||
}
|
||||
}
|
||||
38
test/jdk/java/lang/IO/Input.java
Normal file
38
test/jdk/java/lang/IO/Input.java
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Copyright (c) 2024, 2025, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import static java.lang.IO.readln;
|
||||
|
||||
public class Input {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
switch (args[0]) {
|
||||
case "0" -> System.out.print(readln(null));
|
||||
case "1" -> System.out.print(readln(args[1]));
|
||||
case "2" -> System.out.print(readln());
|
||||
default -> throw new AssertionError("Unknown command: " + args[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
36
test/jdk/java/lang/IO/Methods.java
Normal file
36
test/jdk/java/lang/IO/Methods.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) 2024, 2025, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import static java.lang.IO.*;
|
||||
|
||||
public class Methods {
|
||||
|
||||
public static void main(String[] args) {
|
||||
switch (args[0]) {
|
||||
case "println" -> println("hello");
|
||||
case "print" -> print("hello");
|
||||
case "input" -> readln("hello");
|
||||
default -> throw new IllegalArgumentException(args[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
63
test/jdk/java/lang/IO/Output.java
Normal file
63
test/jdk/java/lang/IO/Output.java
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* Copyright (c) 2024, 2025, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import static java.lang.IO.*;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class Output {
|
||||
|
||||
private static final Object[] OBJECTS = {
|
||||
null,
|
||||
false,
|
||||
(byte) 1,
|
||||
(short) 2,
|
||||
'a',
|
||||
3,
|
||||
4L,
|
||||
5f,
|
||||
6d,
|
||||
new Object(),
|
||||
"%s", // to test that print(ln) does not interpret its argument as a format string
|
||||
new char[]{'a'},
|
||||
};
|
||||
|
||||
public static void main(String[] args) {
|
||||
switch (args[0]) {
|
||||
case "print" -> {
|
||||
printObjects(obj -> System.console().format("%s", obj).flush());
|
||||
printObjects(obj -> print(obj));
|
||||
}
|
||||
case "println" -> {
|
||||
printObjects(obj -> System.console().format("%s%n", obj).flush());
|
||||
printObjects(obj -> println(obj));
|
||||
}
|
||||
default -> throw new IllegalArgumentException();
|
||||
}
|
||||
}
|
||||
|
||||
private static void printObjects(Consumer<Object> printer) {
|
||||
for (var obj : OBJECTS) {
|
||||
printer.accept(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
30
test/jdk/java/lang/IO/input-no-prompt.exp
Normal file
30
test/jdk/java/lang/IO/input-no-prompt.exp
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# Copyright (c) 2024, 2025, 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
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
set prompt [lindex $argv $argc-1]
|
||||
set stty_init "rows 24 cols 80"
|
||||
set timeout -1
|
||||
|
||||
spawn {*}$argv
|
||||
send "hello\r"
|
||||
expect eof
|
||||
38
test/jdk/java/lang/IO/input.exp
Normal file
38
test/jdk/java/lang/IO/input.exp
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
#
|
||||
# Copyright (c) 2024, 2025, 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
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
set prompt [lindex $argv $argc-1]
|
||||
set stty_init "rows 24 cols 80"
|
||||
set timeout -1
|
||||
|
||||
spawn {*}$argv
|
||||
expect {
|
||||
-exact "$prompt" {
|
||||
send "hello\r"
|
||||
}
|
||||
timeout {
|
||||
puts "timeout"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
expect eof
|
||||
43
test/jdk/java/lang/IO/output.exp
Normal file
43
test/jdk/java/lang/IO/output.exp
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#
|
||||
# Copyright (c) 2024, 2025, 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
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
# This script doesn't verify any output strings, it's only used to simulate tty
|
||||
|
||||
set stty_init "rows 24 cols 80"
|
||||
set timeout -1
|
||||
|
||||
# Use `-noecho` below, otherwise, expect will output the expanded "spawn ..."
|
||||
# command, which will interfere with asserting output from the java test
|
||||
# counterpart
|
||||
|
||||
spawn -noecho {*}$argv
|
||||
|
||||
expect {
|
||||
eof {
|
||||
exit 0
|
||||
}
|
||||
timeout {
|
||||
puts "timeout"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue