< prev index next >

src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c

Print this page
rev 16220 : 8168628: (fc) SIGBUS when extending file size to map it
Summary: Synchronize file extension and subsequent map0(); on Linux use fallocate64() instead of ftruncate64().
Reviewed-by: rehn, simonis, alanb

*** 1,7 **** /* ! * Copyright (c) 2000, 2012, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2000, 2016, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 184,193 **** --- 184,214 ---- return handle(env, ftruncate64(fdval(env, fdo), size), "Truncation failed"); } + JNIEXPORT jint JNICALL + Java_sun_nio_ch_FileDispatcherImpl_allocate0(JNIEnv *env, jobject this, + jobject fdo, jlong size) + { + #if defined(__linux__) + /* + * On Linux, if the file size is being increased, then ftruncate64() + * will modify the metadata value of the size without actually allocating + * any blocks which can cause a SIGBUS error if the file is subsequently + * memory-mapped. + */ + return handle(env, + fallocate64(fdval(env, fdo), 0, 0, size), + "Allocation failed"); + #else + return handle(env, + ftruncate64(fdval(env, fdo), size), + "Truncation failed"); + #endif + } + JNIEXPORT jlong JNICALL Java_sun_nio_ch_FileDispatcherImpl_size0(JNIEnv *env, jobject this, jobject fdo) { jint fd = fdval(env, fdo); struct stat64 fbuf;
< prev index next >