This code was reusing the _bailout variable from
SOAP_CLIENT_BEGIN/END_CODE(). As _bailout is not volatile, modifying
it after the setjmp call and then reading it back on return is
illegal. Use a separate local bailout variable instead.
This fixes the miscompile introduced by marking zend_bailout() as
noreturn.
int old_features;
HashTable *old_typemap, *typemap = NULL;
smart_str action = {0};
+ int bailout = 0;
SOAP_CLIENT_BEGIN_CODE();
}
} zend_catch {
- _bailout = 1;
+ bailout = 1;
} zend_end_try();
if (SOAP_GLOBAL(encoding) != NULL) {
SOAP_GLOBAL(class_map) = old_class_map;
SOAP_GLOBAL(encoding) = old_encoding;
SOAP_GLOBAL(sdl) = old_sdl;
- if (_bailout) {
+ if (bailout) {
smart_str_free(&action);
if (request) {
xmlFreeDoc(request);
}
- _bailout = 0;
zend_bailout();
}
SOAP_CLIENT_END_CODE();