Skip to content

Commit 6cd419a

Browse files
committed
fix: memory leak when an error occur in pipeline mode.
1 parent c351ef0 commit 6cd419a

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/Fast.xs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,24 +440,29 @@ void run_cmd_impl_pipeline(pTHX_ Redis__Cluster__Fast self, int argc, const char
440440
node = get_node_by_random(aTHX_ self);
441441
if (node == NULL) {
442442
reply_t->error = newSVpvf("%s", "No node found");
443-
return;
443+
goto error;
444444
}
445445

446446
status = redisClusterAsyncCommandArgvToNode(self->acc, node, replyCallbackPipeline, reply_pipeline_t, argc, argv, argvlen);
447447
if (status != REDIS_OK) {
448448
DEBUG_MSG("error: err=%d errstr=%s", self->acc->err, self->acc->errstr);
449449
reply_t->error = newSVpvf("%s", self->acc->errstr);
450-
return;
450+
goto error;
451451
}
452452
} else {
453453
DEBUG_MSG("error: err=%d errstr=%s", self->acc->err, self->acc->errstr);
454454
reply_t->error = newSVpvf("%s", self->acc->errstr);
455-
return;
455+
goto error;
456456
}
457457
}
458458

459459
self->pipeline_callback_remain++;
460460
DEBUG_MSG("pipeline callback remain: %ld", self->pipeline_callback_remain);
461+
return;
462+
463+
error:
464+
SvREFCNT_dec(reply_pipeline_t->cb);
465+
Safefree(reply_pipeline_t);
461466
}
462467

463468
int Redis__Cluster__Fast_run_event_loop(pTHX_ Redis__Cluster__Fast self) {

0 commit comments

Comments
 (0)