From 2ba0f3fae90f2d2c310663e4b39e90f969116241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Draszik?= Date: Tue, 27 Feb 2018 15:59:09 +0000 Subject: [PATCH 2/9] jdk: give a much bigger buffer to getmntent_r() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://bugs.alpinelinux.org/issues/7093 Upstream-Status: Inappropriate [musl specific] Signed-off-by: André Draszik --- .../native/sun/nio/fs/LinuxNativeDispatcher.c | 29 +++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c b/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c index c8500db5..d0b85d67 100644 --- a/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c +++ b/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 -- 2.16.2