Give a much bigger buffer to getmntent_r. https://bugs.alpinelinux.org/issues/7093 diff --git a/openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c b/openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c index c8500db..d0b85d6 100644 --- openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c +++ openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "sun_nio_fs_LinuxNativeDispatcher.h" @@ -173,8 +174,8 @@ Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this, jlong value, jobject entry) { struct mntent ent; - char buf[1024]; - int buflen = sizeof(buf); + char *buf = NULL; + const size_t buflen = PATH_MAX * 4; struct mntent* m; FILE* fp = jlong_to_ptr(value); jsize len; @@ -183,10 +184,17 @@ Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this, char* dir; char* fstype; char* options; + jint res = -1; - m = getmntent_r(fp, &ent, (char*)&buf, buflen); - if (m == NULL) + buf = malloc(buflen); + if (buf == NULL) { + JNU_ThrowOutOfMemoryError(env, "native heap"); return -1; + } + m = getmntent_r(fp, &ent, buf, buflen); + if (m == NULL) + goto out; + name = m->mnt_fsname; dir = m->mnt_dir; fstype = m->mnt_type; @@ -195,32 +203,35 @@ Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this, len = strlen(name); bytes = (*env)->NewByteArray(env, len); if (bytes == NULL) - return -1; + goto out; (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)name); (*env)->SetObjectField(env, entry, entry_name, bytes); len = strlen(dir); bytes = (*env)->NewByteArray(env, len); if (bytes == NULL) - return -1; + goto out; (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)dir); (*env)->SetObjectField(env, entry, entry_dir, bytes); len = strlen(fstype); bytes = (*env)->NewByteArray(env, len); if (bytes == NULL) - return -1; + goto out; (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)fstype); (*env)->SetObjectField(env, entry, entry_fstype, bytes); len = strlen(options); bytes = (*env)->NewByteArray(env, len); if (bytes == NULL) - return -1; + goto out; (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)options); (*env)->SetObjectField(env, entry, entry_options, bytes); - return 0; + res = 0; +out: + free(buf); + return res; } JNIEXPORT void JNICALL