From 852a25f0fb1f1c72b72f68b1f02504909f3f45d9 Mon Sep 17 00:00:00 2001
From: Florian Schaal <florian@schaal-24.de>
Date: Wed, 12 Mar 2014 13:23:14 +0100
Subject: [PATCH] changed function check_free_space

---
 server/lib/classes/system.inc.php | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php
index 65fa54baa5..adf7535b76 100644
--- a/server/lib/classes/system.inc.php
+++ b/server/lib/classes/system.inc.php
@@ -917,13 +917,11 @@ class system{
 	 * This function checks the free space for a given directory
 	 * @param path check path
 	 * @param limit min. free space in bytes
-	 * @return bool - true when the the free space is above limit ohterwise false
+	 * @return bool - true when the the free space is above limit ohterwise false, opt. available disk-space
 	*/
 
-	function check_free_space($path, $limit = 0) {
+	function check_free_space($path, $limit = 0, &$free_space = 0) {
 		$path = rtrim($path, '/');
-		$parts = explode('/', $path);
-        $out = '';
 
 		/**
 		* Make sure that we have only existing directories in the path.
@@ -931,19 +929,16 @@ class system{
 		* Given a file name instead of a directory, the behaviour of the disk_free_space
 		function is unspecified and may differ between operating systems and PHP versions.
         */
-		for ($i = 1; $i < count($parts); $i++) {
-			if ( !is_file($out.'/'.$parts[$i]) && is_dir($out.'/'.$parts[$i]) ) {
-				$out .= '/'.$parts[$i];
-			}
-		}
-
-		unset($parts);
+		while(!is_dir($path) && $path != '/') $path = realpath(dirname($path));
 
-		$res = disk_free_space($out);
+		$free_space = disk_free_space($out);
 
-		if (!$res) return false;
+		if (!$free_space) {
+			$free_space = 0;
+			return false;
+		}
 
-		if ($res >= $limit) {
+		if ($free_space >= $limit) {
 			return true;
 		} else {
 			return false;
-- 
GitLab