@@ -376,28 +376,34 @@ static RdbxFilter *createHandlersFilterCommon(RdbParser *p,
376
376
ctx -> exclude = exclude ;
377
377
ctx -> cbReturnValue = RDB_OK ;
378
378
379
+ /* Register destructor only once to avoid double-free */
380
+ RdbFreeFunc destructor = deleteFilterCtx ;
381
+
379
382
if (RDB_getNumHandlers (p , RDB_LEVEL_DATA )> 0 ) {
380
383
RdbHandlersDataCallbacks dataCb ;
381
384
defaultFilterDataCb (& dataCb );
382
385
dataCb .handleNewKey = handleNewKey ;
383
386
dataCb .handleNewDb = handleNewDb ;
384
- RDB_createHandlersData (p , & dataCb , ctx , deleteFilterCtx );
387
+ RDB_createHandlersData (p , & dataCb , ctx , destructor );
388
+ destructor = NULL ; /* Only register destructor once */
385
389
}
386
390
387
391
if (RDB_getNumHandlers (p , RDB_LEVEL_STRUCT )> 0 ) {
388
392
RdbHandlersStructCallbacks structCb ;
389
393
defaultFilterStructCb (& structCb );
390
394
structCb .handleNewKey = handleNewKey ;
391
395
structCb .handleNewDb = handleNewDb ;
392
- RDB_createHandlersStruct (p , & structCb , ctx , deleteFilterCtx );
396
+ RDB_createHandlersStruct (p , & structCb , ctx , destructor );
397
+ destructor = NULL ; /* Only register destructor once */
393
398
}
394
399
395
400
if (RDB_getNumHandlers (p , RDB_LEVEL_RAW )> 0 ) {
396
401
RdbHandlersRawCallbacks rawCb ;
397
402
defaultFilterRawCb (& rawCb );
398
403
rawCb .handleNewKey = handleNewKey ;
399
404
rawCb .handleNewDb = handleNewDb ;
400
- RDB_createHandlersRaw (p , & rawCb , ctx , deleteFilterCtx );
405
+ RDB_createHandlersRaw (p , & rawCb , ctx , destructor );
406
+ destructor = NULL ; /* Only register destructor once */
401
407
}
402
408
return ctx ;
403
409
}
0 commit comments