12
12
13
13
#define DEFAULT_CAP 64
14
14
#define MAX_NUMBER 1024
15
+ // avoid circular reference while encodeing
16
+ #define MAX_DEPTH 128
15
17
16
18
#define BSON_REAL 1
17
19
#define BSON_STRING 2
@@ -236,7 +238,7 @@ write_double(struct bson *b, lua_Number d) {
236
238
}
237
239
}
238
240
239
- static void pack_dict (lua_State * L , struct bson * b , bool array );
241
+ static void pack_dict (lua_State * L , struct bson * b , bool array , int depth );
240
242
241
243
static inline void
242
244
append_key (struct bson * bs , int type , const char * key , size_t sz ) {
@@ -268,7 +270,7 @@ append_number(struct bson *bs, lua_State *L, const char *key, size_t sz) {
268
270
}
269
271
270
272
static void
271
- append_table (struct bson * bs , lua_State * L , const char * key , size_t sz ) {
273
+ append_table (struct bson * bs , lua_State * L , const char * key , size_t sz , int depth ) {
272
274
size_t len = lua_rawlen (L , -1 );
273
275
bool isarray = false;
274
276
if (len > 0 ) {
@@ -284,7 +286,7 @@ append_table(struct bson *bs, lua_State *L, const char *key, size_t sz) {
284
286
} else {
285
287
append_key (bs , BSON_DOCUMENT , key , sz );
286
288
}
287
- pack_dict (L , bs , isarray );
289
+ pack_dict (L , bs , isarray , depth );
288
290
}
289
291
290
292
static void
@@ -297,7 +299,7 @@ write_binary(struct bson *b, const void * buffer, size_t sz) {
297
299
}
298
300
299
301
static void
300
- append_one (struct bson * bs , lua_State * L , const char * key , size_t sz ) {
302
+ append_one (struct bson * bs , lua_State * L , const char * key , size_t sz , int depth ) {
301
303
int vt = lua_type (L ,-1 );
302
304
switch (vt ) {
303
305
case LUA_TNUMBER :
@@ -385,7 +387,7 @@ append_one(struct bson *bs, lua_State *L, const char *key, size_t sz) {
385
387
break ;
386
388
}
387
389
case LUA_TTABLE :
388
- append_table (bs , L , key , sz );
390
+ append_table (bs , L , key , sz , depth + 1 );
389
391
break ;
390
392
case LUA_TBOOLEAN :
391
393
append_key (bs , BSON_BOOLEAN , key , sz );
@@ -407,7 +409,10 @@ bson_numstr( char *str, unsigned int i ) {
407
409
}
408
410
409
411
static void
410
- pack_dict (lua_State * L , struct bson * b , bool isarray ) {
412
+ pack_dict (lua_State * L , struct bson * b , bool isarray , int depth ) {
413
+ if (depth > MAX_DEPTH ) {
414
+ luaL_error (L , "Too depth while encoding bson" );
415
+ }
411
416
luaL_checkstack (L , 16 , NULL ); // reserve enough stack space to pack table
412
417
int length = reserve_length (b );
413
418
lua_pushnil (L );
@@ -424,7 +429,7 @@ pack_dict(lua_State *L, struct bson *b, bool isarray) {
424
429
sz = bson_numstr (numberkey , (unsigned int )lua_tointeger (L ,-2 )- 1 );
425
430
key = numberkey ;
426
431
427
- append_one (b , L , key , sz );
432
+ append_one (b , L , key , sz , depth );
428
433
lua_pop (L ,1 );
429
434
} else {
430
435
switch (kt ) {
@@ -433,12 +438,12 @@ pack_dict(lua_State *L, struct bson *b, bool isarray) {
433
438
lua_pushvalue (L ,-2 );
434
439
lua_insert (L ,-2 );
435
440
key = lua_tolstring (L ,-2 ,& sz );
436
- append_one (b , L , key , sz );
441
+ append_one (b , L , key , sz , depth );
437
442
lua_pop (L ,2 );
438
443
break ;
439
444
case LUA_TSTRING :
440
445
key = lua_tolstring (L ,-2 ,& sz );
441
- append_one (b , L , key , sz );
446
+ append_one (b , L , key , sz , depth );
442
447
lua_pop (L ,1 );
443
448
break ;
444
449
default :
@@ -452,7 +457,7 @@ pack_dict(lua_State *L, struct bson *b, bool isarray) {
452
457
}
453
458
454
459
static void
455
- pack_ordered_dict (lua_State * L , struct bson * b , int n ) {
460
+ pack_ordered_dict (lua_State * L , struct bson * b , int n , int depth ) {
456
461
int length = reserve_length (b );
457
462
int i ;
458
463
for (i = 0 ;i < n ;i += 2 ) {
@@ -462,7 +467,7 @@ pack_ordered_dict(lua_State *L, struct bson *b, int n) {
462
467
luaL_error (L , "Argument %d need a string" , i + 1 );
463
468
}
464
469
lua_pushvalue (L , i + 2 );
465
- append_one (b , L , key , sz );
470
+ append_one (b , L , key , sz , depth );
466
471
lua_pop (L ,1 );
467
472
}
468
473
write_byte (b ,0 );
@@ -848,7 +853,7 @@ lencode(lua_State *L) {
848
853
bson_create (& b );
849
854
lua_settop (L ,1 );
850
855
luaL_checktype (L , 1 , LUA_TTABLE );
851
- pack_dict (L , & b , false);
856
+ pack_dict (L , & b , false, 0 );
852
857
void * ud = lua_newuserdata (L , b .size );
853
858
memcpy (ud , b .ptr , b .size );
854
859
bson_destroy (& b );
@@ -864,7 +869,7 @@ lencode_order(lua_State *L) {
864
869
if (n %2 != 0 ) {
865
870
return luaL_error (L , "Invalid ordered dict" );
866
871
}
867
- pack_ordered_dict (L , & b , n );
872
+ pack_ordered_dict (L , & b , n , 0 );
868
873
lua_settop (L ,1 );
869
874
void * ud = lua_newuserdata (L , b .size );
870
875
memcpy (ud , b .ptr , b .size );
0 commit comments