@@ -314,7 +314,7 @@ static PHP_METHOD(Zookeeper, getChildren)
314314 (fci .size != 0 ) ? php_zk_node_watcher_marshal : NULL ,
315315 cb_data , & strings );
316316 if (status != ZOK ) {
317- php_cb_data_destroy ( & cb_data );
317+ php_cb_data_remove ( cb_data );
318318 php_zk_throw_exception (status TSRMLS_CC );
319319 return ;
320320 }
@@ -363,40 +363,30 @@ static PHP_METHOD(Zookeeper, get)
363363 status = zoo_exists (i_obj -> zk , path , 0 , & stat );/* I think we don't need zk->watcher any more */
364364
365365 if (status != ZOK ) {
366- php_cb_data_destroy ( & cb_data );
366+ php_cb_data_remove ( cb_data );
367367 php_zk_throw_exception (status TSRMLS_CC );
368368 return ;
369369 }
370- length = stat .dataLength ;
370+
371+ length = (stat .dataLength > 0 )?stat .dataLength :1 ; // At least one byte
371372 } else {
372373 length = max_size ;
373374 }
374375
375- if (length <= 0 ) {/* znode carries a NULL */
376- if (stat_info ) {
377- php_stat_to_array (& stat , stat_info );
378- }
379-
380- php_cb_data_destroy (& cb_data );
381- RETURN_NULL ();
382- }
376+ /* We should not break the procedure here
377+ because if znode carries a NULL,
378+ cb_data will lose it's use */
383379
384380 php_zk_log_info (i_obj -> zk , "path=%s, cb_data=%p" , path , cb_data );
385381
386- buffer = emalloc (length + 1 );
382+ buffer = emalloc (length );
387383 status = zoo_wget (i_obj -> zk , path , (fci .size != 0 ) ? php_zk_node_watcher_marshal : NULL ,
388384 cb_data , buffer , & length , & stat );
389- buffer [length ] = 0 ;
390385
391386 if (status != ZOK ) {
392387 efree (buffer );
393- php_cb_data_destroy ( & cb_data );
388+ php_cb_data_remove ( cb_data );
394389 php_zk_throw_exception (status TSRMLS_CC );
395-
396- /* Indicate data marshalling failure with boolean false so that user can retry */
397- if (status == ZMARSHALLINGERROR ) {
398- RETURN_FALSE ;
399- }
400390 return ;
401391 }
402392
@@ -406,7 +396,6 @@ static PHP_METHOD(Zookeeper, get)
406396
407397 /* Length will be returned as -1 if the znode carries a NULL */
408398 if (length == -1 ) {
409- php_cb_data_destroy (& cb_data );
410399 RETURN_NULL ();
411400 }
412401
@@ -441,7 +430,7 @@ static PHP_METHOD(Zookeeper, exists)
441430 status = zoo_wexists (i_obj -> zk , path , (fci .size != 0 ) ? php_zk_node_watcher_marshal : NULL ,
442431 cb_data , & stat );
443432 if (status != ZOK && status != ZNONODE ) {
444- php_cb_data_destroy ( & cb_data );
433+ php_cb_data_remove ( cb_data );
445434 php_zk_throw_exception (status TSRMLS_CC );
446435 return ;
447436 }
@@ -712,7 +701,7 @@ static PHP_METHOD(Zookeeper, setWatcher)
712701 ZK_METHOD_FETCH_OBJECT ;
713702
714703 if (i_obj -> cb_data ) {
715- zend_hash_index_del ( & i_obj -> callbacks , i_obj -> cb_data -> h );
704+ php_cb_data_remove ( i_obj -> cb_data );
716705 }
717706 cb_data = php_cb_data_new (& i_obj -> callbacks , & fci , & fcc , 0 TSRMLS_CC );
718707 zoo_set_watcher (i_obj -> zk , php_zk_watcher_marshal );
@@ -820,7 +809,7 @@ static void php_zk_close(php_zk_t *i_obj TSRMLS_DC)
820809 // stored in the Zookeeper instance. The destructor of the callbacks hashtable
821810 // (php_cb_data_zv_destroy) already frees the callback data. Below line resulted
822811 // in a double free, which triggers segfaults.
823- //php_cb_data_destroy(& i_obj->cb_data);
812+ php_cb_data_remove ( i_obj -> cb_data );
824813 i_obj -> cb_data = NULL ;
825814 }
826815
@@ -850,8 +839,7 @@ static void php_zk_free_storage(zend_object *obj TSRMLS_DC)
850839static void php_cb_data_zv_destroy (zval * entry )
851840{
852841 if ( Z_TYPE_P (entry ) == IS_PTR ) {
853- php_cb_data_destroy (Z_PTR_P (entry )); // php_cb_data_t
854- efree (Z_PTR_P (entry )); // Allocated by zend_hash_next_index_insert_mem()
842+ php_cb_data_destroy ((php_cb_data_t * )Z_PTR_P (entry )); // php_cb_data_t
855843 }
856844}
857845
@@ -892,7 +880,7 @@ static inline void php_zk_dispatch_one(php_cb_data_t *cb_data, int type, int sta
892880 zval_ptr_dtor (& params [2 ]);
893881
894882 if (cb_data -> oneshot ) {
895- zend_hash_index_del (cb_data -> ht , cb_data -> h );
883+ php_cb_data_remove (cb_data );
896884 }
897885}
898886
@@ -915,7 +903,7 @@ static inline void php_zk_dispatch_one_completion(php_cb_data_t *cb_data, int rc
915903 }
916904
917905 if (cb_data -> oneshot ) {
918- zend_hash_index_del (cb_data -> ht , cb_data -> h );
906+ php_cb_data_remove (cb_data );
919907 }
920908}
921909
0 commit comments