30
30
import java .io .FileDescriptor ;
31
31
32
32
import org .graalvm .nativeimage .Platform ;
33
- import org .graalvm .nativeimage .StackValue ;
33
+ import org .graalvm .nativeimage .c . struct . SizeOf ;
34
34
import org .graalvm .nativeimage .c .type .CCharPointer ;
35
35
import org .graalvm .nativeimage .c .type .CIntPointer ;
36
36
import org .graalvm .nativeimage .c .type .CTypeConversion ;
@@ -335,15 +335,17 @@ private static String getUserNameOrDir(int uid, boolean name) {
335
335
bufSize = 1024 ;
336
336
}
337
337
338
- /* Retrieve the username and copy it to a String object. */
339
- CCharPointer pwBuf = NullableNativeMemory .malloc (WordFactory .unsigned (bufSize ), NmtCategory .Internal );
340
- if (pwBuf .isNull ()) {
338
+ /* Does not use StackValue because it is not safe to use in virtual threads. */
339
+ UnsignedWord allocSize = WordFactory .unsigned (SizeOf .get (passwdPointer .class ) + SizeOf .get (passwd .class ) + bufSize );
340
+ Pointer alloc = NullableNativeMemory .malloc (allocSize , NmtCategory .Internal );
341
+ if (alloc .isNull ()) {
341
342
return null ;
342
343
}
343
344
344
345
try {
345
- passwd pwent = StackValue .get (passwd .class );
346
- passwdPointer p = StackValue .get (passwdPointer .class );
346
+ passwdPointer p = (passwdPointer ) alloc ;
347
+ passwd pwent = (passwd ) ((Pointer ) p ).add (SizeOf .get (passwdPointer .class ));
348
+ CCharPointer pwBuf = (CCharPointer ) ((Pointer ) pwent ).add (SizeOf .get (passwd .class ));
347
349
int code = Pwd .getpwuid_r (uid , pwent , pwBuf , WordFactory .unsigned (bufSize ), p );
348
350
if (code != 0 ) {
349
351
return null ;
@@ -361,7 +363,7 @@ private static String getUserNameOrDir(int uid, boolean name) {
361
363
362
364
return CTypeConversion .toJavaString (pwName );
363
365
} finally {
364
- NullableNativeMemory .free (pwBuf );
366
+ NullableNativeMemory .free (alloc );
365
367
}
366
368
}
367
369
}
0 commit comments