@@ -44,7 +44,10 @@ static int listpackValidateIntegrityCb(unsigned char* str, size_t size, RdbParse
44
44
static int zipmapValidateIntegrityCb (unsigned char * str , size_t size , RdbParser * p );
45
45
static int intsetValidateIntegrityCb (unsigned char * str , size_t size , RdbParser * p );
46
46
typedef int (* singleStringTypeValidateCb )(unsigned char * str , size_t size , RdbParser * p ); // return 0 for error
47
- static RdbStatus singleStringTypeHandling (RdbParser * p , singleStringTypeValidateCb validateCb , char * callerName );
47
+ static RdbStatus singleStringTypeHandling (RdbParser * p ,
48
+ singleStringTypeValidateCb validateCb ,
49
+ int digestHdrSize ,
50
+ char * callerName );
48
51
void moduleTypeNameByID (char * name , uint64_t moduleid );
49
52
50
53
/*** init & release ***/
@@ -315,7 +318,8 @@ RdbStatus elementRawString(RdbParser *p) {
315
318
break ;
316
319
default :
317
320
RDB_reportError (p , RDB_ERR_STRING_UNKNOWN_ENCODING_TYPE ,
318
- "elementRawString(): Unknown RDB string encoding type: %lu" , strCtx -> len );
321
+ "elementRawString(): Unknown RDB string encoding type: %lu (0x%lx)" ,
322
+ strCtx -> len , strCtx -> len );
319
323
return RDB_STATUS_ERROR ;
320
324
}
321
325
}
@@ -419,7 +423,8 @@ RdbStatus elementRawString(RdbParser *p) {
419
423
}
420
424
421
425
RDB_reportError (p , RDB_ERR_STRING_UNKNOWN_ENCODING_TYPE ,
422
- "elementRawString(): Unknown RDB string encoding type: %lu" , strCtx -> encoding );
426
+ "elementRawString(): Unknown RDB string encoding type: %lu (0x%lx)" ,
427
+ strCtx -> encoding , strCtx -> encoding );
423
428
return RDB_STATUS_ERROR ;
424
429
}
425
430
@@ -432,12 +437,13 @@ RdbStatus elementRawString(RdbParser *p) {
432
437
}
433
438
434
439
RdbStatus elementRawListZL (RdbParser * p ) {
435
- return singleStringTypeHandling (p , ziplistValidateIntegrityCb , "elementRawListZL" );
440
+ return singleStringTypeHandling (p , ziplistValidateIntegrityCb , 0 , "elementRawListZL" );
436
441
}
437
442
438
443
RdbStatus elementRawHash (RdbParser * p ) {
444
+ BulkInfo * binfo ;
439
445
uint64_t expireAt ;
440
- int numDigits ;
446
+ int offset , processedBytes ;
441
447
size_t len ;
442
448
unsigned char * unusedData ;
443
449
@@ -456,18 +462,25 @@ RdbStatus elementRawHash(RdbParser *p) {
456
462
switch (p -> elmCtx .state ) {
457
463
458
464
case ST_RAW_HASH_HEADER :
459
- numDigits = 0 ;
460
- aggMakeRoom (p , 10 ); /* worse case 9 bytes for len */
465
+ offset = processedBytes = 0 ;
466
+
467
+ aggMakeRoom (p , 20 ); /* > optional 8 bytes + worse case 9 bytes for len */
468
+ if (p -> currOpcode == RDB_TYPE_HASH_METADATA ) {
469
+ /* load min expiration time. Do nothing with it since each field
470
+ * goanna report anyway its expiration time */
471
+ IF_NOT_OK_RETURN (rdbLoad (p , 8 , RQ_ALLOC_REF , rawCtx -> at , & binfo ));
472
+ offset = processedBytes = 8 ;
473
+ }
461
474
462
475
IF_NOT_OK_RETURN (rdbLoadLen (p , NULL , & hashCtx -> numFields ,
463
- (unsigned char * ) rawCtx -> at , & numDigits ));
476
+ (unsigned char * ) rawCtx -> at + offset , & processedBytes ));
464
477
465
478
/*** ENTER SAFE STATE ***/
466
479
467
480
hashCtx -> visitField = 0 ;
468
481
469
482
IF_NOT_OK_RETURN (cbHandleBegin (p , DATA_SIZE_UNKNOWN_AHEAD ));
470
- IF_NOT_OK_RETURN (aggUpdateWritten (p , numDigits ));
483
+ IF_NOT_OK_RETURN (aggUpdateWritten (p , processedBytes ));
471
484
472
485
if (hashCtx -> numFields == 0 )
473
486
return nextParsingElement (p , PE_RAW_END_KEY ); /* empty-key */
@@ -476,13 +489,13 @@ RdbStatus elementRawHash(RdbParser *p) {
476
489
477
490
case ST_RAW_HASH_READ_NEXT_EXPIRE :
478
491
if (p -> parsingElement == PE_RAW_HASH_META ) {
479
- numDigits = 0 ;
492
+ processedBytes = 0 ;
480
493
aggMakeRoom (p , 32 );
481
494
IF_NOT_OK_RETURN (rdbLoadLen (p , NULL , & expireAt ,
482
495
(unsigned char * ) rawCtx -> at ,
483
- & numDigits ));
496
+ & processedBytes ));
484
497
/*** ENTER SAFE STATE ***/
485
- IF_NOT_OK_RETURN (aggUpdateWritten (p , numDigits ));
498
+ IF_NOT_OK_RETURN (aggUpdateWritten (p , processedBytes ));
486
499
}
487
500
updateElementState (p , ST_RAW_HASH_READ_NEXT_FIELD_STR , 0 ); /* fall-thru */
488
501
@@ -518,27 +531,28 @@ RdbStatus elementRawHash(RdbParser *p) {
518
531
}
519
532
520
533
RdbStatus elementRawHashZL (RdbParser * p ) {
521
- return singleStringTypeHandling (p , ziplistValidateIntegrityCb , "elementRawHashZL" );
534
+ return singleStringTypeHandling (p , ziplistValidateIntegrityCb , 0 , "elementRawHashZL" );
522
535
}
523
536
524
537
RdbStatus elementRawHashLP (RdbParser * p ) {
525
- return singleStringTypeHandling (p , listpackValidateIntegrityCb , "elementRawHashLP" );
538
+ return singleStringTypeHandling (p , listpackValidateIntegrityCb , 0 , "elementRawHashLP" );
526
539
}
527
540
528
541
RdbStatus elementRawHashLPEx (RdbParser * p ) {
529
- return singleStringTypeHandling (p , listpackValidateIntegrityCb , "elementRawHashLPEx" );
542
+ int digestMinExpireSize = (p -> currOpcode != RDB_TYPE_HASH_LISTPACK_EX_PRE_GA ) ? 8 : 0 ;
543
+ return singleStringTypeHandling (p , listpackValidateIntegrityCb , digestMinExpireSize , "elementRawHashLPEx" );
530
544
}
531
545
532
546
RdbStatus elementRawHashZM (RdbParser * p ) {
533
- return singleStringTypeHandling (p , zipmapValidateIntegrityCb , "elementRawHashZM" );
547
+ return singleStringTypeHandling (p , zipmapValidateIntegrityCb , 0 , "elementRawHashZM" );
534
548
}
535
549
536
550
RdbStatus elementRawSetIS (RdbParser * p ) {
537
- return singleStringTypeHandling (p , intsetValidateIntegrityCb , "elementRawSetIS" );
551
+ return singleStringTypeHandling (p , intsetValidateIntegrityCb , 0 , "elementRawSetIS" );
538
552
}
539
553
540
554
RdbStatus elementRawSetLP (RdbParser * p ) {
541
- return singleStringTypeHandling (p , listpackValidateIntegrityCb , "elementRawSetLP" );
555
+ return singleStringTypeHandling (p , listpackValidateIntegrityCb , 0 , "elementRawSetLP" );
542
556
}
543
557
544
558
RdbStatus elementRawSet (RdbParser * p ) {
@@ -595,11 +609,11 @@ RdbStatus elementRawSet(RdbParser *p) {
595
609
}
596
610
597
611
RdbStatus elementRawZsetLP (RdbParser * p ) {
598
- return singleStringTypeHandling (p , listpackValidateIntegrityCb , "elementRawZsetLP" );
612
+ return singleStringTypeHandling (p , listpackValidateIntegrityCb , 0 , "elementRawZsetLP" );
599
613
}
600
614
601
615
RdbStatus elementRawZsetZL (RdbParser * p ) {
602
- return singleStringTypeHandling (p , ziplistValidateIntegrityCb , "elementRawZsetZL" );
616
+ return singleStringTypeHandling (p , ziplistValidateIntegrityCb , 0 , "elementRawZsetZL" );
603
617
}
604
618
605
619
RdbStatus elementRawZset (RdbParser * p ) {
@@ -1122,8 +1136,11 @@ static int intsetValidateIntegrityCb(unsigned char* str, size_t size, RdbParser
1122
1136
return intsetValidateIntegrity (str , size , 1 );
1123
1137
}
1124
1138
1125
- static RdbStatus singleStringTypeHandling (RdbParser * p , singleStringTypeValidateCb validateCb , char * callerName ) {
1126
-
1139
+ static RdbStatus singleStringTypeHandling (RdbParser * p ,
1140
+ singleStringTypeValidateCb validateCb ,
1141
+ int digestHdrSize ,
1142
+ char * callerName ) {
1143
+ BulkInfo * binfo ;
1127
1144
enum RAW_SINGLE_STRING_TYPE_STATES {
1128
1145
ST_RAW_SSTYPE_START = 0 ,
1129
1146
ST_RAW_SSTYPE_CALL_STR , /* Call PE_RAW_STRING as sub-element */
@@ -1132,6 +1149,12 @@ static RdbStatus singleStringTypeHandling(RdbParser *p, singleStringTypeValidate
1132
1149
1133
1150
switch (p -> elmCtx .state ) {
1134
1151
case ST_RAW_SSTYPE_START :
1152
+ if (digestHdrSize ) {
1153
+ IF_NOT_OK_RETURN (aggMakeRoom (p , digestHdrSize ));
1154
+ IF_NOT_OK_RETURN (rdbLoad (p , digestHdrSize , RQ_ALLOC_REF , p -> rawCtx .at , & binfo ));
1155
+ /*** ENTER SAFE STATE ***/
1156
+ IF_NOT_OK_RETURN (aggUpdateWritten (p , digestHdrSize ));
1157
+ }
1135
1158
/* take care string won't propagate for having integrity check */
1136
1159
IF_NOT_OK_RETURN (cbHandleBegin (p , DATA_SIZE_UNKNOWN_AHEAD ));
1137
1160
0 commit comments