Skip to content

Commit 616aaa7

Browse files
committed
PCBC-332: Correct various memory leaks.
1 parent dff2b3a commit 616aaa7

File tree

5 files changed

+54
-13
lines changed

5 files changed

+54
-13
lines changed

bucket.c

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ void bucket_free_storage(void *object TSRMLS_DC)
7575
zend_hash_destroy(obj->std.properties);
7676
FREE_HASHTABLE(obj->std.properties);
7777

78+
zval_ptr_dtor(&obj->encoder);
79+
zval_ptr_dtor(&obj->decoder);
80+
zval_ptr_dtor(&obj->prefix);
81+
7882
efree(obj);
7983
}
8084

@@ -88,18 +92,20 @@ zend_object_value bucket_create_handler(zend_class_entry *type TSRMLS_DC)
8892
obj->conn = NULL;
8993

9094
MAKE_STD_ZVAL(obj->encoder);
91-
ZVAL_STRING(obj->encoder, "", 1);
95+
ZVAL_EMPTY_STRING(obj->encoder);
9296
MAKE_STD_ZVAL(obj->decoder);
93-
ZVAL_STRING(obj->decoder, "", 1);
97+
ZVAL_EMPTY_STRING(obj->decoder);
9498
MAKE_STD_ZVAL(obj->prefix);
95-
ZVAL_STRING(obj->prefix, "", 1);
99+
ZVAL_EMPTY_STRING(obj->prefix);
96100

97101
ALLOC_HASHTABLE(obj->std.properties);
98102
zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
99103
phlp_object_properties_init(&obj->std, type);
100104

101-
retval.handle = zend_objects_store_put(obj, NULL,
102-
bucket_free_storage, NULL TSRMLS_CC);
105+
retval.handle = zend_objects_store_put(obj,
106+
(zend_objects_store_dtor_t)zend_objects_destroy_object,
107+
(zend_objects_free_object_storage_t)bucket_free_storage,
108+
NULL TSRMLS_CC);
103109
retval.handlers = &bucket_handlers;
104110

105111
return retval;
@@ -437,6 +443,9 @@ PHP_METHOD(Bucket, insert)
437443
pcbc_wait(data TSRMLS_CC);
438444

439445
bopcookie_destroy(cookie);
446+
for (ii = 0; ii < num_cmds; ++ii) {
447+
efree((void*)cmds[ii]->v.v0.bytes);
448+
}
440449
efree(cmds);
441450
efree(cmd);
442451
}
@@ -496,6 +505,9 @@ PHP_METHOD(Bucket, upsert)
496505
pcbc_wait(data TSRMLS_CC);
497506

498507
bopcookie_destroy(cookie);
508+
for (ii = 0; ii < num_cmds; ++ii) {
509+
efree((void*)cmds[ii]->v.v0.bytes);
510+
}
499511
efree(cmds);
500512
efree(cmd);
501513
}
@@ -559,6 +571,9 @@ PHP_METHOD(Bucket, replace)
559571
pcbc_wait(data TSRMLS_CC);
560572

561573
bopcookie_destroy(cookie);
574+
for (ii = 0; ii < num_cmds; ++ii) {
575+
efree((void*)cmds[ii]->v.v0.bytes);
576+
}
562577
efree(cmds);
563578
efree(cmd);
564579
}
@@ -617,6 +632,9 @@ PHP_METHOD(Bucket, append)
617632
pcbc_wait(data TSRMLS_CC);
618633

619634
bopcookie_destroy(cookie);
635+
for (ii = 0; ii < num_cmds; ++ii) {
636+
efree((void*)cmds[ii]->v.v0.bytes);
637+
}
620638
efree(cmds);
621639
efree(cmd);
622640
}
@@ -675,6 +693,9 @@ PHP_METHOD(Bucket, prepend)
675693
pcbc_wait(data TSRMLS_CC);
676694

677695
bopcookie_destroy(cookie);
696+
for (ii = 0; ii < num_cmds; ++ii) {
697+
efree((void*)cmds[ii]->v.v0.bytes);
698+
}
678699
efree(cmds);
679700
efree(cmd);
680701
}
@@ -1090,11 +1111,11 @@ PHP_METHOD(Bucket, setTranscoder)
10901111
RETURN_NULL();
10911112
}
10921113

1093-
FREE_ZVAL(data->encoder);
1114+
zval_ptr_dtor(&data->encoder);
10941115
MAKE_STD_ZVAL(data->encoder);
10951116
ZVAL_ZVAL(data->encoder, zencoder, 1, NULL);
10961117

1097-
FREE_ZVAL(data->decoder);
1118+
zval_ptr_dtor(&data->decoder);
10981119
MAKE_STD_ZVAL(data->decoder);
10991120
ZVAL_ZVAL(data->decoder, zdecoder, 1, NULL);
11001121

cas.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@
33

44
int le_cas;
55

6+
static void cas_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
7+
{
8+
lcb_cas_t *cas_data = (lcb_cas_t*)rsrc->ptr;
9+
if (cas_data) {
10+
efree(cas_data);
11+
}
12+
}
13+
614
void couchbase_init_cas(INIT_FUNC_ARGS) {
7-
le_cas = zend_register_list_destructors_ex(NULL, NULL, "CouchbaseCAS", module_number);
15+
le_cas = zend_register_list_destructors_ex(cas_dtor, NULL, "CouchbaseCAS", module_number);
816
}
917

1018
lcb_cas_t cas_retrieve(zval * zcas TSRMLS_DC) {

couchbase.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ PHP_MINIT_FUNCTION(couchbase)
9393
return SUCCESS;
9494
}
9595

96-
PHP_MSHUTDOWN_FUNCTION(couchbsae)
96+
PHP_MSHUTDOWN_FUNCTION(couchbase)
9797
{
9898
couchbase_shutdown_bucket(SHUTDOWN_FUNC_ARGS_PASSTHRU);
9999

@@ -133,7 +133,7 @@ zend_module_entry couchbase_module_entry = {
133133
PHP_COUCHBASE_EXTNAME,
134134
NULL,
135135
PHP_MINIT(couchbase),
136-
NULL,
136+
PHP_MSHUTDOWN(couchbase),
137137
PHP_RINIT(couchbase),
138138
NULL,
139139
NULL,

metadoc.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ int metadoc_create(zval *doc, zval *value, lcb_cas_t cas,
4040
MAKE_STD_ZVAL(zflags);
4141
ZVAL_LONG(zflags, flags);
4242
zend_update_property(metadoc_ce, doc, "flags", sizeof("flags") - 1, zflags TSRMLS_CC);
43+
zval_ptr_dtor(&zflags);
4344

4445
zcas = cas_create(cas TSRMLS_CC);
4546
zend_update_property(metadoc_ce, doc, "cas", sizeof("cas") - 1, zcas TSRMLS_CC);
47+
zval_ptr_dtor(&zcas);
4648

4749
return SUCCESS;
4850
}
@@ -59,8 +61,12 @@ int metadoc_from_long(zval *doc, lcb_U64 value,
5961
int metadoc_from_bytes(bucket_object *obj, zval *doc, const void *bytes,
6062
lcb_size_t nbytes, lcb_cas_t cas, lcb_uint32_t flags,
6163
lcb_uint8_t datatype TSRMLS_DC) {
62-
zval *zvalue;
64+
int retval;
65+
zval *zvalue;
6366
pcbc_bytes_to_zval(obj, &zvalue, bytes, nbytes, flags, datatype TSRMLS_CC);
6467

65-
return metadoc_create(doc, zvalue, cas, flags, datatype TSRMLS_CC);
68+
retval = metadoc_create(doc, zvalue, cas, flags, datatype TSRMLS_CC);
69+
70+
zval_ptr_dtor(&zvalue);
71+
return retval;
6672
}

transcoding.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ int pcbc_bytes_to_zval(bucket_object *obj, zval **zvalue, const void *bytes,
2424
return FAILURE;
2525
}
2626

27+
zval_dtor(&zbytes);
28+
zval_dtor(&zflags);
29+
zval_dtor(&zdatatype);
30+
2731
return SUCCESS;
2832
}
2933

@@ -59,10 +63,12 @@ int pcbc_zval_to_bytes(bucket_object *obj, zval *value,
5963
return FAILURE;
6064
}
6165

62-
*bytes = Z_STRVAL_PP(zpbytes);
6366
*nbytes = Z_STRLEN_PP(zpbytes);
67+
*bytes = estrndup(Z_STRVAL_PP(zpbytes), *nbytes);
6468
*flags = Z_LVAL_PP(zpflags);
6569
*datatype = (lcb_uint8_t)Z_LVAL_PP(zpdatatype);
6670

71+
zval_dtor(&zretval);
72+
6773
return SUCCESS;
6874
}

0 commit comments

Comments
 (0)