1
0
Fork 0
mirror of https://gitlab.alpinelinux.org/alpine/aports.git synced 2025-07-25 12:15:32 +03:00
aports/community/openjdk8/icedtea-jdk-getmntent-buffer.patch
Natanael Copa 874cfb1fc5 community/openjdk8: increase buffer size for getmntent_r
Java will only use 1024 byte buffer for parsing mounts. Unlike glibc
will musl return error when this is not big enough instead of truncating
it.

We solve it by allocating a much bigger buffer.

ref #9073

We also build without precompiled headers, which does not work eith PIE.
2017-05-30 15:01:15 +00:00

88 lines
2.6 KiB
Diff

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