diff options
Diffstat (limited to 'user/openjdk8/icedtea-jdk-getmntent-buffer.patch')
-rw-r--r-- | user/openjdk8/icedtea-jdk-getmntent-buffer.patch | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/user/openjdk8/icedtea-jdk-getmntent-buffer.patch b/user/openjdk8/icedtea-jdk-getmntent-buffer.patch new file mode 100644 index 000000000..075a9d423 --- /dev/null +++ b/user/openjdk8/icedtea-jdk-getmntent-buffer.patch @@ -0,0 +1,88 @@ +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 <dlfcn.h> + #include <errno.h> + #include <mntent.h> ++#include <limits.h> + + #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 |