Skip to content

Commit

Permalink
- Implemented request #26158/bug #53465 (open arbitrary file descript…
Browse files Browse the repository at this point in the history
…or with fopen)
  • Loading branch information
cataphract committed Dec 11, 2010
1 parent 9864040 commit 3c8c56f
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
. Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0
values). (Felipe)

- Streams
. Implemented FR #26158 (open arbitrary file descriptor with fopen)

09 Dec 2010, PHP 5.3.4
- Upgraded bundled Sqlite3 to version 3.7.3. (Ilia)
- Upgraded bundled PCRE to version 8.10. (Ilia)
Expand Down
33 changes: 33 additions & 0 deletions ext/standard/php_fopen_wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,39 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
} else {
fd = dup(STDERR_FILENO);
}
} else if (!strncasecmp(path, "fd/", 3)) {
char *start,
*end;
long fildes_ori;
int dtablesize;

start = &path[3];
fildes_ori = strtol(start, &end, 10);
if (end == start || (*end != '\0' && *end != '/')) {
php_stream_wrapper_log_error(wrapper, options TSRMLS_CC,
"php://fd/ stream must be specified in the form php://fd/<orig fd>");
return NULL;
}

#if HAVE_UNISTD_H
dtablesize = getdtablesize();
#else
dtablesize = INT_MAX;
#endif

if (fildes_ori < 0 || fildes_ori >= dtablesize) {
php_stream_wrapper_log_error(wrapper, options TSRMLS_CC,
"The file descriptors must be non-negative numbers smaller than %d", dtablesize);
return NULL;
}

fd = dup(fildes_ori);
if (fd == -1) {
php_stream_wrapper_log_error(wrapper, options TSRMLS_CC,
"Error duping file descriptor %d; possibly it doesn't exist: "
"[%d]: %s", fildes_ori, errno, strerror(errno));
return NULL;
}
} else if (!strncasecmp(path, "filter/", 7)) {
/* Save time/memory when chain isn't specified */
if (strchr(mode, 'r') || strchr(mode, '+')) {
Expand Down

0 comments on commit 3c8c56f

Please sign in to comment.