Browse Source

MFB context refcounting and text-mode fopen fixes

migration/unlabaled-1.3.2
Wez Furlong 23 years ago
parent
commit
2d1a6e5dc2
  1. 4
      ext/standard/file.c
  2. 8
      ext/standard/streamsfuncs.c
  3. 6
      main/streams/plain_wrapper.c
  4. 23
      main/streams/streams.c

4
ext/standard/file.c

@ -693,7 +693,9 @@ PHP_NAMED_FUNCTION(php_if_fopen)
php_stream_to_zval(stream, return_value);
return;
if (zcontext) {
zend_list_addref(Z_RESVAL_P(zcontext));
}
}
/* }}} */

8
ext/standard/streamsfuncs.c

@ -123,6 +123,10 @@ PHP_FUNCTION(stream_socket_client)
}
php_stream_to_zval(stream, return_value);
if (zcontext) {
zend_list_addref(Z_RESVAL_P(zcontext));
}
}
/* }}} */
@ -185,6 +189,9 @@ PHP_FUNCTION(stream_socket_server)
php_stream_to_zval(stream, return_value);
if (zcontext) {
zend_list_addref(Z_RESVAL_P(zcontext));
}
}
/* }}} */
@ -752,7 +759,6 @@ PHP_FUNCTION(stream_context_set_option)
/* handle the array syntax */
RETVAL_BOOL(parse_context_options(context, options) == SUCCESS);
} else {
ZVAL_ADDREF(zvalue);
php_stream_context_set_option(context, wrappername, optionname, zvalue);
RETVAL_TRUE;
}

6
main/streams/plain_wrapper.c

@ -74,7 +74,11 @@ PHPAPI int php_stream_parse_fopen_modes(const char *mode, int *open_flags)
flags |= O_BINARY;
}
#endif
#ifdef _O_TEXT
if (strchr(mode, 't')) {
flags |= _O_TEXT;
}
#endif
*open_flags = flags;
return SUCCESS;
}

23
main/streams/streams.c

@ -53,6 +53,14 @@ PHPAPI HashTable *php_stream_get_url_stream_wrappers_hash()
return &url_stream_wrappers_hash;
}
static int _php_stream_release_context(list_entry *le, void *pContext TSRMLS_DC)
{
if (le->ptr == pContext) {
return --le->refcount == 0;
}
return 0;
}
static int forget_persistent_resource_id_numbers(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
php_stream *stream;
@ -69,6 +77,13 @@ fprintf(stderr, "forget_persistent: %s:%p\n", stream->ops->label, stream);
stream->rsrc_id = FAILURE;
if (stream->context) {
zend_hash_apply_with_argument(&EG(regular_list),
(apply_func_arg_t) _php_stream_release_context,
stream->context TSRMLS_CC);
stream->context = NULL;
}
return 0;
}
@ -1643,8 +1658,12 @@ PHPAPI int php_stream_context_set_option(php_stream_context *context,
const char *wrappername, const char *optionname, zval *optionvalue)
{
zval **wrapperhash;
zval *category;
zval *category, *copied_val;
ALLOC_INIT_ZVAL(copied_val);
*copied_val = *optionvalue;
zval_copy_ctor(copied_val);
if (FAILURE == zend_hash_find(Z_ARRVAL_P(context->options), (char*)wrappername, strlen(wrappername)+1, (void**)&wrapperhash)) {
MAKE_STD_ZVAL(category);
@ -1656,7 +1675,7 @@ PHPAPI int php_stream_context_set_option(php_stream_context *context,
ZVAL_ADDREF(optionvalue);
wrapperhash = &category;
}
return zend_hash_update(Z_ARRVAL_PP(wrapperhash), (char*)optionname, strlen(optionname)+1, (void**)&optionvalue, sizeof(zval *), NULL);
return zend_hash_update(Z_ARRVAL_PP(wrapperhash), (char*)optionname, strlen(optionname)+1, (void**)&copied_val, sizeof(zval *), NULL);
}
/* }}} */

Loading…
Cancel
Save