diff options
author | Arnaud Le Blanc <lbarnaud@php.net> | 2008-08-11 15:30:44 +0000 |
---|---|---|
committer | Arnaud Le Blanc <lbarnaud@php.net> | 2008-08-11 15:30:44 +0000 |
commit | de24949cce44c870139d35833c51b50a73e71231 (patch) | |
tree | 10d47929cbc91161814eb08d922743056d2d4398 /ext/standard/link.c | |
parent | ba7cfd2fa77a1bddd6d4363d95fe2fa70b4c60d3 (diff) | |
download | php-git-de24949cce44c870139d35833c51b50a73e71231.tar.gz |
MFH: Check the relevant path for open_basedir in symlink()
Diffstat (limited to 'ext/standard/link.c')
-rw-r--r-- | ext/standard/link.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/ext/standard/link.c b/ext/standard/link.c index 0c50586422..8ea64eb5c8 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -49,6 +49,7 @@ #include "safe_mode.h" #include "php_link.h" +#include "php_string.h" /* {{{ proto string readlink(string filename) Return the target of a symbolic link */ @@ -116,12 +117,22 @@ PHP_FUNCTION(symlink) int ret; char source_p[MAXPATHLEN]; char dest_p[MAXPATHLEN]; + char dirname[MAXPATHLEN]; + size_t len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &topath, &topath_len, &frompath, &frompath_len) == FAILURE) { return; } + + if (!expand_filepath(frompath, source_p TSRMLS_CC)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory"); + RETURN_FALSE; + } - if (!expand_filepath(frompath, source_p TSRMLS_CC) || !expand_filepath(topath, dest_p TSRMLS_CC)) { + memcpy(dirname, source_p, sizeof(source_p)); + len = php_dirname(dirname, strlen(dirname)); + + if (!expand_filepath_ex(topath, dest_p, dirname, len TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory"); RETURN_FALSE; } |