Re: com php-src: Temporary fixed the invalid read warning: Zend/zend_string.h
| From: | Laruence | Date: | Mon, 14 Jul 2014 10:36:54 +0000 |
| Subject: | Re: com php-src: Temporary fixed the invalid read warning: Zend/zend_string.h | ||
| References: | 1 2 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-79458@lists.php.net to get a copy of this message | ||
Hey:
On Mon, Jul 14, 2014 at 6:13 PM, Nikita Popov <nikita.ppv@gmail.com> wrote:
> On Mon, Jul 14, 2014 at 8:01 AM, Xinchen Hui <laruence@php.net> wrote:
>>
>> Commit: b7ff8f28b279b19d48af5f8c991d0ab93c5476b3
>> Author: Xinchen Hui <laruence@php.net> Mon, 14 Jul 2014
>> 12:31:55 +0800
>> Parents: 6c8db864e047271fed082562a183e141b40c130e
>> Branches: phpng
>>
>> Link:
>>
>> http://git.php.net/?p=php-src.git;a=commitdiff;h=b7ff8f28b279b19d48af5f8c991d0ab93c5476b3
>>
>> Log:
>> Temporary fixed the invalid read warning
>>
>> Changed paths:
>> M Zend/zend_string.h
>>
>>
>> Diff:
>> diff --git a/Zend/zend_string.h b/Zend/zend_string.h
>> index 5a9b0e7..e1780d7 100644
>> --- a/Zend/zend_string.h
>> +++ b/Zend/zend_string.h
>> @@ -57,7 +57,7 @@ END_EXTERN_C()
>> #define _STR_HEADER_SIZE XtOffsetOf(zend_string, val)
>>
>> #define STR_ALLOCA_ALLOC(str, _len, use_heap) do { \
>> - (str) = (zend_string *)do_alloca(_STR_HEADER_SIZE + (_len) + 1,
>> (use_heap)); \
>> + (str) = (zend_string
>> *)do_alloca(ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + (_len) + 1),
>> (use_heap)); \
>> GC_REFCOUNT(str) = 1; \
>> (str)->h = 0; \
>> (str)->len = (_len); \
>> @@ -109,7 +109,7 @@ static zend_always_inline zend_uint
>> zend_str_delref(zend_string *s)
>>
>> static zend_always_inline zend_string *zend_str_alloc(int len, int
>> persistent)
>> {
>> - zend_string *ret = (zend_string *)pemalloc(_STR_HEADER_SIZE + len
>> + 1, persistent);
>> + zend_string *ret = (zend_string
>> *)pemalloc(ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + len + 1), persistent);
>>
>> GC_REFCOUNT(ret) = 1;
>> #if 1
>> @@ -127,7 +127,7 @@ static zend_always_inline zend_string
>> *zend_str_alloc(int len, int persistent)
>>
>> static zend_always_inline zend_string *zend_str_safe_alloc(size_t n,
>> size_t m, size_t l, int persistent)
>> {
>> - zend_string *ret = (zend_string *)safe_pemalloc(n, m,
>> _STR_HEADER_SIZE + l + 1, persistent);
>> + zend_string *ret = (zend_string *)safe_pemalloc(n, m,
>> ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + l + 1), persistent);
>>
>> GC_REFCOUNT(ret) = 1;
>> #if 1
>> @@ -177,7 +177,7 @@ static zend_always_inline zend_string
>> *zend_str_realloc(zend_string *s, int len,
>> ret = STR_ALLOC(len, persistent);
>> memcpy(ret->val, s->val, (len > s->len ? s->len : len) +
>> 1);
>> } else if (EXPECTED(STR_REFCOUNT(s) == 1)) {
>> - ret = (zend_string *)perealloc(s, _STR_HEADER_SIZE + len +
>> 1, persistent);
>> + ret = (zend_string *)perealloc(s,
>> ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + len + 1), persistent);
>> ret->len = len;
>> STR_FORGET_HASH_VAL(ret);
>> } else {
>> @@ -196,7 +196,7 @@ static zend_always_inline zend_string
>> *zend_str_safe_realloc(zend_string *s, siz
>> ret = STR_SAFE_ALLOC(n, m, l, persistent);
>> memcpy(ret->val, s->val, ((n * m) + l > s->len ? s->len :
>> ((n * m) + l)) + 1);
>> } else if (STR_REFCOUNT(s) == 1) {
>> - ret = (zend_string *)safe_perealloc(s, n, m,
>> _STR_HEADER_SIZE + l + 1, persistent);
>> + ret = (zend_string *)safe_perealloc(s, n, m,
>> ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + l + 1), persistent);
>> ret->len = (n * m) + l;
>> STR_FORGET_HASH_VAL(ret);
>> } else {
>
>
> Hey Xinchen!
>
> I didn't catch you on IRC after our last conversation, so now saying it
> here: I wasn't able to reproduce the issue on Ubuntu x86-64 with GCC 4.6.
> You mentioned that you're using GCC 4.1, so it's likely that this
> optimization was removed in newer versions, as it is unsafe for the struct
probably.
> hack usage. Anyway, I think solving it this way is okay, especially as it
> won't make a difference if the Zend MM is used.
okey, :)
thanks
>
> Thanks,
> Nikita
--
Laruence Xinchen Hui
http://www.laruence.com/