aboutsummaryrefslogtreecommitdiff
path: root/php/ext/google/protobuf/encode_decode.c
diff options
context:
space:
mode:
authorBo Yang <teboring@google.com>2016-10-05 10:54:39 -0700
committerBo Yang <teboring@google.com>2016-10-10 11:44:54 -0700
commit4f3d20a500e75ef47004986fece3db20ddeee43f (patch)
treec4fa543a4ebae98c3762270edf3c3c07211782ce /php/ext/google/protobuf/encode_decode.c
parent1e5d4ba9387362ece026e78148f4ac5881537e64 (diff)
downloadprotobuf-4f3d20a500e75ef47004986fece3db20ddeee43f.tar.gz
protobuf-4f3d20a500e75ef47004986fece3db20ddeee43f.tar.bz2
protobuf-4f3d20a500e75ef47004986fece3db20ddeee43f.zip
Fix segmentation fault when ZTS is defined.
Diffstat (limited to 'php/ext/google/protobuf/encode_decode.c')
-rw-r--r--php/ext/google/protobuf/encode_decode.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c
index af90ff33..b45d1b2a 100644
--- a/php/ext/google/protobuf/encode_decode.c
+++ b/php/ext/google/protobuf/encode_decode.c
@@ -199,8 +199,9 @@ static void *startseq_handler(void* closure, const void* hd) {
// Handlers that append primitive values to a repeated field.
#define DEFINE_APPEND_HANDLER(type, ctype) \
static bool append##type##_handler(void* closure, const void* hd, \
- ctype val TSRMLS_DC) { \
+ ctype val) { \
zval* array = (zval*)closure; \
+ TSRMLS_FETCH(); \
RepeatedField* intern = \
(RepeatedField*)zend_object_store_get_object(array TSRMLS_CC); \
repeated_field_push_native(intern, &val TSRMLS_CC); \
@@ -218,8 +219,9 @@ DEFINE_APPEND_HANDLER(double, double)
// Appends a string to a repeated field.
static void* appendstr_handler(void *closure,
const void *hd,
- size_t size_hint TSRMLS_DC) {
+ size_t size_hint) {
zval* array = (zval*)closure;
+ TSRMLS_FETCH();
RepeatedField* intern =
(RepeatedField*)zend_object_store_get_object(array TSRMLS_CC);
@@ -234,8 +236,9 @@ static void* appendstr_handler(void *closure,
// Appends a 'bytes' string to a repeated field.
static void* appendbytes_handler(void *closure,
const void *hd,
- size_t size_hint TSRMLS_DC) {
+ size_t size_hint) {
zval* array = (zval*)closure;
+ TSRMLS_FETCH();
RepeatedField* intern =
(RepeatedField*)zend_object_store_get_object(array TSRMLS_CC);
@@ -296,8 +299,9 @@ static size_t stringdata_handler(void* closure, const void* hd,
}
// Appends a submessage to a repeated field.
-static void *appendsubmsg_handler(void *closure, const void *hd TSRMLS_DC) {
+static void *appendsubmsg_handler(void *closure, const void *hd) {
zval* array = (zval*)closure;
+ TSRMLS_FETCH();
RepeatedField* intern =
(RepeatedField*)zend_object_store_get_object(array TSRMLS_CC);
@@ -319,10 +323,11 @@ static void *appendsubmsg_handler(void *closure, const void *hd TSRMLS_DC) {
}
// Sets a non-repeated submessage field in a message.
-static void *submsg_handler(void *closure, const void *hd TSRMLS_DC) {
+static void *submsg_handler(void *closure, const void *hd) {
MessageHeader* msg = closure;
const submsg_handlerdata_t* submsgdata = hd;
zval* subdesc_php = get_def_obj((void*)submsgdata->md);
+ TSRMLS_FETCH();
Descriptor* subdesc = zend_object_store_get_object(subdesc_php TSRMLS_CC);
zend_class_entry* subklass = subdesc->klass;
zval* submsg_php;
@@ -465,11 +470,11 @@ static void *startmapentry_handler(void *closure, const void *hd) {
// Handler to end a map entry: inserts the value defined during the message into
// the map. This is the 'endmsg' handler on the map entry msgdef.
-static bool endmap_handler(void *closure, const void *hd, upb_status* s
- TSRMLS_DC) {
+static bool endmap_handler(void* closure, const void* hd, upb_status* s) {
map_parse_frame_t* frame = closure;
const map_handlerdata_t* mapdata = hd;
+ TSRMLS_FETCH();
Map *map = (Map *)zend_object_store_get_object(frame->map TSRMLS_CC);
const char* keyval = NULL;
@@ -575,12 +580,12 @@ static void *oneofbytes_handler(void *closure,
}
// Handler for a submessage field in a oneof.
-static void *oneofsubmsg_handler(void *closure,
- const void *hd TSRMLS_DC) {
+static void* oneofsubmsg_handler(void* closure, const void* hd) {
MessageHeader* msg = closure;
const oneof_handlerdata_t *oneofdata = hd;
uint32_t oldcase = DEREF(msg, oneofdata->case_ofs, uint32_t);
zval* subdesc_php = get_def_obj((void*)oneofdata->md);
+ TSRMLS_FETCH();
Descriptor* subdesc = zend_object_store_get_object(subdesc_php TSRMLS_CC);
zend_class_entry* subklass = subdesc->klass;
zval* submsg_php;
@@ -773,9 +778,10 @@ static void add_handlers_for_oneof_field(upb_handlers *h,
upb_handlerattr_uninit(&attr);
}
-static void add_handlers_for_message(const void *closure, upb_handlers *h
- TSRMLS_DC) {
+static void add_handlers_for_message(const void* closure,
+ upb_handlers* h) {
const upb_msgdef* msgdef = upb_handlers_msgdef(h);
+ TSRMLS_FETCH();
Descriptor* desc = (Descriptor*)zend_object_store_get_object(
get_def_obj((void*)msgdef) TSRMLS_CC);
upb_msg_field_iter i;