Re: com php-src: that's not char * but zend_string *: Zend/zend.c Zend/zend_string.c
| From: | Anatol Belski | Date: | Mon, 06 Oct 2014 07:18:16 +0000 |
| Subject: | Re: com php-src: that's not char * but zend_string *: Zend/zend.c Zend/zend_string.c | ||
| References: | 1 2 | Groups: | php.cvs php.internals |
| Request: | Send a blank email to php-cvs+get-82160@lists.php.net to get a copy of this message | ||
Hi Nikita,
On Sun, October 5, 2014 23:18, Nikita Popov wrote:
> On Thu, Sep 18, 2014 at 5:14 PM, Anatol Belski <ab@php.net> wrote:
>
>
>> Commit: 761e347b7526b18b9901ebf3d906b52a21fc9c4b
>> Author: Anatol Belski <ab@php.net> Thu, 18 Sep 2014 17:11:48
>> +0200
>> Parents: fb848ebd005624f95b7d019eccb660f43aeb571c
>> Branches: master
>>
>>
>> Link:
>>
>> http://git.php.net/?p=php-src.git;a=commitdiff;h=761e347b7526b18b9901ebf‡NXd—ö'Ò‚Çn?
>> ³
>> 3d906b52a21fc9c4b
>>
>>
>> Log:
>> that's not char * but zend_string *
>>
>> Changed paths:
>> M Zend/zend.c
>> M Zend/zend_string.c
>>
>>
>>
>> Diff:
>> diff --git a/Zend/zend.c b/Zend/zend.c index b646ec2..07171bd 100644 ---
>> a/Zend/zend.c +++ b/Zend/zend.c
>> @@ -549,7 +549,7 @@ static void
>> compiler_globals_dtor(zend_compiler_globals *compiler_globals TSRMLS
>> compiler_globals->last_static_member = 0;
>>
>> #ifdef ZTS
>> - free(compiler_globals->empty_string);
>> + zend_string_release(compiler_globals->empty_string);
>> #endif
>> }
>> /* }}} */
>> diff --git a/Zend/zend_string.c b/Zend/zend_string.c index
>> a9148f2..a4455e8 100644 --- a/Zend/zend_string.c
>> +++ b/Zend/zend_string.c
>> @@ -80,7 +80,7 @@ void zend_interned_strings_dtor(TSRMLS_D)
>> #ifndef ZTS
>> zend_hash_destroy(&CG(interned_strings)); #else
>> - free(CG(empty_string));
>> + zend_string_release(CG(empty_string));
>> #endif
>> }
>>
>>
>
> The free() was correct - this is an interned string, so
> zend_string_release will do nothing to it. Furthermore you probably also
> have to destroy the empty_string initialized by the interned string ctor
> when you overwrite it. At least right now valgrind spews out dozens of
> leakages of the empty string.
>
> Nikita
>
>
I was actually looking for that leaks, but after checking Zend I've just
two valgrind errors
Zend/tests/bug34137.phpt
Zend/tests/bug34260.phpt
which are related to something completely else (some invalid read).
Now it has done a half of ext/standard, but still no leaks. So better I
just ask before waiting half a day for the tests finish - which test
should I take to reproduce this?
I remember why I've done this also. The place in zend_string.c is actually
less relevant as it's free'd on module shutdown anyway, but the other one
in globals ctor - it can lead to crashes in other dtor callbacks when it's
free'd to early (primarily in TS build). And at the end, it probably would
use free(), no?
Regards
Anatol