diff options
author | Anthony Green <green@redhat.com> | 2000-09-04 20:57:18 +0000 |
---|---|---|
committer | Anthony Green <green@gcc.gnu.org> | 2000-09-04 20:57:18 +0000 |
commit | a1fa0b27e7d6ce96e3c903527787ddbeeeaebaf6 (patch) | |
tree | 3bd8341880b59044142121b372b25da9d563a293 /libjava/java | |
parent | 40255aaf54176fdcecc8199876b94cfe38f7cc44 (diff) | |
download | gcc-a1fa0b27e7d6ce96e3c903527787ddbeeeaebaf6.zip gcc-a1fa0b27e7d6ce96e3c903527787ddbeeeaebaf6.tar.gz gcc-a1fa0b27e7d6ce96e3c903527787ddbeeeaebaf6.tar.bz2 |
re GNATS java.io/203 (File.createTempFile doesn't close descriptor)
Fix for PR java.io/203:
* java/io/File.java (createTempFile): Obey directory argument.
Use java.io.tmpdir if needed. Don't leave FileDescripators open.
* java/lang/natSystem.cc (init_properties): Use TMPDIR environment
variable to set java.io.tmpdir on non-WIN32 systems.
From-SVN: r36143
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/io/File.java | 55 | ||||
-rw-r--r-- | libjava/java/lang/natSystem.cc | 6 |
2 files changed, 45 insertions, 16 deletions
diff --git a/libjava/java/io/File.java b/libjava/java/io/File.java index 9043660..01d8d53 100644 --- a/libjava/java/io/File.java +++ b/libjava/java/io/File.java @@ -233,14 +233,26 @@ public class File implements Serializable File directory) throws IOException { - FileDescriptor desc = new FileDescriptor (); - - SecurityManager s = System.getSecurityManager(); - if (s != null) - s.checkWrite (desc); + // Grab the system temp directory if necessary + if (directory == null) + { + String dirname = tmpdir; + if (dirname == null) + throw + new IOException("Cannot determine system temporary directory"); + + directory = new File(dirname); + if (!directory.exists()) + throw new IOException("System temporary directory " + + directory.getName() + " does not exist."); + if (!directory.isDirectory()) + throw new IOException("System temporary directory " + + directory.getName() + + " is not really a directory."); + } if (prefix.length () < 3) - throw new IllegalArgumentException (); + throw new IllegalArgumentException ("Prefix too short: " + prefix); if (suffix == null) suffix = ".tmp"; @@ -259,8 +271,8 @@ public class File implements Serializable prefix = prefix.substring(0, max_length - 6 - suf_len); } - // We don't care about the name because we set it later. - File ret = new File (""); + File f; + // How many times should we try? We choose 100. for (int i = 0; i < 100; ++i) { @@ -269,18 +281,33 @@ public class File implements Serializable String l = prefix + t.substring(t.length() - 6) + suffix; try { - desc = new FileDescriptor - (l, FileDescriptor.WRITE | FileDescriptor.EXCL); - desc.close (); - ret.setPath(l); - return ret; + f = new File(directory, l); + if (f.exists()) + continue; + else + { + String af = f.getAbsolutePath (); + + // Check to see if we're allowed to write to it. + SecurityManager s = System.getSecurityManager(); + if (s != null) + s.checkWrite (af); + + // Now create the file. + FileDescriptor fd = + new FileDescriptor (af, + FileDescriptor.WRITE + | FileDescriptor.EXCL); + fd.close (); + return f; + } } catch (IOException _) { } } - throw new IOException ("couldn't make temp file"); + throw new IOException ("cannot create temporary file"); } public static File createTempFile (String prefix, String suffix) diff --git a/libjava/java/lang/natSystem.cc b/libjava/java/lang/natSystem.cc index 2672895..39deab2 100644 --- a/libjava/java/lang/natSystem.cc +++ b/libjava/java/lang/natSystem.cc @@ -244,8 +244,10 @@ java::lang::System::init_properties (void) SET ("file.separator", "/"); SET ("path.separator", ":"); SET ("line.separator", "\n"); - // FIXME: look at getenv("TMPDIR"); - SET ("java.io.tmpdir", "/tmp"); + char *tmpdir = ::getenv("TMPDIR"); + if (! tmpdir) + tmpdir = "/tmp"; + SET ("java.io.tmpdir", tmpdir); #endif #ifdef HAVE_UNAME |