Skip to content

Commit f787414

Browse files
committed
8266911: On Windows the system lookup should load ucrtbase if possible
Reviewed-by: mcimadamore
1 parent 669eb87 commit f787414

File tree

3 files changed

+116
-2
lines changed

3 files changed

+116
-2
lines changed

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/SystemLookup.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import jdk.internal.loader.NativeLibraries;
3131
import jdk.internal.loader.NativeLibrary;
3232

33+
import java.nio.file.Files;
3334
import java.nio.file.Path;
3435
import java.util.Objects;
3536
import java.util.Optional;
@@ -46,8 +47,16 @@ private SystemLookup() { }
4647
*/
4748
final NativeLibrary syslookup = switch (CABI.current()) {
4849
case SysV, AArch64 -> NativeLibraries.rawNativeLibraries(SystemLookup.class, false).loadLibrary("syslookup");
49-
case Win64 -> NativeLibraries.rawNativeLibraries(SystemLookup.class, false)
50-
.loadLibrary(null, Path.of(System.getenv("SystemRoot"), "System32", "msvcrt.dll").toFile());
50+
case Win64 -> {
51+
Path system32 = Path.of(System.getenv("SystemRoot"), "System32");
52+
Path ucrtbase = system32.resolve("ucrtbase.dll");
53+
Path msvcrt = system32.resolve("msvcrt.dll");
54+
55+
Path stdLib = Files.exists(ucrtbase) ? ucrtbase : msvcrt;
56+
57+
yield NativeLibraries.rawNativeLibraries(SystemLookup.class, false)
58+
.loadLibrary(null, stdLib.toFile());
59+
}
5160
};
5261

5362
@Override
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
/*
25+
* @test
26+
* @requires ((os.arch == "amd64" | os.arch == "x86_64") & sun.arch.data.model == "64") | os.arch == "aarch64"
27+
* @run testng/othervm --enable-native-access=ALL-UNNAMED TestMixedMallocFree
28+
*/
29+
30+
import jdk.incubator.foreign.CLinker;
31+
import jdk.incubator.foreign.FunctionDescriptor;
32+
import jdk.incubator.foreign.MemoryAccess;
33+
import jdk.incubator.foreign.MemoryAddress;
34+
import jdk.incubator.foreign.MemorySegment;
35+
import jdk.incubator.foreign.ResourceScope;
36+
import jdk.incubator.foreign.SymbolLookup;
37+
import org.testng.annotations.Test;
38+
39+
import java.lang.invoke.MethodHandle;
40+
import java.lang.invoke.MethodType;
41+
42+
import static jdk.incubator.foreign.CLinker.*;
43+
import static org.testng.Assert.assertEquals;
44+
45+
public class TestMixedMallocFree {
46+
47+
static final MethodHandle MH_my_malloc;
48+
49+
static {
50+
System.loadLibrary("Malloc");
51+
SymbolLookup MALLOC = SymbolLookup.loaderLookup();
52+
53+
MH_my_malloc = CLinker.getInstance().downcallHandle(
54+
MALLOC.lookup("my_malloc").orElseThrow(),
55+
MethodType.methodType(MemoryAddress.class, long.class),
56+
FunctionDescriptor.of(C_POINTER, C_LONG_LONG));
57+
}
58+
59+
@Test
60+
public void testMalloc() throws Throwable {
61+
MemoryAddress ma = (MemoryAddress) MH_my_malloc.invokeExact(4L);
62+
MemorySegment seg = ma.asSegment(4L, ResourceScope.newImplicitScope());
63+
MemoryAccess.setInt(seg, 42);
64+
assertEquals(MemoryAccess.getInt(seg), 42);
65+
// Test if this free crashes the VM, which might be the case if we load the wrong default library
66+
// and end up mixing two allocators together.
67+
CLinker.freeMemory(ma);
68+
}
69+
70+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*
23+
*/
24+
25+
#include <stdlib.h>
26+
27+
#ifdef _WIN64
28+
#define EXPORT __declspec(dllexport)
29+
#else
30+
#define EXPORT
31+
#endif
32+
33+
EXPORT void* my_malloc(size_t size) {
34+
return malloc(size);
35+
}

0 commit comments

Comments
 (0)