]> granicus.if.org Git - php/commitdiff
- I wrote a long msg but the commit didn't go through.
authorZeev Suraski <zeev@php.net>
Sun, 25 Jun 2000 17:02:59 +0000 (17:02 +0000)
committerZeev Suraski <zeev@php.net>
Sun, 25 Jun 2000 17:02:59 +0000 (17:02 +0000)
- So here is the short version:
- a) Start moving to binary opens in Windows
- b) Give checkuid_mode() a small face lift including the fopen-wrappers.c
- The mode to this function should at least be a #define but that is for
- another day. Anyway this whole stuff should be given more face lifts in
- the future.

14 files changed:
ext/db/db.c
ext/dbase/dbase.c
ext/filepro/filepro.c
ext/pgsql/pgsql.c
ext/posix/posix.c
ext/standard/exec.c
ext/standard/file.c
ext/standard/filestat.c
ext/standard/link.c
ext/zlib/zlib.c
main/fopen_wrappers.c
main/main.c
main/safe_mode.c
main/safe_mode.h

index 9efe670a0c86cdc212463c8b2d3a41b3e76dc036..aca8d7ea1fa20a4e55efa4c9f9049fc136358dd0 100644 (file)
@@ -289,7 +289,7 @@ dbm_info *php_dbm_open(char *filename, char *mode) {
                return NULL;
        }
 
-       if (PG(safe_mode) && (!php_checkuid(filename, 2))) {
+       if (PG(safe_mode) && (!php_checkuid(filename, NULL, 2))) {
                return NULL;
        }
 
index 1131d4da9e5433fb3b92d48c699618688c22a698..1149a644f0e6792c9ba74c64a7ef23cdf566adb5 100644 (file)
@@ -120,7 +120,7 @@ PHP_FUNCTION(dbase_open) {
        convert_to_string(dbf_name);
        convert_to_long(options);
 
-       if (PG(safe_mode) && (!php_checkuid(dbf_name->value.str.val, 2))) {
+       if (PG(safe_mode) && (!php_checkuid(dbf_name->value.str.val, NULL, 2))) {
                RETURN_FALSE;
        }
        
@@ -583,7 +583,7 @@ PHP_FUNCTION(dbase_create) {
                RETURN_FALSE;
        }
 
-       if (PG(safe_mode) && (!php_checkuid(Z_STRVAL_P(filename), 2))) {
+       if (PG(safe_mode) && (!php_checkuid(Z_STRVAL_P(filename), NULL, 2))) {
                RETURN_FALSE;
        }
        
index 9a7436b6da7217e7591e2d12a2c4bc4bb87af410..4d0a943f0d0b2e6a3237b5e56e230015e8a86c9a 100644 (file)
@@ -203,7 +203,7 @@ PHP_FUNCTION(filepro)
        
        sprintf(workbuf, "%s/map", dir->value.str.val);
 
-       if (PG(safe_mode) && (!php_checkuid(workbuf, 2))) {
+       if (PG(safe_mode) && (!php_checkuid(workbuf, NULL, 2))) {
                RETURN_FALSE;
        }
        
@@ -302,7 +302,7 @@ PHP_FUNCTION(filepro_rowcount)
        /* Now read the records in, moving forward recsize-1 bytes each time */
        sprintf(workbuf, "%s/key", FP_GLOBAL(fp_database));
 
-       if (PG(safe_mode) && (!php_checkuid(workbuf, 2))) {
+       if (PG(safe_mode) && (!php_checkuid(workbuf, NULL, 2))) {
                RETURN_FALSE;
        }
        
@@ -527,7 +527,7 @@ PHP_FUNCTION(filepro_retrieve)
        /* Now read the record in */
        sprintf(workbuf, "%s/key", FP_GLOBAL(fp_database));
 
-       if (PG(safe_mode) && (!php_checkuid(workbuf, 2))) {
+       if (PG(safe_mode) && (!php_checkuid(workbuf, NULL, 2))) {
                RETURN_FALSE;
        }
        
index 9390349deb5e7539eb5178ffb57c58b159b3b622..81caec5eb1c320b43eb0526942aeafc517896af1 100644 (file)
@@ -1539,7 +1539,7 @@ PHP_FUNCTION(pg_loimport)
                        break;
        }
        
-       if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(file_in), 2))) {
+       if (PG(safe_mode) &&(!php_checkuid(Z_STRVAL_PP(file_in), NULL, 2))) {
                RETURN_FALSE;
        }
 
index 9a3bbdedf28a8ef89e0655baf265aa0a76186961..34be8820f1d33e2895d798c650b6a55847332225 100644 (file)
@@ -603,7 +603,7 @@ PHP_FUNCTION(posix_mkfifo)
        convert_to_string(path);
        convert_to_long(mode);
 
-       if (php3_ini.safe_mode && (!php_checkuid(path->value.str.val, 3))) {
+       if (php3_ini.safe_mode && (!php_checkuid(path->value.str.val, NULL, 3))) {
                RETURN_FALSE;
        }
        result = mkfifo(path->value.str.val, mode->value.lval);
index 7fc6acc033430c7657476e3efd6c13abe2529b17..61bc6f21ce12959630d7543c50441c229f80c39a 100644 (file)
@@ -86,11 +86,7 @@ static int _Exec(int type, char *cmd, pval *array, pval *return_value)
                tmp = php_escape_shell_cmd(d);
                efree(d);
                d = tmp;
-#ifdef PHP_WIN32
                fp = V_POPEN(d, "rb");
-#else
-               fp = V_POPEN(d, "r");
-#endif
                if (!fp) {
                        php_error(E_WARNING, "Unable to fork [%s]", d);
                        efree(d);
@@ -98,11 +94,7 @@ static int _Exec(int type, char *cmd, pval *array, pval *return_value)
                        return -1;
                }
        } else { /* not safe_mode */
-#ifdef PHP_WIN32
                fp = V_POPEN(cmd, "rb");
-#else
-               fp = V_POPEN(cmd, "r");
-#endif
                if (!fp) {
                        php_error(E_WARNING, "Unable to fork [%s]", cmd);
                        efree(buf);
index c9911f10d67cb7076b239bad1f2d1857a5468b00..c93426028de6f1815027665d014a6dca41af7935 100644 (file)
@@ -1344,7 +1344,7 @@ PHP_FUNCTION(mkdir)
        convert_to_string_ex(arg1);
        convert_to_long_ex(arg2);
        mode = (*arg2)->value.lval;
-       if (PG(safe_mode) &&(!php_checkuid((*arg1)->value.str.val,3))) {
+       if (PG(safe_mode) &&(!php_checkuid((*arg1)->value.str.val, NULL, 3))) {
                RETURN_FALSE;
        }
        ret = V_MKDIR((*arg1)->value.str.val,mode);
@@ -1369,7 +1369,7 @@ PHP_FUNCTION(rmdir)
                WRONG_PARAM_COUNT;
        }
        convert_to_string_ex(arg1);
-       if (PG(safe_mode) &&(!php_checkuid((*arg1)->value.str.val,1))) {
+       if (PG(safe_mode) &&(!php_checkuid((*arg1)->value.str.val, NULL, 1))) {
                RETURN_FALSE;
        }
        ret = rmdir((*arg1)->value.str.val);
@@ -1563,7 +1563,7 @@ PHP_FUNCTION(rename)
        old_name = (*old_arg)->value.str.val;
        new_name = (*new_arg)->value.str.val;
 
-       if (PG(safe_mode) &&(!php_checkuid(old_name, 2))) {
+       if (PG(safe_mode) &&(!php_checkuid(old_name, NULL, 2))) {
                RETURN_FALSE;
        }
        ret = rename(old_name, new_name);
@@ -1669,7 +1669,7 @@ PHP_FUNCTION(copy)
        convert_to_string_ex(source);
        convert_to_string_ex(target);
 
-       if (PG(safe_mode) &&(!php_checkuid((*source)->value.str.val,2))) {
+       if (PG(safe_mode) &&(!php_checkuid((*source)->value.str.val, NULL, 2))) {
                RETURN_FALSE;
        }
        
index ca7670af416169c8f6ce5ce9e8f1bbb18f23e47e..a82a05ed3fc31925ad23ab703fee2b719ee7bbea 100644 (file)
@@ -252,7 +252,7 @@ PHP_FUNCTION(chgrp)
                gid = (*group)->value.lval;
        }
 
-       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val,1))) {
+       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) {
                RETURN_FALSE;
        }
 
@@ -300,7 +300,7 @@ PHP_FUNCTION(chown)
                uid = (*user)->value.lval;
        }
 
-       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val,1))) {
+       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) {
                RETURN_FALSE;
        }
 
@@ -333,7 +333,7 @@ PHP_FUNCTION(chmod)
        convert_to_string_ex(filename);
        convert_to_long_ex(mode);
 
-       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val,1))) {
+       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) {
                RETURN_FALSE;
        }
 
@@ -396,7 +396,7 @@ PHP_FUNCTION(touch)
        }
        convert_to_string_ex(filename);
 
-       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val,1))) {
+       if (PG(safe_mode) &&(!php_checkuid((*filename)->value.str.val, NULL, 1))) {
                if (newtime) efree(newtime);
                RETURN_FALSE;
        }
index dbec5e087b3de71eeebf0ed960fa1bde68450291..18cd67c1dc7243d2ea94f0da25bc15e223451808 100644 (file)
@@ -110,7 +110,7 @@ PHP_FUNCTION(symlink)
        convert_to_string_ex(topath);
        convert_to_string_ex(frompath);
 
-       if (PG(safe_mode) && !php_checkuid((*topath)->value.str.val, 2)) {
+       if (PG(safe_mode) && !php_checkuid((*topath)->value.str.val, NULL, 2)) {
                RETURN_FALSE;
        }
        if (!strncasecmp((*topath)->value.str.val,"http://",7) || !strncasecmp((*topath)->value.str.val,"ftp://",6)) {
@@ -141,7 +141,7 @@ PHP_FUNCTION(link)
        convert_to_string_ex(topath);
        convert_to_string_ex(frompath);
 
-       if (PG(safe_mode) && !php_checkuid((*topath)->value.str.val, 2)) {
+       if (PG(safe_mode) && !php_checkuid((*topath)->value.str.val, NULL, 2)) {
                RETURN_FALSE;
        }
        if (!strncasecmp((*topath)->value.str.val,"http://",7) || !strncasecmp((*topath)->value.str.val,"ftp://",6)) {
@@ -171,7 +171,7 @@ PHP_FUNCTION(unlink)
        }
        convert_to_string_ex(filename);
 
-       if (PG(safe_mode) && !php_checkuid((*filename)->value.str.val, 2)) {
+       if (PG(safe_mode) && !php_checkuid((*filename)->value.str.val, NULL, 2)) {
                RETURN_FALSE;
        }
 
index c3d8c29ce7dc5ba48542cc24e280066f40159b2e..35758ce7021d4b1a0e768e785061b18310859e7a 100644 (file)
@@ -160,7 +160,7 @@ static gzFile php_gzopen_wrapper(char *path, char *mode, int options)
                return php_gzopen_with_path(path, mode, PG(include_path), NULL);
        }
        else {
-               if (options & ENFORCE_SAFE_MODE && PG(safe_mode) && (!php_checkuid(path,1))) {
+               if (options & ENFORCE_SAFE_MODE && PG(safe_mode) && (!php_checkuid(path, NULL, 1))) {
                        return NULL;
                }
                if (php_check_open_basedir(path)) return NULL;
@@ -186,7 +186,7 @@ static gzFile *php_gzopen_with_path(char *filename, char *mode, char *path, char
        
        /* Relative path open */
        if (*filename == '.') {
-               if (PG(safe_mode) &&(!php_checkuid(filename,2))) {
+               if (PG(safe_mode) &&(!php_checkuid(filename, NULL, 2))) {
                        return(NULL);
                }
                if (php_check_open_basedir(filename)) return NULL;
@@ -209,7 +209,7 @@ static gzFile *php_gzopen_with_path(char *filename, char *mode, char *path, char
                        } else {
                                strlcpy(trypath,filename,sizeof(trypath));
                        }
-                       if (!php_checkuid(trypath,2)) {
+                       if (!php_checkuid(trypath, NULL, 2)) {
                                return(NULL);
                        }
                        if (php_check_open_basedir(trypath)) return NULL;
@@ -225,7 +225,7 @@ static gzFile *php_gzopen_with_path(char *filename, char *mode, char *path, char
        }
 
        if (!path || (path && !*path)) {
-               if (PG(safe_mode) &&(!php_checkuid(filename,2))) {
+               if (PG(safe_mode) &&(!php_checkuid(filename, NULL, 2))) {
                        return(NULL);
                }
                if (php_check_open_basedir(filename)) return NULL;
@@ -252,7 +252,7 @@ static gzFile *php_gzopen_with_path(char *filename, char *mode, char *path, char
                }
                snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename);
                if (PG(safe_mode)) {
-                       if (V_STAT(trypath,&sb) == 0 &&(!php_checkuid(trypath,2))) {
+                       if (V_STAT(trypath,&sb) == 0 &&(!php_checkuid(trypath, NULL, 2))) {
                                efree(pathbuf);
                                return(NULL);
                        }
index 2f96b16da594e71b2245eae2a718da46bbf99cdf..30cdfaf2920f4b7a1291698c28917e9801074fe2 100644 (file)
@@ -246,7 +246,6 @@ PHPAPI int php_check_open_basedir(char *path)
 
 PHPAPI FILE *php_fopen_wrapper(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path)
 {
-       int cm=2;  /* checkuid mode: 2 = if file does not exist, check directory */
        PLS_FETCH();
 
        if (opened_path) {
@@ -266,10 +265,7 @@ PHPAPI FILE *php_fopen_wrapper(char *path, char *mode, int options, int *issock,
        } else {
                FILE *fp;
 
-               if (!strcmp(mode,"r") || !strcmp(mode,"r+")) {
-                       cm=0;
-               }
-               if (options & ENFORCE_SAFE_MODE && PG(safe_mode) && (!php_checkuid(path, cm))) {
+               if (options & ENFORCE_SAFE_MODE && PG(safe_mode) && (!php_checkuid(path, mode, 0))) {
                        return NULL;
                }
                if (php_check_open_basedir(path)) {
@@ -358,7 +354,7 @@ PHPAPI FILE *php_fopen_primary_script(void)
                SG(request_info).path_translated = NULL;
                return NULL;
        }
-       fp = V_FOPEN(filename, "r");
+       fp = V_FOPEN(filename, "rb");
 
        /* refuse to open anything that is not a regular file */
        if (fp && (0 > fstat(fileno(fp), &st) || !S_ISREG(st.st_mode))) {
@@ -393,17 +389,15 @@ PHPAPI FILE *php_fopen_with_path(char *filename, char *mode, char *path, char **
        char trypath[MAXPATHLEN + 1];
        struct stat sb;
        FILE *fp;
-       int cm=2;
        PLS_FETCH();
 
        if (opened_path) {
                *opened_path = NULL;
        }
 
-       if(!strcmp(mode,"r") || !strcmp(mode,"r+")) cm=0;
        /* Relative path open */
        if (*filename == '.') {
-               if (PG(safe_mode) && (!php_checkuid(filename, cm))) {
+               if (PG(safe_mode) && (!php_checkuid(filename, mode, 0))) {
                        return NULL;
                }
                if (php_check_open_basedir(filename)) return NULL;
@@ -425,7 +419,7 @@ PHPAPI FILE *php_fopen_with_path(char *filename, char *mode, char *path, char **
                        } else {
                                strlcpy(trypath,filename,sizeof(trypath));
                        }
-                       if (!php_checkuid(trypath, cm)) {
+                       if (!php_checkuid(trypath, mode, 0)) {
                                return NULL;
                        }
                        if (php_check_open_basedir(trypath)) return NULL;
@@ -446,7 +440,7 @@ PHPAPI FILE *php_fopen_with_path(char *filename, char *mode, char *path, char **
                }
        }
        if (!path || (path && !*path)) {
-               if (PG(safe_mode) && (!php_checkuid(filename, cm))) {
+               if (PG(safe_mode) && (!php_checkuid(filename, mode, 0))) {
                        return NULL;
                }
                if (php_check_open_basedir(filename)) {
@@ -474,7 +468,7 @@ PHPAPI FILE *php_fopen_with_path(char *filename, char *mode, char *path, char **
                }
                snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename);
                if (PG(safe_mode)) {
-                       if (V_STAT(trypath, &sb) == 0 && (!php_checkuid(trypath, cm))) {
+                       if (V_STAT(trypath, &sb) == 0 && (!php_checkuid(trypath, mode, 0))) {
                                efree(pathbuf);
                                return NULL;
                        }
@@ -1032,9 +1026,7 @@ static FILE *php_fopen_url_wrapper(const char *path, char *mode, int options, in
                if (options & USE_PATH) {
                        fp = php_fopen_with_path((char *) path, mode, PG(include_path), opened_path);
                } else {
-                       int cm=2;
-                       if(!strcmp(mode,"r") || !strcmp(mode,"r+")) cm=0;
-                       if (options & ENFORCE_SAFE_MODE && PG(safe_mode) && (!php_checkuid(path, cm))) {
+                       if (options & ENFORCE_SAFE_MODE && PG(safe_mode) && (!php_checkuid(path, mode, 0))) {
                                fp = NULL;
                        } else {
                                if (php_check_open_basedir((char *) path)) {
index 82abc0c351881f946167daa6bb58ab14a8fb8b7b..99f89c5f6f2662e6eec55ae62c2dd293da86963a 100644 (file)
@@ -493,11 +493,11 @@ static FILE *php_fopen_wrapper_for_zend(const char *filename, char **opened_path
        FILE *retval;
        
        old_chunk_size = php_sock_set_def_chunk_size(1);
-       retval=php_fopen_wrapper((char *) filename, "r", USE_PATH|IGNORE_URL_WIN, &issock, &socketd, opened_path);
+       retval=php_fopen_wrapper((char *) filename, "rb", USE_PATH|IGNORE_URL_WIN, &issock, &socketd, opened_path);
        php_sock_set_def_chunk_size(old_chunk_size);
        
        if (issock) {
-               retval = fdopen(socketd, "r");
+               retval = fdopen(socketd, "rb");
        }
        return retval;
 }
index e7bb879362f8e65e0c2817824530a2c9a3eb0e64..f545f4d4a817277340a21ad8022687727be5bb24 100644 (file)
@@ -40,7 +40,7 @@
  * 2 - if file does not exist, check directory
  * 3 - only check directory (needed for mkdir)
  */
-PHPAPI int php_checkuid(const char *fn, int mode) {
+PHPAPI int php_checkuid(const char *fn, char *fopen_mode, int mode) {
        struct stat sb;
        int ret;
        long uid=0L, duid=0L;
@@ -48,6 +48,14 @@ PHPAPI int php_checkuid(const char *fn, int mode) {
 
        if (!fn) return(0); /* path must be provided */
 
+       if (fopen_mode) {
+               if (fopen_mode[0] == 'r') {
+                       mode = 0;
+               } else {
+                       mode = 2;
+               }
+       }
+
        /* 
         * If given filepath is a URL, allow - safe mode stuff
         * related to URL's is checked in individual functions
index 8fba1db8c5fe78befbabb69414770e38ff541f64..c765a6e37d3366d0130f8715928fbb80f47f8f38 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _SAFE_MODE_H_
 #define _SAFE_MODE_H_
 
-extern PHPAPI int php_checkuid(const char *filename, int mode);
+extern PHPAPI int php_checkuid(const char *filename, char *fopen_mode, int mode);
 extern PHPAPI char *php_get_current_user(void);
 
 #endif