# Using OnUpdateUTF8String in PHP 6

- Thread: https://externals.io/message/32817
- Original archive: https://news-web.php.net/php.internals/32817
- Started by Christopher Jones on 2007-10-16T20:33:40+00:00
- Messages: 2
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #32817 — Christopher Jones — 2007-10-16T20:33:40+00:00

URL: https://externals.io/message/32817#32817

With thanks to Sara we looked at OnUpdateUTF8String to access a
php.ini value in OCI8 in PHP 6.

One of our engineers sent me a proposed patch for zend_ini.c in PHP6
to allow OnUpdateUTF8String to work as he thought it should.  Any
comments?

Chris

------------

 > The problems I faced when unicode.semantics=On were:
 >
 > 1) Any OnUpdateUTF8String php.ini variable is seen as `NULL` in
 > oci_globals.
 >
 > 2) If the above is resolved, the memory of the variable is wiped out,
 > by the time we come to execution of the script, after module inits.
 >
 > 3) We still convert to UTF-16 when unicode.semantics=Off.

PS. Patch is attached - if it gets through.

-- 
Christopher Jones, Oracle
Email: christopher.jones@oracle.com    Tel:  +1 650 506 8630
Blog:  http://blogs.oracle.com/opal/   Free PHP Book: http://tinyurl.com/f8jad

---

## #32949 — Andrei Zmievski — 2007-10-24T03:25:48+00:00

URL: https://externals.io/message/32817#32949 · In reply to: #32817

Seems fine to me. Sara?

-Andrei
http://10fathoms.org/vu - daily photoblog



>
> With thanks to Sara we looked at OnUpdateUTF8String to access a
> php.ini value in OCI8 in PHP 6.
>
> One of our engineers sent me a proposed patch for zend_ini.c in PHP6
> to allow OnUpdateUTF8String to work as he thought it should.  Any
> comments?
>
> Chris
>
> ------------
>
> > […]
> out,
> > […]
>
> PS. Patch is attached - if it gets through.
>
> -- 
> Christopher Jones, Oracle
> Email: christopher.jones@oracle.com    Tel:  +1 650 506 8630
> Blog:  http://blogs.oracle.com/opal/   Free PHP Book: http:// 
> tinyurl.com/f8jad
> --- zend_ini.c	2007-10-02 11:07:32.000000000 -0700
> +++ zend_ini.c.new	2007-10-16 13:20:03.000000000 -0700
> @@ -640,7 +640,8 @@
>
>  ZEND_API ZEND_INI_MH(OnUpdateUTF8String) /* {{{ */
>  {
> -	UChar **p;
> +	UChar **up;
> +	char **p;
>  	UChar *ustr = NULL;
>  	int32_t ustr_len, capacity;
>  	UErrorCode status = U_ZERO_ERROR;
> @@ -651,30 +652,37 @@
>
>  	base = (char *) ts_resource(*((int *) mh_arg2));
>  #endif
> +	/* Convert only if unicode semantics is on. Otherwise, same as  
> OnUpdateString */
> +	if (UG(unicode)){
> +		/* estimate capacity */
> +		capacity = (new_value_length > 2) ? ((new_value_length >> 1) +  
> (new_value_length >> 3) + 2) : new_value_length;
> +
> +		while (1) {
> +			ustr = peurealloc(ustr, capacity+1, 1);
> +			u_strFromUTF8(ustr, capacity+1, &ustr_len, new_value,  
> new_value_length, &status);
> +			if (status == U_BUFFER_OVERFLOW_ERROR || status ==  
> U_STRING_NOT_TERMINATED_WARNING) {
> +				capacity = ustr_len;
> +				status = U_ZERO_ERROR;
> +			} else {
> +				break;
> +			}
> +		}
>
> -	/* estimate capacity */
> -	capacity = (new_value_length > 2) ? ((new_value_length >> 1) +  
> (new_value_length >> 3) + 2) : new_value_length;
> -
> -	while (1) {
> -		ustr = eurealloc(ustr, capacity+1);
> -		u_strFromUTF8(ustr, capacity, &ustr_len, new_value,  
> new_value_length, &status);
> -		if (status == U_BUFFER_OVERFLOW_ERROR) {
> -			capacity = ustr_len;
> -			status = U_ZERO_ERROR;
> -		} else {
> -			break;
> +		if (U_FAILURE(status)) {
> +			zend_error(E_WARNING, "Could not convert UTF-8 INI value to  
> Unicode");
> +			efree(ustr);
> +			return FAILURE;
>  		}
> -	}
>
> -	if (U_FAILURE(status)) {
> -		zend_error(E_WARNING, "Could not convert UTF-8 INI value to  
> Unicode");
> -		efree(ustr);
> -		return FAILURE;
> -	}
> +		up = (UChar **) (base+(size_t) mh_arg1);
>
> -	p = (UChar **) (base+(size_t) mh_arg1);
> +		*up = ustr;
> +	}
> +	else {		/* Same as OnUpdateString */
> +		p = (char **) (base+(size_t) mh_arg1);
>
> -	*p = ustr;
> +		*p = new_value;
> +	}
>  	return SUCCESS;
>  }
>  /* }}} */
