You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2010/09/22 16:49:05 UTC
svn commit: r1000005 - in
/harmony/enhanced/java/trunk/classlib/modules/luni/src: main/java/java/io/
main/native/luni/shared/ main/native/luni/unix/ main/native/luni/windows/
test/api/common/org/apache/harmony/luni/tests/java/io/
Author: tellison
Date: Wed Sep 22 14:49:04 2010
New Revision: 1000005
URL: http://svn.apache.org/viewvc?rev=1000005&view=rev
Log:
Apply patch for HARMONY-6642 ([classlib][luni] FileInputStream doesn't close FD in native code)
Modified:
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileDescriptor.java
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileInputStream.java
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileOutputStream.java
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/shared/filedesc.c
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/exports.txt
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.c
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.h
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.c
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.h
harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/io/FileInputStreamTest.java
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileDescriptor.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileDescriptor.java?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileDescriptor.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileDescriptor.java Wed Sep 22 14:49:04 2010
@@ -62,10 +62,16 @@ public final class FileDescriptor {
private static native void oneTimeInitialization();
+ private static native long getStdInDescriptor();
+
+ private static native long getStdOutDescriptor();
+
+ private static native long getStdErrDescriptor();
+
static {
- in.descriptor = 0;
- out.descriptor = 1;
- err.descriptor = 2;
+ in.descriptor = getStdInDescriptor();
+ out.descriptor = getStdOutDescriptor();
+ err.descriptor = getStdErrDescriptor();
oneTimeInitialization();
}
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileInputStream.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileInputStream.java?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileInputStream.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileInputStream.java Wed Sep 22 14:49:04 2010
@@ -45,8 +45,6 @@ public class FileInputStream extends Inp
// initialized).
private FileChannel channel;
- boolean innerFD;
-
private IFileSystem fileSystem = Platform.getFileSystem();
private static class RepositioningLock {
@@ -81,7 +79,6 @@ public class FileInputStream extends Inp
fd.readOnly = true;
fd.descriptor = fileSystem.open(file.properPath(true),
IFileSystem.O_RDONLY);
- innerFD = true;
channel = FileChannelFactory.getFileChannel(this, fd.descriptor,
IFileSystem.O_RDONLY);
}
@@ -109,7 +106,6 @@ public class FileInputStream extends Inp
security.checkRead(fd);
}
this.fd = fd;
- innerFD = false;
channel = FileChannelFactory.getFileChannel(this, fd.descriptor,
IFileSystem.O_RDONLY);
}
@@ -173,7 +169,7 @@ public class FileInputStream extends Inp
}
}
synchronized (this) {
- if (fd.descriptor >= 0 && innerFD) {
+ if (fd.descriptor >= 0) {
fileSystem.close(fd.descriptor);
fd.descriptor = -1;
}
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileOutputStream.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileOutputStream.java?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileOutputStream.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/java/io/FileOutputStream.java Wed Sep 22 14:49:04 2010
@@ -42,8 +42,6 @@ public class FileOutputStream extends Ou
*/
FileDescriptor fd;
- boolean innerFD;
-
// The unique file channel associated with this FileInputStream (lazily
// initialized).
private FileChannel channel;
@@ -94,7 +92,6 @@ public class FileOutputStream extends Ou
fd = new FileDescriptor();
fd.descriptor = fileSystem.open(file.properPath(true),
append ? IFileSystem.O_APPEND : IFileSystem.O_WRONLY);
- innerFD = true;
channel = FileChannelFactory.getFileChannel(this, fd.descriptor,
append ? IFileSystem.O_APPEND : IFileSystem.O_WRONLY);
}
@@ -123,7 +120,6 @@ public class FileOutputStream extends Ou
security.checkWrite(fd);
}
this.fd = fd;
- innerFD = false;
channel = FileChannelFactory.getFileChannel(this, fd.descriptor,
IFileSystem.O_WRONLY);
}
@@ -190,7 +186,7 @@ public class FileOutputStream extends Ou
}
synchronized (this) {
- if (fd.descriptor >= 0 && innerFD) {
+ if (fd.descriptor >= 0) {
fileSystem.close(fd.descriptor);
fd.descriptor = -1;
}
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/shared/filedesc.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/shared/filedesc.c?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/shared/filedesc.c (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/shared/filedesc.c Wed Sep 22 14:49:04 2010
@@ -19,6 +19,7 @@
#include "nethelp.h"
#include "exceptions.h"
#include "harmonyglob.h"
+#include "helpers.h"
JNIEXPORT void JNICALL
Java_java_io_FileDescriptor_syncImpl (JNIEnv * env, jobject recv)
@@ -57,3 +58,21 @@ Java_java_io_FileDescriptor_oneTimeIniti
return;
HARMONY_CACHE_SET (env, FID_java_io_FileDescriptor_descriptor, descriptorFID);
}
+
+JNIEXPORT jlong JNICALL
+Java_java_io_FileDescriptor_getStdInDescriptor (JNIEnv * env, jclass fdClazz)
+{
+ return getPlatformStdInFD();
+}
+
+JNIEXPORT jlong JNICALL
+Java_java_io_FileDescriptor_getStdOutDescriptor (JNIEnv * env, jclass fdClazz)
+{
+ return getPlatformStdOutFD();
+}
+
+JNIEXPORT jlong JNICALL
+Java_java_io_FileDescriptor_getStdErrDescriptor (JNIEnv * env, jclass fdClazz)
+{
+ return getPlatformStdErrFD();
+}
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/exports.txt
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/exports.txt?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/exports.txt (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/exports.txt Wed Sep 22 14:49:04 2010
@@ -42,6 +42,9 @@ Java_java_io_File_renameToImpl
Java_java_io_File_rootsImpl
Java_java_io_File_setLastModifiedImpl
Java_java_io_File_setReadOnlyImpl
+Java_java_io_FileDescriptor_getStdErrDescriptor
+Java_java_io_FileDescriptor_getStdInDescriptor
+Java_java_io_FileDescriptor_getStdOutDescriptor
Java_java_io_FileDescriptor_oneTimeInitialization
Java_java_io_FileDescriptor_syncImpl
Java_java_io_ObjectStreamClass_getConstructorSignature
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.c?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.c (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.c Wed Sep 22 14:49:04 2010
@@ -252,3 +252,13 @@ void getOSCharset(char *locale, const si
}
return;
}
+
+jlong getPlatformStdInFD() {
+ return (jlong)0;
+}
+jlong getPlatformStdOutFD() {
+ return (jlong)1;
+}
+jlong getPlatformStdErrFD() {
+ return (jlong)2;
+}
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.h?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.h (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/unix/helpers.h Wed Sep 22 14:49:04 2010
@@ -35,4 +35,7 @@ I_32 setPlatformLastModified (JNIEnv * e
I_32 setPlatformReadOnly (JNIEnv * env, char *path);
int portCmp (const void **a, const void **b);
void getOSCharset(char *locale, const size_t size);
+jlong getPlatformStdInFD();
+jlong getPlatformStdOutFD();
+jlong getPlatformStdErrFD();
#endif /* helpers_h */
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.c?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.c (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.c Wed Sep 22 14:49:04 2010
@@ -15,6 +15,11 @@
* limitations under the License.
*/
+/* windows.h defined UDATA. Ignore its definition */
+#define UDATA UDATA_win32_
+#include <windows.h>
+#undef UDATA /* this is safe because our UDATA is a typedef, not a macro */
+
/* Undefine the winsockapi because winsock2 defines it. Removes warnings. */
#if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
#undef _WINSOCKAPI_
@@ -446,3 +451,13 @@ void getOSCharset(char *locale, const si
getCharset(cp, locale, size);
return;
}
+
+jlong getPlatformStdInFD() {
+ return (jlong)GetStdHandle(STD_INPUT_HANDLE);
+}
+jlong getPlatformStdOutFD() {
+ return (jlong)GetStdHandle(STD_OUTPUT_HANDLE);
+}
+jlong getPlatformStdErrFD() {
+ return (jlong)GetStdHandle(STD_ERROR_HANDLE);
+}
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.h?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.h (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/main/native/luni/windows/helpers.h Wed Sep 22 14:49:04 2010
@@ -34,4 +34,7 @@ void setPlatformBindOptions (JNIEnv * en
I_32 setPlatformLastModified (JNIEnv * env, char *path, I_64 time);
I_32 setPlatformReadOnly (JNIEnv * env, char *path);
void getOSCharset(char *locale, const size_t size);
+jlong getPlatformStdInFD();
+jlong getPlatformStdOutFD();
+jlong getPlatformStdErrFD();
#endif /* helpers_h */
Modified: harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/io/FileInputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/io/FileInputStreamTest.java?rev=1000005&r1=1000004&r2=1000005&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/io/FileInputStreamTest.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/io/FileInputStreamTest.java Wed Sep 22 14:49:04 2010
@@ -18,6 +18,7 @@
package org.apache.harmony.luni.tests.java.io;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@@ -121,6 +122,31 @@ public class FileInputStreamTest extends
} catch (IOException e) {
// Expected
}
+
+ // Regression test for HARMONY-6642
+ FileInputStream fis = new FileInputStream(fileName);
+ FileInputStream fis2 = new FileInputStream(fis.getFD());
+ try {
+ fis2.close();
+ fis.read();
+ fail("Able to read from closed fd");
+ } catch (IOException e) {
+ // Expected
+ } finally {
+ try {
+ fis.close();
+ } catch (IOException e) {}
+ }
+
+ FileInputStream stdin = new FileInputStream(FileDescriptor.in);
+ stdin.close();
+ stdin = new FileInputStream(FileDescriptor.in);
+ try {
+ stdin.read();
+ fail("Able to read from stdin after close");
+ } catch (IOException e) {
+ // Expected
+ }
}
/**