Skip to content

Commit cfcbc67

Browse files
authored
Make MemfdWriterFFM compatible with early SegmentAllocator jdk implementations (#10602)
Make MemfdWriterFFM compatible with early SegmentAllocator jdk implementations Co-authored-by: andrea.marziali <andrea.marziali@datadoghq.com>
1 parent bbe7e4d commit cfcbc67

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

dd-java-agent/agent-tooling/src/main/java25/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterFFM.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.lang.foreign.SymbolLookup;
1010
import java.lang.foreign.ValueLayout;
1111
import java.lang.invoke.MethodHandle;
12+
import java.nio.charset.StandardCharsets;
1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
1415

@@ -97,8 +98,13 @@ protected long syscall(long number, String name, int flags) {
9798
return -1;
9899
}
99100
try (Arena arena = Arena.ofConfined()) {
100-
// Allocate native string for file name
101-
MemorySegment fileNameSegment = arena.allocateFrom(name);
101+
// Allocate native string for file name (manual allocation for compatibility)
102+
// the following works for UTF8 (not for unicode / UTF16)
103+
byte[] nameBytes = name.getBytes(StandardCharsets.UTF_8);
104+
MemorySegment fileNameSegment =
105+
arena.allocate(nameBytes.length + 1); // +1 for null terminator
106+
MemorySegment.copy(nameBytes, 0, fileNameSegment, ValueLayout.JAVA_BYTE, 0, nameBytes.length);
107+
fileNameSegment.set(ValueLayout.JAVA_BYTE, nameBytes.length, (byte) 0); // null terminator
102108
// Call memfd_create via syscall, passing captureState as first arg
103109
return (long) Lazy.syscallMH.invoke(captureState, (long) number, fileNameSegment, flags);
104110
} catch (Throwable t) {

0 commit comments

Comments
 (0)