Author: wade
Date: 2006-10-05 16:18:07 -0400 (Thu, 05 Oct 2006)
New Revision: 66314
Modified:
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/ChangeLog
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/CodeCompiler.cs
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/TempFileCollection.cs
Log:
Merge 65441 from HEAD:
svn merge -r 65440:65441 $MSVN/trunk/mcs .
* TempFileCollection.cs: Create files in a temporary subdirectory,
for security reasons.
* CodeCompiler.cs: Let TempFileCollection choose the temp dir.
Modified:
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/ChangeLog
===================================================================
--- branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/ChangeLog
2006-10-05 20:04:52 UTC (rev 66313)
+++ branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/ChangeLog
2006-10-05 20:18:07 UTC (rev 66314)
@@ -1,3 +1,9 @@
+2006-09-15 LLuis Sanchez Gual <[EMAIL PROTECTED]>
+
+ * TempFileCollection.cs: Create files in a temporary subdirectory,
+ for security reasons.
+ * CodeCompiler.cs: Let TempFileCollection choose the temp dir.
+
2006-05-04 LLuis Sanchez Gual <[EMAIL PROTECTED]>
* TempFileCollection.cs: Make sure generated file names
Modified:
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/CodeCompiler.cs
===================================================================
---
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/CodeCompiler.cs
2006-10-05 20:04:52 UTC (rev 66313)
+++
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/CodeCompiler.cs
2006-10-05 20:18:07 UTC (rev 66314)
@@ -128,7 +128,7 @@
if (null == fileNames)
throw new ArgumentNullException ("fileNames");
- options.TempFiles = new TempFileCollection
(Path.GetTempPath ());
+ options.TempFiles = new TempFileCollection ();
foreach (string file in fileNames) {
options.TempFiles.AddFile (file, keepFiles);
}
Modified:
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/TempFileCollection.cs
===================================================================
---
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/TempFileCollection.cs
2006-10-05 20:04:52 UTC (rev 66313)
+++
branches/mono-1-1-17/mcs/class/System/System.CodeDom.Compiler/TempFileCollection.cs
2006-10-05 20:18:07 UTC (rev 66314)
@@ -31,6 +31,7 @@
using System.IO;
using System.Security;
using System.Security.Permissions;
+using System.Runtime.InteropServices;
namespace System.CodeDom.Compiler {
@@ -45,6 +46,7 @@
bool keepfiles;
string basepath;
Random rnd;
+ string ownTempDir;
public TempFileCollection ()
: this (String.Empty, false)
@@ -67,16 +69,15 @@
{
get {
if(basepath==null) {
+
+ if (rnd == null)
+ rnd = new Random ();
+
// note: this property *cannot* change
TempDir property
string temp = tempdir;
- if (temp.Length == 0) {
- // this call ensure the
Environment permissions check
- temp = Path.GetTempPath ();
- }
+ if (temp.Length == 0)
+ temp = GetOwnTempDir ();
- if (rnd == null)
- rnd = new Random ();
-
// Create a temporary file at the
target directory. This ensures
// that the generated file name is
unique.
FileStream f = null;
@@ -111,7 +112,33 @@
return(basepath);
}
}
+
+ string GetOwnTempDir ()
+ {
+ if (ownTempDir != null)
+ return ownTempDir;
+ // this call ensure the Environment permissions check
+ string basedir = Path.GetTempPath ();
+
+ // Create a subdirectory with the correct user
permissions
+ int res = -1;
+ do {
+ int num = rnd.Next ();
+ num++;
+ ownTempDir = Path.Combine (basedir,
num.ToString("x"));
+ if (Directory.Exists (ownTempDir))
+ continue;
+ res = mkdir (ownTempDir, 0x1c0);
+ if (res != 0) {
+ if (!Directory.Exists (ownTempDir))
+ throw new IOException ();
+ // Somebody already created the dir,
keep trying
+ }
+ } while (res != 0);
+ return ownTempDir;
+ }
+
int ICollection.Count {
get {
return filehash.Count;
@@ -190,19 +217,26 @@
public void Delete()
{
- string[] filenames=new string[filehash.Count];
- filehash.Keys.CopyTo(filenames, 0);
+ bool allDeleted = true;
+ string[] filenames = new string[filehash.Count];
+ filehash.Keys.CopyTo (filenames, 0);
foreach(string file in filenames) {
if((bool)filehash[file]==false) {
File.Delete(file);
filehash.Remove(file);
- }
+ } else
+ allDeleted = false;
}
if (basepath != null) {
string tmpFile = basepath + ".tmp";
File.Delete (tmpFile);
+ basepath = null;
}
+ if (allDeleted && ownTempDir != null) {
+ Directory.Delete (ownTempDir, true);
+ ownTempDir = null;
+ }
}
IEnumerator IEnumerable.GetEnumerator ()
@@ -228,5 +262,6 @@
Dispose(false);
}
+ [DllImport ("libc")] private static extern int mkdir (string
olpath, uint mode);
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches