From: Jeff Davis Date: Wed, 17 May 2017 21:16:26 +0000 (-0700) Subject: LP#1691563: Prevent "Use of freed value in iteration" error during adjust to zero X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=577b0171dc1a78d027cb7ce9ac691b8b27ddf052;p=working%2FEvergreen.git LP#1691563: Prevent "Use of freed value in iteration" error during adjust to zero Signed-off-by: Jeff Davis --- diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm index 9da9dd8205..deca084b5c 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm @@ -801,7 +801,11 @@ sub bill_payment_map_for_xact { } # Try to map payments to bills by amounts starting with the - # largest payments: + # largest payments. + # To avoid modifying the array we're iterating over (which can result in a + # "Use of freed value in iteration" error), we create a copy of the + # payments array and remove handled payments from that instead. + my @handled_payments = @$payments; foreach my $payment (sort {$b->amount() <=> $a->amount()} @$payments) { my @bills2pay = grep {$_->{bill}->amount() == $payment->amount()} @entries; if (@bills2pay) { @@ -809,10 +813,13 @@ sub bill_payment_map_for_xact { $entry->{bill}->amount(0); push @{$entry->{payments}}, $payment; # Remove the payment from the master list. - my @p = grep {$_->id() != $payment->id()} @$payments; - $payments = \@p; + my @p = grep {$_->id() != $payment->id()} @handled_payments; + @handled_payments = @p; } } + # Now, update our list of payments so that it only includes unhandled + # (unmapped) payments. + $payments = \@handled_payments; # Map remaining bills to payments in whatever order. foreach my $entry (grep {$_->{bill}->amount() > 0} @entries) {