[paketler-commits] r28289 - 2007/programming/languages/php/php/files
paketler-commits at pardus.org.tr
paketler-commits at pardus.org.tr
25 Haz 2007 Pzt 11:53:38 EEST
Author: cartman
Date: Mon Jun 25 11:53:38 2007
New Revision: 28289
Modified:
2007/programming/languages/php/php/files/glob-basedir-bypass.patch
Log:
merge changes to basedir bypass via glob
Modified: 2007/programming/languages/php/php/files/glob-basedir-bypass.patch
=================================================================
--- 2007/programming/languages/php/php/files/glob-basedir-bypass.patch (original)
+++ 2007/programming/languages/php/php/files/glob-basedir-bypass.patch Mon Jun 25 11:53:38 2007
@@ -59,3 +59,76 @@
}
array_init(return_value);
+--- ext/standard/dir.c 2007/02/24 17:16:23 1.147.2.3.2.4
++++ ext/standard/dir.c 2007/06/25 08:40:20 1.147.2.3.2.8
+@@ -24,6 +24,7 @@
+ #include "fopen_wrappers.h"
+ #include "file.h"
+ #include "php_dir.h"
++#include "php_string.h"
+ #include "php_scandir.h"
+
+ #ifdef HAVE_DIRENT_H
+@@ -361,9 +362,9 @@
+ Find pathnames matching a pattern */
+ PHP_FUNCTION(glob)
+ {
+- char cwd[MAXPATHLEN];
+ int cwd_skip = 0;
+ #ifdef ZTS
++ char cwd[MAXPATHLEN];
+ char work_pattern[MAXPATHLEN];
+ char *result;
+ #endif
+@@ -395,6 +396,22 @@
+ }
+ #endif
+
++ if (PG(safe_mode) || (PG(open_basedir) && *PG(open_basedir))) {
++ int pattern_len = strlen(pattern);
++ char *basename = estrndup(pattern, pattern_len);
++
++ php_dirname(basename, pattern_len);
++ if (PG(safe_mode) && (!php_checkuid(basename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
++ efree(basename);
++ RETURN_FALSE;
++ }
++ if (php_check_open_basedir(basename TSRMLS_CC)) {
++ efree(basename);
++ RETURN_FALSE;
++ }
++ efree(basename);
++ }
++
+ globbuf.gl_offs = 0;
+ if (0 != (ret = glob(pattern, flags & GLOB_FLAGMASK, NULL, &globbuf))) {
+ #ifdef GLOB_NOMATCH
+@@ -420,16 +437,6 @@
+ return;
+ }
+
+- /* we assume that any glob pattern will match files from one directory only
+- so checking the dirname of the first match should be sufficient */
+- strlcpy(cwd, globbuf.gl_pathv[0], MAXPATHLEN);
+- if (PG(safe_mode) && (!php_checkuid(cwd, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
+- RETURN_FALSE;
+- }
+- if (php_check_open_basedir(cwd TSRMLS_CC)) {
+- RETURN_FALSE;
+- }
+-
+ array_init(return_value);
+ for (n = 0; n < globbuf.gl_pathc; n++) {
+ /* we need to do this everytime since GLOB_ONLYDIR does not guarantee that
+@@ -473,6 +480,11 @@
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr", &dirn, &dirn_len, &flags, &zcontext) == FAILURE) {
+ return;
++ }
++
++ if (dirn_len < 1) {
++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Directory name cannot be empty");
++ RETURN_FALSE;
+ }
+
+ if (zcontext) {
Paketler-commits mesaj listesiyle ilgili
daha fazla bilgi