@@ -1257,10 +1257,8 @@ static zval *zend_ffi_cdata_read_field(zend_object *obj, zend_string *field_name
12571257 type = ZEND_FFI_TYPE (type -> pointer .type );
12581258 }
12591259 if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1260- if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1261- zend_throw_error (zend_ffi_exception_ce , "Attempt to read field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1262- return & EG (uninitialized_zval );
1263- }
1260+ zend_throw_error (zend_ffi_exception_ce , "Attempt to read field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1261+ return & EG (uninitialized_zval );
12641262 }
12651263
12661264 field = zend_hash_find_ptr (& type -> record .fields , field_name );
@@ -1334,10 +1332,8 @@ static zval *zend_ffi_cdata_write_field(zend_object *obj, zend_string *field_nam
13341332 type = ZEND_FFI_TYPE (type -> pointer .type );
13351333 }
13361334 if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1337- if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1338- zend_throw_error (zend_ffi_exception_ce , "Attempt to assign field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1339- return value ;
1340- }
1335+ zend_throw_error (zend_ffi_exception_ce , "Attempt to assign field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1336+ return value ;
13411337 }
13421338
13431339 field = zend_hash_find_ptr (& type -> record .fields , field_name );
@@ -3069,17 +3065,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
30693065 FFI_G (default_type_attr ) = ZEND_FFI_ATTR_STORED ;
30703066
30713067 if (zend_ffi_parse_decl (ZSTR_VAL (code ), ZSTR_LEN (code )) == FAILURE ) {
3072- if (FFI_G (symbols )) {
3073- zend_hash_destroy (FFI_G (symbols ));
3074- efree (FFI_G (symbols ));
3075- FFI_G (symbols ) = NULL ;
3076- }
3077- if (FFI_G (tags )) {
3078- zend_hash_destroy (FFI_G (tags ));
3079- efree (FFI_G (tags ));
3080- FFI_G (tags ) = NULL ;
3081- }
3082- RETURN_THROWS ();
3068+ goto cleanup ;
30833069 }
30843070
30853071 if (FFI_G (symbols )) {
@@ -3091,7 +3077,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
30913077 addr = DL_FETCH_SYMBOL (handle , ZSTR_VAL (name ));
30923078 if (!addr ) {
30933079 zend_throw_error (zend_ffi_exception_ce , "Failed resolving C variable '%s'" , ZSTR_VAL (name ));
3094- RETURN_THROWS () ;
3080+ goto cleanup ;
30953081 }
30963082 sym -> addr = addr ;
30973083 } else if (sym -> kind == ZEND_FFI_SYM_FUNC ) {
@@ -3101,7 +3087,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
31013087 zend_string_release (mangled_name );
31023088 if (!addr ) {
31033089 zend_throw_error (zend_ffi_exception_ce , "Failed resolving C function '%s'" , ZSTR_VAL (name ));
3104- RETURN_THROWS () ;
3090+ goto cleanup ;
31053091 }
31063092 sym -> addr = addr ;
31073093 }
@@ -3118,6 +3104,22 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
31183104 FFI_G (tags ) = NULL ;
31193105
31203106 RETURN_OBJ (& ffi -> std );
3107+
3108+ cleanup :
3109+ if (lib && handle ) {
3110+ DL_UNLOAD (handle );
3111+ }
3112+ if (FFI_G (symbols )) {
3113+ zend_hash_destroy (FFI_G (symbols ));
3114+ efree (FFI_G (symbols ));
3115+ FFI_G (symbols ) = NULL ;
3116+ }
3117+ if (FFI_G (tags )) {
3118+ zend_hash_destroy (FFI_G (tags ));
3119+ efree (FFI_G (tags ));
3120+ FFI_G (tags ) = NULL ;
3121+ }
3122+ RETURN_THROWS ();
31213123}
31223124/* }}} */
31233125
0 commit comments