Skip to content

Commit 390b6fc

Browse files
bjoriderickr
authored andcommitted
PHPC-404: off-by-one hash api changes
1 parent 615ce0c commit 390b6fc

File tree

11 files changed

+188
-87
lines changed

11 files changed

+188
-87
lines changed

phongo_compat.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,14 @@
157157
# define DECLARE_RETURN_VALUE_USED int return_value_used = 1;
158158
# define EXCEPTION_P(_ex, _zp) ZVAL_OBJ(_zp, _ex)
159159
# define PHONGO_STREAM_ID(stream) stream->res->handle
160-
# define ADD_ASSOC_STRING(_zv, _key, _value) add_assoc_string_ex(_zv, ZEND_STRS(_key), _value);
160+
# define ADD_ASSOC_STRING(_zv, _key, _value) add_assoc_string_ex(_zv, ZEND_STRL(_key), _value);
161161
# define ADD_ASSOC_STRINGL(_zv, _key, _value, _len) add_assoc_stringl_ex(_zv, ZEND_STRL(_key), _value, _len);
162162
# define ADD_ASSOC_LONG_EX(_zv, _key, _value) add_assoc_long_ex(_zv, ZEND_STRL(_key), _value);
163163
# define ADD_ASSOC_STRING_EX(_zv, _key, _key_len, _value, _value_len) add_assoc_stringl_ex(_zv, _key, _key_len, _value, _value_len);
164+
# define ADD_ASSOC_ZVAL_EX(_zv, _key, _value) add_assoc_zval_ex(_zv, ZEND_STRL(_key), _value);
165+
# define ADD_ASSOC_ZVAL(_zv, _key, _value) add_assoc_zval(_zv, _key, _value);
166+
# define ADD_ASSOC_NULL_EX(_zv, _key) add_assoc_null_ex(_zv, ZEND_STRL(_key));
167+
# define ADD_ASSOC_BOOL_EX(_zv, _key, _value) add_assoc_bool_ex(_zv, ZEND_STRL(_key), _value);
164168
# define phongo_free_object_arg zend_object
165169
# define phongo_zpp_char_len size_t
166170
# define ZEND_HASH_APPLY_COUNT(ht) (ht)->u.v.nApplyCount
@@ -183,6 +187,10 @@
183187
# define ADD_ASSOC_STRINGL(_zv, _key, _value, _len) add_assoc_stringl_ex(_zv, ZEND_STRS(_key), _value, _len, 1);
184188
# define ADD_ASSOC_STRING_EX(_zv, _key, _key_len, _value, _value_len) add_assoc_stringl_ex(_zv, _key, _key_len+1, _value, _value_len, 1);
185189
# define ADD_ASSOC_LONG_EX(_zv, _key, _value) add_assoc_long_ex(_zv, ZEND_STRS(_key), _value);
190+
# define ADD_ASSOC_ZVAL_EX(_zv, _key, _value) add_assoc_zval_ex(_zv, ZEND_STRS(_key), _value);
191+
# define ADD_ASSOC_ZVAL(_zv, _key, _value) add_assoc_zval(_zv, _key, _value);
192+
# define ADD_ASSOC_NULL_EX(_zv, _key) add_assoc_null_ex(_zv, ZEND_STRS(_key));
193+
# define ADD_ASSOC_BOOL_EX(_zv, _key, _value) add_assoc_bool_ex(_zv, ZEND_STRS(_key), _value);
186194
# define Z_PHPDATE_P(object) zend_object_store_get_object(object TSRMLS_CC)
187195
# define Z_ISUNDEF(x) !x
188196
# define phongo_free_object_arg void

php_phongo.c

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,20 +1287,20 @@ void php_phongo_server_to_zval(zval *retval, const mongoc_server_description_t *
12871287
ADD_ASSOC_STRING(retval, "host", (char *)sd->host.host);
12881288
ADD_ASSOC_LONG_EX(retval, "port", sd->host.port);
12891289
ADD_ASSOC_LONG_EX(retval, "type", sd->type);
1290-
add_assoc_bool_ex(retval, ZEND_STRS("is_primary"), sd->type == MONGOC_SERVER_RS_PRIMARY);
1291-
add_assoc_bool_ex(retval, ZEND_STRS("is_secondary"), sd->type == MONGOC_SERVER_RS_SECONDARY);
1292-
add_assoc_bool_ex(retval, ZEND_STRS("is_arbiter"), sd->type == MONGOC_SERVER_RS_ARBITER);
1290+
ADD_ASSOC_BOOL_EX(retval, "is_primary", sd->type == MONGOC_SERVER_RS_PRIMARY);
1291+
ADD_ASSOC_BOOL_EX(retval, "is_secondary", sd->type == MONGOC_SERVER_RS_SECONDARY);
1292+
ADD_ASSOC_BOOL_EX(retval, "is_arbiter", sd->type == MONGOC_SERVER_RS_ARBITER);
12931293
{
12941294
bson_iter_t iter;
12951295
zend_bool b = bson_iter_init_find_case(&iter, &sd->last_is_master, "hidden") && bson_iter_as_bool(&iter);
12961296

1297-
add_assoc_bool_ex(retval, ZEND_STRS("is_hidden"), b);
1297+
ADD_ASSOC_BOOL_EX(retval, "is_hidden", b);
12981298
}
12991299
{
13001300
bson_iter_t iter;
13011301
zend_bool b = bson_iter_init_find_case(&iter, &sd->last_is_master, "passive") && bson_iter_as_bool(&iter);
13021302

1303-
add_assoc_bool_ex(retval, ZEND_STRS("is_passive"), b);
1303+
ADD_ASSOC_BOOL_EX(retval, "is_passive", b);
13041304
}
13051305
if (sd->tags.len) {
13061306
php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER;
@@ -1309,7 +1309,11 @@ void php_phongo_server_to_zval(zval *retval, const mongoc_server_description_t *
13091309
state.map.document_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
13101310

13111311
bson_to_zval_ex(bson_get_data(&sd->tags), sd->tags.len, &state);
1312-
add_assoc_zval_ex(retval, ZEND_STRS("tags"), state.zchild);
1312+
#if PHP_VERSION_ID >= 70000
1313+
ADD_ASSOC_ZVAL_EX(retval, "tags", &state.zchild);
1314+
#else
1315+
ADD_ASSOC_ZVAL_EX(retval, "tags", state.zchild);
1316+
#endif
13131317
}
13141318
{
13151319
php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER;
@@ -1318,7 +1322,11 @@ void php_phongo_server_to_zval(zval *retval, const mongoc_server_description_t *
13181322
state.map.document_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
13191323

13201324
bson_to_zval_ex(bson_get_data(&sd->last_is_master), sd->last_is_master.len, &state);
1321-
add_assoc_zval_ex(retval, ZEND_STRS("last_is_master"), state.zchild);
1325+
#if PHP_VERSION_ID >= 70000
1326+
ADD_ASSOC_ZVAL_EX(retval, "last_is_master", &state.zchild);
1327+
#else
1328+
ADD_ASSOC_ZVAL_EX(retval, "last_is_master", state.zchild);
1329+
#endif
13221330
}
13231331
ADD_ASSOC_LONG_EX(retval, "round_trip_time", sd->round_trip_time);
13241332

@@ -1350,9 +1358,13 @@ void php_phongo_read_preference_to_zval(zval *retval, const mongoc_read_prefs_t
13501358
state.map.document_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
13511359

13521360
bson_to_zval_ex(bson_get_data(&read_prefs->tags), read_prefs->tags.len, &state);
1353-
add_assoc_zval_ex(retval, ZEND_STRS("tags"), state.zchild);
1361+
#if PHP_VERSION_ID >= 70000
1362+
ADD_ASSOC_ZVAL_EX(retval, "tags", &state.zchild);
1363+
#else
1364+
ADD_ASSOC_ZVAL_EX(retval, "tags", state.zchild);
1365+
#endif
13541366
} else {
1355-
add_assoc_null_ex(retval, ZEND_STRS("tags"));
1367+
ADD_ASSOC_NULL_EX(retval, "tags");
13561368
}
13571369
} /* }}} */
13581370

@@ -1370,16 +1382,16 @@ void php_phongo_write_concern_to_zval(zval *retval, const mongoc_write_concern_t
13701382
} else if (w != MONGOC_WRITE_CONCERN_W_DEFAULT) {
13711383
ADD_ASSOC_LONG_EX(retval, ZEND_STRS("w"), w);
13721384
} else {
1373-
add_assoc_null_ex(retval, ZEND_STRS("w"));
1385+
ADD_ASSOC_NULL_EX(retval, ZEND_STRS("w"));
13741386
}
13751387

1376-
add_assoc_bool_ex(retval, ZEND_STRS("wmajority"), mongoc_write_concern_get_wmajority(write_concern));
1388+
ADD_ASSOC_BOOL_EX(retval, ZEND_STRS("wmajority"), mongoc_write_concern_get_wmajority(write_concern));
13771389
ADD_ASSOC_LONG_EX(retval, ZEND_STRS("wtimeout"), mongoc_write_concern_get_wtimeout(write_concern));
13781390

13791391
if (write_concern->journal != MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT) {
1380-
add_assoc_bool_ex(retval, ZEND_STRS("journal"), mongoc_write_concern_get_journal(write_concern));
1392+
ADD_ASSOC_BOOL_EX(retval, "journal", mongoc_write_concern_get_journal(write_concern));
13811393
} else {
1382-
add_assoc_null_ex(retval, ZEND_STRS("journal"));
1394+
ADD_ASSOC_NULL_EX(retval, "journal");
13831395
}
13841396
} /* }}} */
13851397

@@ -1390,7 +1402,7 @@ void php_phongo_cursor_to_zval(zval *retval, const mongoc_cursor_t *cursor) /* {
13901402

13911403
ADD_ASSOC_LONG_EX(retval, "stamp", cursor->stamp);
13921404

1393-
#define _ADD_BOOL(z, field) add_assoc_bool_ex(z, ZEND_STRS(#field), cursor->field)
1405+
#define _ADD_BOOL(z, field) ADD_ASSOC_BOOL_EX(z, #field, cursor->field)
13941406
_ADD_BOOL(retval, is_command);
13951407
_ADD_BOOL(retval, sent);
13961408
_ADD_BOOL(retval, done);
@@ -1403,28 +1415,49 @@ void php_phongo_cursor_to_zval(zval *retval, const mongoc_cursor_t *cursor) /* {
14031415
* and current documents so that users can differentiate BSON arrays
14041416
* and documents. */
14051417
{
1418+
#if PHP_VERSION_ID >= 70000
1419+
zval zv;
1420+
#else
14061421
zval *zv;
1422+
#endif
14071423

14081424
bson_to_zval(bson_get_data(&cursor->query), cursor->query.len, &zv);
1409-
add_assoc_zval_ex(retval, ZEND_STRS("query"), zv);
1425+
#if PHP_VERSION_ID >= 70000
1426+
ADD_ASSOC_ZVAL_EX(retval, "query", &zv);
1427+
#else
1428+
ADD_ASSOC_ZVAL_EX(retval, "query", zv);
1429+
#endif
14101430
}
14111431
{
1432+
#if PHP_VERSION_ID >= 70000
1433+
zval zv;
1434+
#else
14121435
zval *zv;
1436+
#endif
14131437

14141438
bson_to_zval(bson_get_data(&cursor->fields), cursor->fields.len, &zv);
1415-
add_assoc_zval_ex(retval, ZEND_STRS("fields"), zv);
1439+
#if PHP_VERSION_ID >= 70000
1440+
ADD_ASSOC_ZVAL_EX(retval, "fields", &zv);
1441+
#else
1442+
ADD_ASSOC_ZVAL_EX(retval, "fields", zv);
1443+
#endif
14161444
}
14171445
{
1418-
#ifdef PHONGO_TODO_MAKE_STD_ZVAL
1419-
zval *read_preference = NULL;
1446+
#if PHP_VERSION_ID >= 70000
1447+
zval read_preference;
14201448

1449+
php_phongo_read_preference_to_zval(&read_preference, cursor->read_prefs);
1450+
ADD_ASSOC_ZVAL_EX(retval, "read_preference", &read_preference);
1451+
#else
1452+
zval *read_preference = NULL;
14211453
MAKE_STD_ZVAL(read_preference);
14221454
php_phongo_read_preference_to_zval(read_preference, cursor->read_prefs);
1423-
add_assoc_zval_ex(retval, ZEND_STRS("read_preference"), read_preference);
1455+
ADD_ASSOC_ZVAL_EX(retval, "read_preference", read_preference);
14241456
#endif
1457+
14251458
}
14261459

1427-
#define _ADD_INT(z, field) add_assoc_long_ex(z, ZEND_STRS(#field), cursor->field)
1460+
#define _ADD_INT(z, field) ADD_ASSOC_LONG_EX(z, #field, cursor->field)
14281461
_ADD_INT(retval, flags);
14291462
_ADD_INT(retval, skip);
14301463
_ADD_INT(retval, limit);
@@ -1434,10 +1467,18 @@ void php_phongo_cursor_to_zval(zval *retval, const mongoc_cursor_t *cursor) /* {
14341467

14351468
ADD_ASSOC_STRING(retval, "ns", (char *)cursor->ns);
14361469
if (cursor->current) {
1470+
#if PHP_VERSION_ID >= 70000
1471+
zval zv;
1472+
#else
14371473
zval *zv;
1474+
#endif
14381475

14391476
bson_to_zval(bson_get_data(cursor->current), cursor->current->len, &zv);
1440-
add_assoc_zval_ex(retval, ZEND_STRS("current_doc"), zv);
1477+
#if PHP_VERSION_ID >= 70000
1478+
ADD_ASSOC_ZVAL_EX(retval, "current_doc", &zv);
1479+
#else
1480+
ADD_ASSOC_ZVAL_EX(retval, "current_doc", zv);
1481+
#endif
14411482
}
14421483

14431484
} /* }}} */

src/MongoDB/BulkWrite.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -326,34 +326,34 @@ HashTable *php_phongo_bulkwrite_get_debug_info(zval *object, int *is_temp TSRMLS
326326
if (intern->bulk->database) {
327327
ADD_ASSOC_STRING(&retval, "database", intern->bulk->database);
328328
} else {
329-
add_assoc_null_ex(&retval, ZEND_STRS("database"));
329+
ADD_ASSOC_NULL_EX(&retval, "database");
330330
}
331331

332332
if (intern->bulk->collection) {
333333
ADD_ASSOC_STRING(&retval, "collection", intern->bulk->collection);
334334
} else {
335-
add_assoc_null_ex(&retval, ZEND_STRS("collection"));
335+
ADD_ASSOC_NULL_EX(&retval, "collection");
336336
}
337337

338-
add_assoc_bool_ex(&retval, ZEND_STRS("ordered"), intern->bulk->flags.ordered);
339-
add_assoc_bool_ex(&retval, ZEND_STRS("executed"), intern->bulk->executed);
338+
ADD_ASSOC_BOOL_EX(&retval, "ordered", intern->bulk->flags.ordered);
339+
ADD_ASSOC_BOOL_EX(&retval, "executed", intern->bulk->executed);
340340
ADD_ASSOC_LONG_EX(&retval, "server_id", intern->bulk->hint);
341341

342342
if (intern->bulk->write_concern) {
343343
#if PHP_VERSION_ID >= 70000
344344
zval write_concern;
345345

346346
php_phongo_write_concern_to_zval(&write_concern, intern->bulk->write_concern);
347-
add_assoc_zval_ex(&retval, ZEND_STRS("write_concern"), &write_concern);
347+
ADD_ASSOC_ZVAL_EX(&retval, "write_concern", &write_concern);
348348
#else
349349
zval *write_concern = NULL;
350350
MAKE_STD_ZVAL(write_concern);
351351

352352
php_phongo_write_concern_to_zval(write_concern, intern->bulk->write_concern);
353-
add_assoc_zval_ex(&retval, ZEND_STRS("write_concern"), write_concern);
353+
ADD_ASSOC_ZVAL_EX(&retval, "write_concern", write_concern);
354354
#endif
355355
} else {
356-
add_assoc_null_ex(&retval, ZEND_STRS("write_concern"));
356+
ADD_ASSOC_NULL_EX(&retval, "write_concern");
357357
}
358358

359359

src/MongoDB/Command.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,20 @@ HashTable *php_phongo_command_get_debug_info(zval *object, int *is_temp TSRMLS_D
147147
array_init_size(&retval, 1);
148148

149149
if (intern->bson) {
150-
zval *zv;
150+
#if PHP_VERSION_ID >= 70000
151+
zval zv;
152+
#else
153+
zval *zv;
154+
#endif
151155

152156
bson_to_zval(bson_get_data(intern->bson), intern->bson->len, &zv);
153-
add_assoc_zval_ex(&retval, ZEND_STRS("command"), zv);
157+
#if PHP_VERSION_ID >= 70000
158+
ADD_ASSOC_ZVAL_EX(&retval, "command", &zv);
159+
#else
160+
ADD_ASSOC_ZVAL_EX(&retval, "command", zv);
161+
#endif
154162
} else {
155-
add_assoc_null_ex(&retval, ZEND_STRS("command"));
163+
ADD_ASSOC_NULL_EX(&retval, "command");
156164
}
157165

158166
return Z_ARRVAL(retval);

src/MongoDB/Cursor.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,14 +270,14 @@ HashTable *php_phongo_cursor_get_debug_info(zval *object, int *is_temp TSRMLS_DC
270270
zval zcursor;
271271

272272
php_phongo_cursor_to_zval(&zcursor, intern->cursor);
273-
add_assoc_zval_ex(&retval, ZEND_STRS("cursor"), &zcursor);
273+
ADD_ASSOC_ZVAL_EX(&retval, "cursor", &zcursor);
274274
#else
275275
zval *zcursor = NULL;
276276

277277
MAKE_STD_ZVAL(zcursor);
278278

279279
php_phongo_cursor_to_zval(zcursor, intern->cursor);
280-
add_assoc_zval_ex(&retval, ZEND_STRS("cursor"), zcursor);
280+
ADD_ASSOC_ZVAL_EX(&retval, "cursor", zcursor);
281281
#endif
282282
} else {
283283
add_assoc_null_ex(&retval, ZEND_STRS("cursor"));

src/MongoDB/Manager.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -458,14 +458,14 @@ HashTable *php_phongo_manager_get_debug_info(zval *object, int *is_temp TSRMLS_D
458458

459459
array_init(&cluster);
460460
mongoc_set_for_each(intern->client->topology->description.servers, phongo_add_server_debug, &cluster);
461-
add_assoc_zval_ex(&retval, ZEND_STRS("cluster"), &cluster);
461+
ADD_ASSOC_ZVAL_EX(&retval, "cluster", &cluster);
462462
#else
463463
zval *cluster = NULL;
464464

465465
MAKE_STD_ZVAL(cluster);
466466
array_init(cluster);
467467
mongoc_set_for_each(intern->client->topology->description.servers, phongo_add_server_debug, cluster);
468-
add_assoc_zval_ex(&retval, ZEND_STRS("cluster"), cluster);
468+
ADD_ASSOC_ZVAL_EX(&retval, "cluster", cluster);
469469
#endif
470470
}
471471

src/MongoDB/Query.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,21 +186,37 @@ HashTable *php_phongo_query_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
186186
/* Avoid using PHONGO_TYPEMAP_NATIVE_ARRAY for decoding query and selector
187187
* documents so that users can differentiate BSON arrays and documents. */
188188
if (intern->query) {
189+
#if PHP_VERSION_ID >= 70000
190+
zval zv;
191+
#else
189192
zval *zv;
193+
#endif
190194

191195
bson_to_zval(bson_get_data(intern->query), intern->query->len, &zv);
192-
add_assoc_zval_ex(&retval, ZEND_STRS("query"), zv);
196+
#if PHP_VERSION_ID >= 70000
197+
ADD_ASSOC_ZVAL_EX(&retval, "query", &zv);
198+
#else
199+
ADD_ASSOC_ZVAL_EX(&retval, "query", zv);
200+
#endif
193201
} else {
194-
add_assoc_null_ex(&retval, ZEND_STRS("query"));
202+
ADD_ASSOC_NULL_EX(&retval, "query");
195203
}
196204

197205
if (intern->selector) {
206+
#if PHP_VERSION_ID >= 70000
207+
zval zv;
208+
#else
198209
zval *zv;
210+
#endif
199211

200212
bson_to_zval(bson_get_data(intern->selector), intern->selector->len, &zv);
201-
add_assoc_zval_ex(&retval, ZEND_STRS("selector"), zv);
213+
#if PHP_VERSION_ID >= 70000
214+
ADD_ASSOC_ZVAL_EX(&retval, "selector", &zv);
215+
#else
216+
ADD_ASSOC_ZVAL_EX(&retval, "selector", zv);
217+
#endif
202218
} else {
203-
add_assoc_null_ex(&retval, ZEND_STRS("selector"));
219+
ADD_ASSOC_NULL_EX(&retval, "selector");
204220
}
205221

206222
ADD_ASSOC_LONG_EX(&retval, "flags", intern->flags);

src/MongoDB/WriteConcernError.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,16 @@ HashTable *php_phongo_writeconcernerror_get_debug_info(zval *object, int *is_tem
190190
array_init_size(&retval, 3);
191191
ADD_ASSOC_STRING(&retval, "message", intern->message);
192192
ADD_ASSOC_LONG_EX(&retval, "code", intern->code);
193-
if (intern->info) {
193+
if (!Z_ISUNDEF(intern->info)) {
194+
#if PHP_VERSION_ID >= 70000
195+
Z_ADDREF(intern->info);
196+
ADD_ASSOC_ZVAL_EX(&retval, "info", &intern->info);
197+
#else
194198
Z_ADDREF_P(intern->info);
195-
add_assoc_zval_ex(&retval, ZEND_STRS("info"), intern->info);
199+
ADD_ASSOC_ZVAL_EX(&retval, "info", intern->info);
200+
#endif
196201
} else {
197-
add_assoc_null_ex(&retval, ZEND_STRS("info"));
202+
ADD_ASSOC_NULL_EX(&retval, "info");
198203
}
199204

200205
return Z_ARRVAL(retval);

src/MongoDB/WriteError.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,16 @@ HashTable *php_phongo_writeerror_get_debug_info(zval *object, int *is_temp TSRML
213213
ADD_ASSOC_STRING(&retval, "message", intern->message);
214214
ADD_ASSOC_LONG_EX(&retval, "code", intern->code);
215215
ADD_ASSOC_LONG_EX(&retval, "index", intern->index);
216-
if (intern->info) {
216+
if (!Z_ISUNDEF(intern->info)) {
217+
#if PHP_VERSION_ID >= 70000
218+
Z_ADDREF(intern->info);
219+
ADD_ASSOC_ZVAL_EX(&retval, "info", &intern->info);
220+
#else
217221
Z_ADDREF_P(intern->info);
218-
add_assoc_zval_ex(&retval, ZEND_STRS("info"), intern->info);
222+
ADD_ASSOC_ZVAL_EX(&retval, "info", intern->info);
223+
#endif
219224
} else {
220-
add_assoc_null_ex(&retval, ZEND_STRS("info"));
225+
ADD_ASSOC_NULL_EX(&retval, "info");
221226
}
222227

223228
return Z_ARRVAL(retval);

0 commit comments

Comments
 (0)