@@ -1253,10 +1253,8 @@ static zval *zend_ffi_cdata_read_field(zend_object *obj, zend_string *field_name
12531253 type = ZEND_FFI_TYPE (type -> pointer .type );
12541254 }
12551255 if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1256- if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1257- zend_throw_error (zend_ffi_exception_ce , "Attempt to read field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1258- return & EG (uninitialized_zval );
1259- }
1256+ zend_throw_error (zend_ffi_exception_ce , "Attempt to read field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1257+ return & EG (uninitialized_zval );
12601258 }
12611259
12621260 field = zend_hash_find_ptr (& type -> record .fields , field_name );
@@ -1331,10 +1329,8 @@ static zval *zend_ffi_cdata_write_field(zend_object *obj, zend_string *field_nam
13311329 type = ZEND_FFI_TYPE (type -> pointer .type );
13321330 }
13331331 if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
1334- if (UNEXPECTED (type -> kind != ZEND_FFI_TYPE_STRUCT )) {
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 ;
1337- }
1332+ zend_throw_error (zend_ffi_exception_ce , "Attempt to assign field '%s' of non C struct/union" , ZSTR_VAL (field_name ));
1333+ return value ;
13381334 }
13391335
13401336 field = zend_hash_find_ptr (& type -> record .fields , field_name );
@@ -3107,17 +3103,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
31073103 FFI_G (default_type_attr ) = ZEND_FFI_ATTR_STORED ;
31083104
31093105 if (zend_ffi_parse_decl (ZSTR_VAL (code ), ZSTR_LEN (code )) == FAILURE ) {
3110- if (FFI_G (symbols )) {
3111- zend_hash_destroy (FFI_G (symbols ));
3112- efree (FFI_G (symbols ));
3113- FFI_G (symbols ) = NULL ;
3114- }
3115- if (FFI_G (tags )) {
3116- zend_hash_destroy (FFI_G (tags ));
3117- efree (FFI_G (tags ));
3118- FFI_G (tags ) = NULL ;
3119- }
3120- RETURN_THROWS ();
3106+ goto cleanup ;
31213107 }
31223108
31233109 if (FFI_G (symbols )) {
@@ -3130,7 +3116,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
31303116 addr = DL_FETCH_SYMBOL (handle , ZSTR_VAL (name ));
31313117 if (!addr ) {
31323118 zend_throw_error (zend_ffi_exception_ce , "Failed resolving C variable '%s'" , ZSTR_VAL (name ));
3133- RETURN_THROWS () ;
3119+ goto cleanup ;
31343120 }
31353121 sym -> addr = addr ;
31363122 } else if (sym -> kind == ZEND_FFI_SYM_FUNC ) {
@@ -3140,7 +3126,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
31403126 zend_string_release (mangled_name );
31413127 if (!addr ) {
31423128 zend_throw_error (zend_ffi_exception_ce , "Failed resolving C function '%s'" , ZSTR_VAL (name ));
3143- RETURN_THROWS () ;
3129+ goto cleanup ;
31443130 }
31453131 sym -> addr = addr ;
31463132 }
@@ -3157,6 +3143,22 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
31573143 FFI_G (tags ) = NULL ;
31583144
31593145 RETURN_OBJ (& ffi -> std );
3146+
3147+ cleanup :
3148+ if (lib && handle ) {
3149+ DL_UNLOAD (handle );
3150+ }
3151+ if (FFI_G (symbols )) {
3152+ zend_hash_destroy (FFI_G (symbols ));
3153+ efree (FFI_G (symbols ));
3154+ FFI_G (symbols ) = NULL ;
3155+ }
3156+ if (FFI_G (tags )) {
3157+ zend_hash_destroy (FFI_G (tags ));
3158+ efree (FFI_G (tags ));
3159+ FFI_G (tags ) = NULL ;
3160+ }
3161+ RETURN_THROWS ();
31603162}
31613163/* }}} */
31623164
0 commit comments