--- old/make/mapfiles/libnio/mapfile-linux 2019-10-21 12:37:41.000000000 +0300 +++ new/make/mapfiles/libnio/mapfile-linux 2019-10-21 12:37:41.000000000 +0300 @@ -153,8 +153,9 @@ Java_sun_nio_fs_LinuxNativeDispatcher_fsetxattr0; Java_sun_nio_fs_LinuxNativeDispatcher_fremovexattr0; Java_sun_nio_fs_LinuxNativeDispatcher_setmntent0; - Java_sun_nio_fs_LinuxNativeDispatcher_getmntent; + Java_sun_nio_fs_LinuxNativeDispatcher_getmntent0; Java_sun_nio_fs_LinuxNativeDispatcher_endmntent; + Java_sun_nio_fs_LinuxNativeDispatcher_getlinelen; Java_sun_nio_fs_UnixNativeDispatcher_init; Java_sun_nio_fs_UnixNativeDispatcher_getcwd; Java_sun_nio_fs_UnixNativeDispatcher_strerror; @@ -176,6 +177,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_close; Java_sun_nio_fs_UnixNativeDispatcher_read; Java_sun_nio_fs_UnixNativeDispatcher_write; + Java_sun_nio_fs_UnixNativeDispatcher_rewind; Java_sun_nio_fs_UnixNativeDispatcher_fopen0; Java_sun_nio_fs_UnixNativeDispatcher_fclose; Java_sun_nio_fs_UnixNativeDispatcher_opendir0; --- old/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java 2019-10-21 12:37:42.000000000 +0300 +++ new/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java 2019-10-21 12:37:42.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -79,10 +79,26 @@ ArrayList entries = new ArrayList<>(); try { long fp = setmntent(Util.toBytes(fstab), Util.toBytes("r")); + int maxLineSize = 1024; + try { + for (;;) { + int lineSize = getlinelen(fp); + if (lineSize == -1) + break; + if (lineSize > maxLineSize) + maxLineSize = lineSize; + } + } catch (UnixException x) { + // nothing we need to do + } finally { + rewind(fp); + } + try { for (;;) { UnixMountEntry entry = new UnixMountEntry(); - int res = getmntent(fp, entry); + // count in NUL character at the end + int res = getmntent(fp, entry, maxLineSize + 1); if (res < 0) break; entries.add(entry); --- old/src/solaris/classes/sun/nio/fs/LinuxNativeDispatcher.java 2019-10-21 12:37:42.000000000 +0300 +++ new/src/solaris/classes/sun/nio/fs/LinuxNativeDispatcher.java 2019-10-21 12:37:42.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,17 @@ /** * int getmntent(FILE *fp, struct mnttab *mp, int len); */ - static native int getmntent(long fp, UnixMountEntry entry) + + static int getmntent(long fp, UnixMountEntry entry, int buflen) throws UnixException { + NativeBuffer buffer = NativeBuffers.getNativeBuffer(buflen); + try { + return getmntent0(fp, entry, buffer.address(), buflen); + } finally { + buffer.release(); + } + } + + static native int getmntent0(long fp, UnixMountEntry entry, long buffer, int bufLen) throws UnixException; /** @@ -63,6 +73,11 @@ static native void endmntent(long stream) throws UnixException; /** + * ssize_t getline(char **lineptr, size_t *n, FILE *stream); + */ + static native int getlinelen(long stream) throws UnixException; + + /** * ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size); */ static int fgetxattr(int filedes, byte[] name, long valueAddress, --- old/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java 2019-10-21 12:37:43.000000000 +0300 +++ new/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java 2019-10-21 12:37:43.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,6 +117,11 @@ static native void fclose(long stream) throws UnixException; /** + * void rewind(FILE* stream); + */ + static native void rewind(long stream) throws UnixException; + + /** * link(const char* existing, const char* new) */ static void link(UnixPath existing, UnixPath newfile) throws UnixException { --- old/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c 2019-10-21 12:37:44.000000000 +0300 +++ new/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c 2019-10-21 12:37:44.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -169,12 +169,11 @@ } JNIEXPORT jint JNICALL -Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this, - jlong value, jobject entry) +Java_sun_nio_fs_LinuxNativeDispatcher_getmntent0(JNIEnv* env, jclass this, + jlong value, jobject entry, jlong buffer, jint bufLen) { struct mntent ent; - char buf[1024]; - int buflen = sizeof(buf); + char * buf = (char*)jlong_to_ptr(buffer); struct mntent* m; FILE* fp = jlong_to_ptr(value); jsize len; @@ -184,7 +183,7 @@ char* fstype; char* options; - m = getmntent_r(fp, &ent, (char*)&buf, buflen); + m = getmntent_r(fp, &ent, buf, (int)bufLen); if (m == NULL) return -1; name = m->mnt_fsname; @@ -230,3 +229,35 @@ /* FIXME - man page doesn't explain how errors are returned */ endmntent(fp); } + +/** + * This function returns line length without NUL terminator or -1 on EOF. + */ +JNIEXPORT jint JNICALL +Java_sun_nio_fs_LinuxNativeDispatcher_getlinelen(JNIEnv* env, jclass this, jlong stream) +{ + FILE* fp = jlong_to_ptr(stream); + size_t lineSize = 0; + char * lineBuffer = NULL; + int saved_errno; + + ssize_t res = getline(&lineBuffer, &lineSize, fp); + saved_errno = errno; + + /* Should free lineBuffer no matter result, according to man page */ + if (lineBuffer != NULL) + free(lineBuffer); + + if (feof(fp)) + return -1; + + /* On successfull return res >= 0, otherwise res is -1 */ + if (res == -1) + throwUnixException(env, saved_errno); + + if (res > INT_MAX) + throwUnixException(env, EOVERFLOW); + + return (jint)res; +} + --- old/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c 2019-10-21 12:37:44.000000000 +0300 +++ new/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c 2019-10-21 12:37:44.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -367,6 +367,20 @@ } } +JNIEXPORT void JNICALL +Java_sun_nio_fs_UnixNativeDispatcher_rewind(JNIEnv* env, jclass this, jlong stream) +{ + FILE* fp = jlong_to_ptr(stream); + int saved_errno; + + errno = 0; + rewind(fp); + saved_errno = errno; + if (ferror(fp)) { + throwUnixException(env, saved_errno); + } +} + JNIEXPORT jint JNICALL Java_sun_nio_fs_UnixNativeDispatcher_open0(JNIEnv* env, jclass this, jlong pathAddress, jint oflags, jint mode)