Skip to content

Commit 55aeef5

Browse files
committed
migrate to php 7 zval init flavour; fixes memory leak due to new zval()
1 parent c83a0e9 commit 55aeef5

12 files changed

Lines changed: 194 additions & 163 deletions

File tree

bdict.cc

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ bdict::bdict(const bdict *that)
2222
for (zend_hash_internal_pointer_reset(that->_data);
2323
zend_hash_has_more_elements(that->_data) == SUCCESS;
2424
zend_hash_move_forward(that->_data)) {
25-
zval *tmp = new zval();
26-
ZVAL_OBJ(tmp, zend_container::bnode_object_clone(zend_hash_get_current_data(that->_data)));
25+
zval tmp;
26+
ZVAL_OBJ(&tmp, zend_container::bnode_object_clone(zend_hash_get_current_data(that->_data)));
2727
zend_string *_str_index;
2828
zend_ulong _num_index;
2929
zend_hash_get_current_key(that->_data, &_str_index, &_num_index);
30-
zend_hash_add(_data, _str_index, tmp);
30+
zend_hash_add(_data, _str_index, &tmp);
3131
}
3232
}
3333

@@ -42,12 +42,14 @@ std::string bdict::get_type() const
4242
return "bdict";
4343
}
4444

45-
zval *bdict::get(const std::string &key) const
45+
zval bdict::get(const std::string &key) const
4646
{
4747
if (!zend_hash_str_exists(_data, key.c_str(), key.length())) {
4848
return bitem::get_zval_bool(false);
4949
}
50-
return zend_hash_str_find(_data, key.c_str(), key.length());
50+
zval zv;
51+
ZVAL_COPY(&zv, zend_hash_str_find(_data, key.c_str(), key.length()));
52+
return zv;
5153
}
5254

5355
bool bdict::has(const std::string &key) const
@@ -87,14 +89,16 @@ bool bdict::del(const std::string &key)
8789
}
8890
}
8991

90-
zval *bdict::get_path(const std::string &key, size_t &pt) const
92+
zval bdict::get_path(const std::string &key, size_t &pt) const
9193
{
9294
std::string current_key = bitem::get_current_key(key, pt);
9395
if (!zend_hash_str_exists(_data, current_key.c_str(), current_key.length())) {
9496
return bitem::get_zval_bool(false);
9597
}
9698
if (pt >= key.length()) {
97-
return zend_hash_str_find(_data, current_key.c_str(), current_key.length());
99+
zval zv;
100+
ZVAL_COPY(&zv, zend_hash_str_find(_data, current_key.c_str(), current_key.length()));
101+
return zv;
98102
} else {
99103
zval *subnode = zend_hash_str_find(_data, current_key.c_str(), current_key.length());
100104
std::string class_name = zend_container::bnode_object_get_class_name(subnode);
@@ -195,14 +199,14 @@ size_t bdict::count() const
195199
return zend_array_count(_data);
196200
}
197201

198-
zval *bdict::parse(const std::string &ben, size_t &pt)
202+
zval bdict::parse(const std::string &ben, size_t &pt)
199203
{
200204
if (ben[pt] != 'd')
201205
return bitem::throw_general_exception("Error parsing bdict");
202-
zval *zv = new zval();
206+
zval zv;
203207
zend_object *zo = zend_container::bdict_object_new(zend_container::bdict_ce);
204-
ZVAL_OBJ(zv, zo);
205-
bdict_object *intern = zend_container::bdict_fetch_object(Z_OBJ_P(zv));
208+
ZVAL_OBJ(&zv, zo);
209+
bdict_object *intern = zend_container::bdict_fetch_object(Z_OBJ(zv));
206210
intern->bnode_data = new bdict();
207211
++pt;
208212

@@ -215,17 +219,17 @@ zval *bdict::parse(const std::string &ben, size_t &pt)
215219
std::string key = ben.substr(pt, std::stoull(key_len));
216220
pt += std::stoull(key_len);
217221
if (ben[pt] == 'd') {
218-
zval *bnode = bdict::parse(ben, pt);
219-
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), bnode);
222+
zval bnode = bdict::parse(ben, pt);
223+
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), &bnode);
220224
} else if (ben[pt] == 'l') {
221-
zval *bnode = blist::parse(ben, pt);
222-
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), bnode);
225+
zval bnode = blist::parse(ben, pt);
226+
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), &bnode);
223227
} else if (isdigit(ben[pt])) {
224-
zval *bnode = bstr::parse(ben, pt);
225-
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), bnode);
228+
zval bnode = bstr::parse(ben, pt);
229+
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), &bnode);
226230
} else if (ben[pt] == 'i') {
227-
zval *bnode = bint::parse(ben, pt);
228-
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), bnode);
231+
zval bnode = bint::parse(ben, pt);
232+
zend_hash_str_add(intern->bnode_data->_data, key.c_str(), key.length(), &bnode);
229233
} else {
230234
return bitem::throw_general_exception("Error parsing bdict");
231235
}
@@ -252,10 +256,10 @@ std::string bdict::encode() const
252256
return result + "e";
253257
}
254258

255-
zval *bdict::to_array(const bool include_meta) const
259+
zval bdict::to_array(const bool include_meta) const
256260
{
257-
zval *zv = new zval();
258-
array_init(zv);
261+
zval zv;
262+
array_init(&zv);
259263

260264
for (zend_hash_internal_pointer_reset(_data);
261265
zend_hash_has_more_elements(_data) == SUCCESS;
@@ -264,28 +268,28 @@ zval *bdict::to_array(const bool include_meta) const
264268
zend_ulong num_index;
265269
zend_hash_get_current_key(_data, &str_index, &num_index);
266270
zval *value = zend_hash_get_current_data(_data);
267-
zval *subarray = zend_container::bnode_fetch_object_data(Z_OBJ_P(value))->to_array(include_meta);
268-
zend_hash_add(Z_ARR_P(zv), str_index, subarray);
271+
zval subarray = zend_container::bnode_fetch_object_data(Z_OBJ_P(value))->to_array(include_meta);
272+
zend_hash_add(Z_ARR(zv), str_index, &subarray);
269273
}
270274

271275
if (include_meta) {
272-
zval *zv_outer = new zval();
273-
array_init(zv_outer);
274-
add_assoc_string(zv_outer, (char *)"_type", (char *)"bdict");
275-
add_assoc_long(zv_outer, (char *)"_length", length());
276-
add_assoc_zval(zv_outer, (char *)"_data", zv);
276+
zval zv_outer;
277+
array_init(&zv_outer);
278+
add_assoc_string(&zv_outer, (char *)"_type", (char *)"bdict");
279+
add_assoc_long(&zv_outer, (char *)"_length", length());
280+
add_assoc_zval(&zv_outer, (char *)"_data", &zv);
277281
return zv_outer;
278282
}
279283
return zv;
280284
}
281285

282-
zval *bdict::search(const std::string &needle, const long &mode, const std::string path) const
286+
zval bdict::search(const std::string &needle, const long &mode, const std::string path) const
283287
{
284288
if (mode < 0 || mode > 1)
285289
bitem::throw_general_exception("Illegal search mode");
286290

287-
zval *zv = new zval();
288-
array_init(zv);
291+
zval zv;
292+
array_init(&zv);
289293

290294
for (zend_hash_internal_pointer_reset(_data);
291295
zend_hash_has_more_elements(_data) == SUCCESS;
@@ -298,11 +302,11 @@ zval *bdict::search(const std::string &needle, const long &mode, const std::stri
298302
std::string current_path = (path == "" ? "" : path + "/") + bitem::escape_key(str_index);
299303

300304
if (mode == 0 && str_index.find(needle) != std::string::npos) {
301-
add_next_index_stringl(zv, current_path.c_str(), current_path.length());
305+
add_next_index_stringl(&zv, current_path.c_str(), current_path.length());
302306
}
303307

304-
zval *next_result = zend_container::bnode_fetch_object_data(Z_OBJ_P(value))->search(needle, mode, current_path);
305-
zend_hash_append_strings(Z_ARRVAL_P(zv), Z_ARRVAL_P(next_result));
308+
zval next_result = zend_container::bnode_fetch_object_data(Z_OBJ_P(value))->search(needle, mode, current_path);
309+
zend_hash_append_strings(Z_ARRVAL(zv), Z_ARRVAL(next_result));
306310
}
307311

308312
return zv;

bdict.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,20 @@ class bdict : public bitem
1919
~bdict();
2020

2121
std::string get_type() const;
22-
zval *get(const std::string &key) const;
22+
zval get(const std::string &key) const;
2323
bool has(const std::string &key) const;
2424
void set(const std::string &key, zval *value);
2525
bool del(const std::string &key);
26-
zval *get_path(const std::string &key, size_t &pt) const;
26+
zval get_path(const std::string &key, size_t &pt) const;
2727
void set_path(const std::string &key, size_t &pt, zval *value);
2828
bool del_path(const std::string &key, size_t &pt);
2929
size_t length() const;
3030
size_t count() const;
3131

32-
static zval *parse(const std::string &ben, size_t &pt);
32+
static zval parse(const std::string &ben, size_t &pt);
3333
std::string encode() const;
34-
zval *to_array(const bool include_meta) const;
35-
zval *search(const std::string &needle, const long &mode, const std::string path) const;
34+
zval to_array(const bool include_meta) const;
35+
zval search(const std::string &needle, const long &mode, const std::string path) const;
3636
};
3737

3838
#endif

0 commit comments

Comments
 (0)