Skip to content

Commit c4f69e8

Browse files
krakjoederickr
authored andcommitted
fix leaks and logical errors for PHP 7
1 parent 583b9f3 commit c4f69e8

File tree

3 files changed

+72
-21
lines changed

3 files changed

+72
-21
lines changed

php_phongo.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,7 @@ void php_phongo_populate_default_ssl_ctx(php_stream_context *ctx, zval *driverOp
15861586
str_efree(ctmp); \
15871587
} \
15881588
php_stream_context_set_option(ctx, "ssl", name, &ztmp); \
1589+
zval_ptr_dtor(&ztmp); \
15891590
}
15901591
#define SET_BOOL_CTX(name, defaultvalue) \
15911592
{ \
@@ -1926,7 +1927,8 @@ static mongoc_client_t *php_phongo_make_mongo_client(const mongoc_uri_t *uri, zv
19261927
char filename[MAXPATHLEN];
19271928

19281929
#if PHP_VERSION_ID >= 70000
1929-
if (VCWD_REALPATH(zval_get_string(pem)->val, filename)) {
1930+
zend_string *s = zval_get_string(pem);
1931+
if (VCWD_REALPATH(ZSTR_VAL(s), filename)) {
19301932
#else
19311933
convert_to_string_ex(pem);
19321934
if (VCWD_REALPATH(Z_STRVAL_PP(pem), filename)) {
@@ -1936,6 +1938,9 @@ static mongoc_client_t *php_phongo_make_mongo_client(const mongoc_uri_t *uri, zv
19361938
ssl_options.pem_file = filename;
19371939
mongoc_client_set_ssl_opts(client, &ssl_options);
19381940
}
1941+
#if PHP_VERSION_ID >= 70000
1942+
zend_string_release(s);
1943+
#endif
19391944
}
19401945
}
19411946

src/MongoDB/WriteConcern.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ PHP_METHOD(WriteConcern, __construct)
9191
case 3:
9292
if (Z_TYPE_P(journal) != IS_NULL) {
9393
#ifdef ZEND_ENGINE_3
94-
mongoc_write_concern_set_journal(intern->write_concern, Z_TYPE_P(journal) == IS_TRUE);
94+
mongoc_write_concern_set_journal(intern->write_concern, zend_is_true(journal));
9595
#else
9696
mongoc_write_concern_set_journal(intern->write_concern, Z_BVAL_P(journal));
9797
#endif

src/bson.c

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,11 @@ void object_to_bson(zval *object, php_phongo_bson_flags_t flags, const char *key
968968
return;
969969
}
970970

971+
#if PHP_VERSION_ID >= 70000
972+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Unexpected %s instance: %s", ZSTR_VAL(php_phongo_type_ce->name), ZSTR_VAL(Z_OBJCE_P(object)->name));
973+
#else
971974
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Unexpected %s instance: %s", php_phongo_type_ce->name, Z_OBJCE_P(object)->name);
975+
#endif
972976
return;
973977
}
974978

@@ -1037,25 +1041,52 @@ void phongo_bson_append(bson_t *bson, php_phongo_bson_flags_t flags, const char
10371041
object_to_bson(entry, flags, key, key_len, bson TSRMLS_CC);
10381042
break;
10391043

1044+
#if PHP_VERSION_ID >= 70000
1045+
case IS_INDIRECT:
1046+
phongo_bson_append(bson, flags, key, key_len, Z_TYPE_P(Z_INDIRECT_P(entry)), Z_INDIRECT_P(entry) TSRMLS_DC);
1047+
break;
1048+
#endif
1049+
10401050
default:
1041-
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Got unsupported type '%s'", zend_get_type_by_const(entry_type));
1051+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Got unsupported type %d '%s'", entry_type, zend_get_type_by_const(entry_type));
10421052
}
10431053
}
10441054

1055+
#if PHP_VERSION_ID >= 70000
1056+
static bool is_public_property(zend_class_entry *ce, zend_string *name, zend_string **member TSRMLS_DC) /* {{{ */
1057+
#else
10451058
static bool is_public_property(zend_class_entry *ce, const char *prop_name, int prop_name_len TSRMLS_DC) /* {{{ */
1059+
#endif
10461060
{
1047-
zend_property_info *property_info;
1048-
zval member;
1061+
zend_property_info *property_info = NULL;
10491062

10501063
#if PHP_VERSION_ID >= 70000
1051-
ZVAL_STRINGL(&member, prop_name, prop_name_len);
1052-
property_info = zend_get_property_info(ce, Z_STR(member), 1 TSRMLS_CC);
1064+
if (ZSTR_VAL(name)[0] == 0) {
1065+
const char *prop_name,
1066+
*class_name;
1067+
size_t prop_name_len;
1068+
1069+
zend_unmangle_property_name_ex(name,
1070+
&class_name, &prop_name, &prop_name_len);
1071+
(*member) = zend_string_init(prop_name, prop_name_len, 0);
1072+
} else (*member) = zend_string_copy(name);
1073+
property_info = zend_get_property_info(ce, (*member), 1 TSRMLS_CC);
1074+
1075+
if (!property_info) /* undefined property */
1076+
return true;
1077+
1078+
if (property_info == ZEND_WRONG_PROPERTY_INFO) {
1079+
return false;
1080+
}
1081+
1082+
return (property_info->flags & ZEND_ACC_PUBLIC);
10531083
#else
1084+
zval member;
10541085
ZVAL_STRINGL(&member, prop_name, prop_name_len, 0);
10551086
property_info = zend_get_property_info(ce, &member, 1 TSRMLS_CC);
1056-
#endif
10571087

10581088
return (property_info && (property_info->flags & ZEND_ACC_PUBLIC));
1089+
#endif
10591090
}
10601091
/* }}} */
10611092

@@ -1137,7 +1168,11 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
11371168
}
11381169

11391170
if (instanceof_function(Z_OBJCE_P(data), php_phongo_type_ce TSRMLS_CC)) {
1171+
#if PHP_VERSION_ID >= 70000
1172+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "%s instance %s cannot be serialized as a root element", ZSTR_VAL(php_phongo_type_ce->name), ZSTR_VAL(Z_OBJCE_P(data)->name));
1173+
#else
11401174
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "%s instance %s cannot be serialized as a root element", php_phongo_type_ce->name, Z_OBJCE_P(data)->name);
1175+
#endif
11411176

11421177
break;
11431178
}
@@ -1170,29 +1205,36 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
11701205
ZEND_HASH_FOREACH_KEY_VAL(ht_data, num_key, key, value) {
11711206
if (key) {
11721207
if (Z_TYPE_P(data) == IS_OBJECT) {
1173-
const char *skey;
1174-
size_t skey_len = 0;
1175-
const char *class_name;
1176-
zend_unmangle_property_name_ex(key, &class_name, &skey, &skey_len);
1177-
1208+
zend_string *member = NULL;
1209+
11781210
/* Ignore non-public properties */
1179-
if (!is_public_property(Z_OBJCE_P(data), skey, skey_len TSRMLS_CC)) {
1211+
if (!instanceof_function(Z_OBJCE_P(data), php_phongo_serializable_ce) &&
1212+
!is_public_property(Z_OBJCE_P(data), key, &member TSRMLS_CC)) {
1213+
if (member)
1214+
zend_string_release(member);
11801215
continue;
11811216
}
11821217

11831218
if (flags & PHONGO_BSON_ADD_ID) {
1184-
if (!strncmp(skey, "_id", sizeof("_id")-1)) {
1219+
if (!strncmp(member ? ZSTR_VAL(member) : ZSTR_VAL(key), "_id", sizeof("_id")-1)) {
11851220
flags &= ~PHONGO_BSON_ADD_ID;
11861221
}
11871222
}
1188-
phongo_bson_append(bson, flags & ~PHONGO_BSON_ADD_ID, skey, skey_len, Z_TYPE_P(value), value TSRMLS_CC);
1223+
1224+
phongo_bson_append(bson, flags & ~PHONGO_BSON_ADD_ID,
1225+
member ? ZSTR_VAL(member) : ZSTR_VAL(key),
1226+
member ? ZSTR_LEN(member) : ZSTR_LEN(key),
1227+
Z_TYPE_P(value), value TSRMLS_CC);
1228+
1229+
if (member)
1230+
zend_string_release(member);
11891231
} else {
11901232
if (flags & PHONGO_BSON_ADD_ID) {
1191-
if (!strncmp(key->val, "_id", sizeof("_id")-1)) {
1233+
if (!strncmp(ZSTR_VAL(key), "_id", sizeof("_id")-1)) {
11921234
flags &= ~PHONGO_BSON_ADD_ID;
11931235
}
11941236
}
1195-
phongo_bson_append(bson, flags & ~PHONGO_BSON_ADD_ID, key->val, key->len, Z_TYPE_P(value), value TSRMLS_CC);
1237+
phongo_bson_append(bson, flags & ~PHONGO_BSON_ADD_ID, ZSTR_VAL(key), ZSTR_LEN(key), Z_TYPE_P(value), value TSRMLS_CC);
11961238
}
11971239
} else {
11981240
char numbuf[32];
@@ -1264,8 +1306,12 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
12641306
}
12651307
}
12661308
if (!Z_ISUNDEF(obj_data)) {
1267-
#if PHP_VERSION_ID < 70000
1268-
zval_ptr_dtor(&obj_data);
1309+
#if PHP_VERSION_ID >= 70000
1310+
if (Z_TYPE_P(data) == IS_OBJECT && instanceof_function(Z_OBJCE_P(data), php_phongo_serializable_ce TSRMLS_CC)) {
1311+
#endif
1312+
zval_ptr_dtor(&obj_data);
1313+
#if PHP_VERSION_ID >= 70000
1314+
}
12691315
#endif
12701316
}
12711317
}
@@ -1282,7 +1328,7 @@ int bson_to_zval(const unsigned char *data, int data_len, zval **zv)
12821328

12831329
retval = bson_to_zval_ex(data, data_len, &state);
12841330
#if PHP_VERSION_ID >= 70000
1285-
ZVAL_COPY(zv, &state.zchild);
1331+
ZVAL_ZVAL(zv, &state.zchild, 1, 1);
12861332
#else
12871333
*zv = state.zchild;
12881334
#endif

0 commit comments

Comments
 (0)