I prefer (2) or (3).
(3) requires less changes.

#define S_DUPLICATE     (1<<0)
#define S_AUTO_FREE (1<<1)

#define ZVAL_U_STRINGL(conv, z, s, l, flags) \
        if (UG(unicode)) { \
                UErrorCode status = U_ZERO_ERROR; \
                UChar *u_str; \
                int u_len; \
                zend_convert_to_unicode(conv, &u_str, &u_len, s, l,
&status); \
                ZVAL_UNICODEL(z, u_str, u_len, 0); \
                if (flags & S_AUTO_FREE) {efree(s);} \
        } else { \
                char *__s=(s); int __l=l;       \
                Z_STRLEN_P(z) = __l;        \
                Z_STRVAL_P(z) = ((flags & S_DUPLICATE)?estrndup(__s,
__l):__s);      \
                Z_TYPE_P(z) = IS_STRING;    \
        }

And then we need to change only calls those rally leak.

RETURN_RT_STRING(str, 1) -> RETURN_RT_STRING(str, S_DUPLICATE | S_AUTO_FREE)

Thanks. Dmitry.

> -----Original Message-----
> From: Sara Golemon [mailto:[EMAIL PROTECTED] 
> Sent: Monday, April 03, 2006 10:15 PM
> To: "Dmitry Stogov"
> Cc: internals@lists.php.net
> Subject: Re: [PHP-DEV] RETURN_RT_STRING() and family leakage
> 
> 
> >> duplicate should only ever be set to 0 on this (or any of the
> >> macros) when
> >> the string *is* allocated with emalloc.  Otherwise the 
> enegine would 
> >> get in trouble freeing it later on.
> >
> > No. :(
> > You can use ZVAL_RT_STRING(&fname, "strlen", 0), then call
> > zend_call_function(&fname) and do not destroy fname.
> >
> Doi, of course, good point...
> 
> Okay, then the options are:
> 
> (1) Assume auto_free for RETURN_RT_STRING(s,0) specifically 
> as in this case, 
> my statement above is valid since the engine IS going to try 
> it eventually. 
> Leave all other macros alone and make the calling scope 
> handle the original 
> string with the existing if (UG(unicode)) efree(s);   Not my favorite.
> 
> (2) Expand (ZVAL|RETVAL)_RT_STRING(s, 0) to include auto_free 
> argument. 
> This coule be done in conjunction with (1) or in place of it.
> 
> (3) Overload duplicate argument to include (should I 
> auto-free?) logic.
> 
> (4) Duplicate the macros to one auto-free, and one 
> non-auto-free version.
> 
> I like the #1/#2 combo personally.
> 
> -Sara 
> 
> 
> 

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to