summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/file.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/ext/standard/file.c b/ext/standard/file.c
index 48709bfb2f..20cf1cda84 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1463,10 +1463,15 @@ PHP_FUNCTION(mkdir)
convert_to_long_ex(arg2);
mode = (mode_t) Z_LVAL_PP(arg2);
+
if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(arg1), NULL, CHECKUID_ALLOW_ONLY_DIR))) {
RETURN_FALSE;
}
+ if (php_check_open_basedir(Z_STRVAL_PP(arg1) TSRMLS_CC)) {
+ RETURN_FALSE;
+ }
+
ret = VCWD_MKDIR(Z_STRVAL_PP(arg1), mode);
if (ret < 0) {
php_error(E_WARNING, "mkdir() failed (%s)", strerror(errno));
@@ -1488,10 +1493,15 @@ PHP_FUNCTION(rmdir)
}
convert_to_string_ex(arg1);
+
if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(arg1), NULL, CHECKUID_ALLOW_FILE_NOT_EXISTS))) {
RETURN_FALSE;
}
+ if (php_check_open_basedir(Z_STRVAL_PP(arg1) TSRMLS_CC)) {
+ RETURN_FALSE;
+ }
+
ret = VCWD_RMDIR(Z_STRVAL_PP(arg1));
if (ret < 0) {
php_error(E_WARNING, "rmdir() failed (%s)", strerror(errno));
@@ -1695,6 +1705,11 @@ PHP_FUNCTION(rename)
if (PG(safe_mode) &&(!php_checkuid(old_name, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
RETURN_FALSE;
}
+
+ if (php_check_open_basedir(old_name TSRMLS_CC)) {
+ RETURN_FALSE;
+ }
+
ret = VCWD_RENAME(old_name, new_name);
if (ret == -1) {
@@ -1722,6 +1737,10 @@ PHP_FUNCTION(unlink)
RETURN_FALSE;
}
+ if (php_check_open_basedir(Z_STRVAL_PP(filename) TSRMLS_CC)) {
+ RETURN_FALSE;
+ }
+
ret = VCWD_UNLINK(Z_STRVAL_PP(filename));
if (ret == -1) {
php_error(E_WARNING, "unlink() failed (%s)", strerror(errno));