[cp-patches] FYI: Merge File.listRoots security checks from libgcj

Gary Benson gbenson at redhat.com
Thu Jun 29 10:02:57 UTC 2006


Hi again,

This commit merges security checks for File.listRoots from libgcj.

Cheers,
Gary
-------------- next part --------------
Index: ChangeLog
===================================================================
RCS file: /cvsroot/classpath/classpath/ChangeLog,v
retrieving revision 1.7966
diff -u -r1.7966 ChangeLog
--- ChangeLog	29 Jun 2006 09:02:49 -0000	1.7966
+++ ChangeLog	29 Jun 2006 09:59:31 -0000
@@ -1,3 +1,7 @@
+2006-06-29  Gary Benson  <gbenson at redhat.com>
+
+	* java/io/File.java (listRoots): Merge security checks from libgcj.
+
 2006-06-29  Gary Benson  <gbenson at redhat.com>
 
 	* java/io/FilePermission.java (implies): Work when path is "/".
Index: java/io/File.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/File.java,v
retrieving revision 1.64
diff -u -r1.64 File.java
--- java/io/File.java	14 Jun 2006 14:47:46 -0000	1.64
+++ java/io/File.java	29 Jun 2006 09:59:31 -0000
@@ -1200,7 +1200,38 @@
    */
   public static File[] listRoots()
   {
-    return VMFile.listRoots();
+    File[] roots = VMFile.listRoots();
+    
+    SecurityManager s = System.getSecurityManager();
+    if (s != null)
+      {
+	// Only return roots to which the security manager permits read access.
+	int count = roots.length;
+	for (int i = 0; i < roots.length; i++)
+	  {
+	    try
+	      {
+        	s.checkRead (roots[i].path);		
+	      }
+	    catch (SecurityException sx)
+	      {
+	        roots[i] = null;
+		count--;
+	      }
+	  }
+	if (count != roots.length)
+	  {
+	    File[] newRoots = new File[count];
+	    int k = 0;
+	    for (int i = 0; i < roots.length; i++)
+	      {
+	        if (roots[i] != null)
+		  newRoots[k++] = roots[i];
+	      }
+	    roots = newRoots;
+	  }
+      }
+    return roots;
   }
 
   /**


More information about the Classpath-patches mailing list