From: Wez Furlong Date: Mon, 19 May 2003 22:55:56 +0000 (+0000) Subject: Fix persistent stream recycling within the same request. X-Git-Tag: BEFORE_FD_REVERT~23 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9efa05b7c7d8393afac5aba787a8dc1ac97936db;p=php Fix persistent stream recycling within the same request. function foo() { $s = pfsockopen("localhost", "80"); var_dump($s); } foo(); foo(); --- diff --git a/main/streams.c b/main/streams.c index 2cb7380b6f..585716bae6 100755 --- a/main/streams.c +++ b/main/streams.c @@ -136,16 +136,14 @@ PHP_RSHUTDOWN_FUNCTION(streams) PHPAPI int php_stream_from_persistent_id(const char *persistent_id, php_stream **stream TSRMLS_DC) { - list_entry *le; + zend_rsrc_list_entry *le; if (zend_hash_find(&EG(persistent_list), (char*)persistent_id, strlen(persistent_id)+1, (void*) &le) == SUCCESS) { if (Z_TYPE_P(le) == le_pstream) { if (stream) { *stream = (php_stream*)le->ptr; - if ((*stream)->rsrc_id == FAILURE) { - /* first access this request; give it a valid id */ - (*stream)->rsrc_id = ZEND_REGISTER_RESOURCE(NULL, *stream, le_pstream); - } + le->refcount++; + (*stream)->rsrc_id = ZEND_REGISTER_RESOURCE(NULL, *stream, le_pstream); } return PHP_STREAM_PERSISTENT_SUCCESS; } @@ -242,14 +240,15 @@ fprintf(stderr, "stream_alloc: %s:%p persistent=%s\n", ops->label, ret, persiste ret->flags |= PHP_STREAM_FLAG_DETECT_EOL; if (persistent_id) { - list_entry le; + zend_rsrc_list_entry le; Z_TYPE(le) = le_pstream; le.ptr = ret; + le.refcount = 0; if (FAILURE == zend_hash_update(&EG(persistent_list), (char *)persistent_id, strlen(persistent_id) + 1, - (void *)&le, sizeof(list_entry), NULL)) { + (void *)&le, sizeof(le), NULL)) { pefree(ret, 1); return NULL;