From ec9040577ebfbdae8b3cd6aa66a98a6ba96e77e8 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Mon, 4 Oct 2021 14:25:34 +0200 Subject: [PATCH] paycore: Prevent multiple concurrent payment groups One of the fundamental constraints of the payment groups idea is that there may only ever be one group in flight at any point in time, so if we find a group that is in flight, any new `sendpay` or `sendonion` must match its `groupid`. --- lightningd/pay.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lightningd/pay.c b/lightningd/pay.c index e2593e6c3..5ae434018 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -910,12 +910,24 @@ send_payment_core(struct lightningd *ld, return sendpay_success(cmd, payments[i]); case PAYMENT_PENDING: + /* At most one payment group can be in-flight at any + * time. */ + if (payments[i]->groupid != group) { + return command_fail( + cmd, PAY_IN_PROGRESS, + "Payment with groupid=%" PRIu64 + " still in progress, cannot retry before " + "that completes.", + payments[i]->groupid); + } + /* Can't mix non-parallel and parallel payments! */ if (!payments[i]->partid != !partid) { return command_fail(cmd, PAY_IN_PROGRESS, "Already have %s payment in progress", payments[i]->partid ? "parallel" : "non-parallel"); } + if (payments[i]->partid == partid) { /* You can't change details while it's pending */ if (!amount_msat_eq(payments[i]->msatoshi, msat)) {