@@ -1667,29 +1667,36 @@ zval *php_snmp_read_property(zend_object *object, zend_string *name, int type, v
16671667}
16681668/* }}} */
16691669
1670- /* {{{ php_snmp_write_property(zval *object, zval *member, zval *value[, const zend_literal *key])
1671- Generic object property writer */
1670+ /* {{{ Generic object property writer */
16721671zval * php_snmp_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
16731672{
1674- php_snmp_object * obj ;
1675- php_snmp_prop_handler * hnd ;
1673+ php_snmp_object * obj = php_snmp_fetch_object ( object ) ;
1674+ php_snmp_prop_handler * hnd = zend_hash_find_ptr ( & php_snmp_properties , name ) ;
16761675
1677- obj = php_snmp_fetch_object (object );
1678- hnd = zend_hash_find_ptr (& php_snmp_properties , name );
1676+ if (hnd ) {
1677+ if (!hnd -> write_func ) {
1678+ zend_throw_error (NULL , "Cannot write read-only property %s::$%s" , ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
1679+ return & EG (error_zval );
1680+ }
16791681
1680- if (hnd && hnd -> write_func ) {
1681- hnd -> write_func (obj , value );
1682- /*
1683- if (!PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) == 0) {
1684- Z_ADDREF_P(value);
1685- zval_ptr_dtor(&value);
1682+ zend_property_info * prop = zend_get_property_info (object -> ce , name , /* silent */ true);
1683+ if (prop && ZEND_TYPE_IS_SET (prop -> type )) {
1684+ zval tmp ;
1685+ ZVAL_COPY (& tmp , value );
1686+ if (!zend_verify_property_type (prop , & tmp ,
1687+ ZEND_CALL_USES_STRICT_TYPES (EG (current_execute_data )))) {
1688+ zval_ptr_dtor (& tmp );
1689+ return & EG (error_zval );
1690+ }
1691+ hnd -> write_func (obj , & tmp );
1692+ zval_ptr_dtor (& tmp );
1693+ } else {
1694+ hnd -> write_func (obj , value );
16861695 }
1687- */
1688- } else {
1689- value = zend_std_write_property (object , name , value , cache_slot );
1696+ return value ;
16901697 }
16911698
1692- return value ;
1699+ return zend_std_write_property ( object , name , value , cache_slot ) ;
16931700}
16941701/* }}} */
16951702
@@ -1762,6 +1769,16 @@ static HashTable *php_snmp_get_properties(zend_object *object)
17621769}
17631770/* }}} */
17641771
1772+ static zval * php_snmp_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot )
1773+ {
1774+ php_snmp_prop_handler * hnd = zend_hash_find_ptr (& php_snmp_properties , name );
1775+ if (hnd == NULL ) {
1776+ return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
1777+ }
1778+
1779+ return NULL ;
1780+ }
1781+
17651782/* {{{ */
17661783static int php_snmp_read_info (php_snmp_object * snmp_object , zval * retval )
17671784{
@@ -1820,14 +1837,6 @@ PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(valueretrieval)
18201837PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (oid_output_format )
18211838PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (exceptions_enabled )
18221839
1823- /* {{{ */
1824- static int php_snmp_write_info (php_snmp_object * snmp_object , zval * newval )
1825- {
1826- zend_throw_error (NULL , "SNMP::$info property is read-only" );
1827- return FAILURE ;
1828- }
1829- /* }}} */
1830-
18311840/* {{{ */
18321841static int php_snmp_write_max_oids (php_snmp_object * snmp_object , zval * newval )
18331842{
@@ -1841,7 +1850,7 @@ static int php_snmp_write_max_oids(php_snmp_object *snmp_object, zval *newval)
18411850 lval = zval_get_long (newval );
18421851
18431852 if (lval <= 0 ) {
1844- zend_value_error ("max_oids must be greater than 0 or null" );
1853+ zend_value_error ("SNMP::$ max_oids must be greater than 0 or null" );
18451854 return FAILURE ;
18461855 }
18471856 snmp_object -> max_oids = lval ;
@@ -1924,8 +1933,11 @@ static void free_php_snmp_properties(zval *el) /* {{{ */
19241933#define PHP_SNMP_PROPERTY_ENTRY_RECORD (name ) \
19251934 { "" #name "", sizeof("" #name "") - 1, php_snmp_read_##name, php_snmp_write_##name }
19261935
1936+ #define PHP_SNMP_READONLY_PROPERTY_ENTRY_RECORD (name ) \
1937+ { "" #name "", sizeof("" #name "") - 1, php_snmp_read_##name, NULL }
1938+
19271939const php_snmp_prop_handler php_snmp_property_entries [] = {
1928- PHP_SNMP_PROPERTY_ENTRY_RECORD (info ),
1940+ PHP_SNMP_READONLY_PROPERTY_ENTRY_RECORD (info ),
19291941 PHP_SNMP_PROPERTY_ENTRY_RECORD (max_oids ),
19301942 PHP_SNMP_PROPERTY_ENTRY_RECORD (valueretrieval ),
19311943 PHP_SNMP_PROPERTY_ENTRY_RECORD (quick_print ),
@@ -1961,6 +1973,7 @@ PHP_MINIT_FUNCTION(snmp)
19611973 memcpy (& php_snmp_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
19621974 php_snmp_object_handlers .read_property = php_snmp_read_property ;
19631975 php_snmp_object_handlers .write_property = php_snmp_write_property ;
1976+ php_snmp_object_handlers .get_property_ptr_ptr = php_snmp_get_property_ptr_ptr ;
19641977 php_snmp_object_handlers .has_property = php_snmp_has_property ;
19651978 php_snmp_object_handlers .get_properties = php_snmp_get_properties ;
19661979 php_snmp_object_handlers .get_gc = php_snmp_get_gc ;
0 commit comments