From a089e2f7ed78ffb29ba3dd5645d819dd353f4eb0 Mon Sep 17 00:00:00 2001
From: Nick Clemens <nick@bywatersolutions.com>
Date: Mon, 23 Jan 2023 12:51:48 +0000
Subject: [PATCH] Bug 31259: Escape infinite loop when lime cannot wrap enough

It seems the wrapping here works with words, not characters. If a line is too long,
or too far over, we can't trim it enough. We need to escape if successive loops are
not changing the line

To test:
 1 - Using sample data, edit the layout to match picture in comment 9
 2 - Add some borrowers to a batch
 3 - Attempt to export batch and save PDF
 4 - Staff client waits
 5 - ps aux | grep card
 6 - Note the job keeps running
 7 - Kill it
 8 - Apply patch
 9 - Restart_all
10 - Export batch again
11 - Success, you get a badly formatted PDF, rather than nothing
12 - Note the PDF does not show "Yakama Nation Library"
13 - Edit layout, male "Lower left X" 20 instead of 220
14 - Export again and note text field 1 shows correctly

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
---
 C4/Patroncards/Patroncard.pm | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/C4/Patroncards/Patroncard.pm b/C4/Patroncards/Patroncard.pm
index ea1d077727..9a8901ae0e 100644
--- a/C4/Patroncards/Patroncard.pm
+++ b/C4/Patroncards/Patroncard.pm
@@ -260,6 +260,7 @@ sub draw_text {
 #        my $string_width = ($font_units_width * $text_attribs->{'font_size'}) / $units_per_em;
         my $string_width = C4::Creators::PDF->StrWidth($line, $text_attribs->{'font'}, $text_attribs->{'font_size'});
         if (($string_width + $text_attribs->{'llx'}) > $self->{'width'}) {
+            my $cur_line = "";
             WRAP_LINES:
             while (1) {
 #                $line =~ m/^.*(\s\b.*\b\s*|\s&|\<\b.*\b\>)$/; # original regexp... can be removed after dev stage is over
@@ -287,6 +288,12 @@ sub draw_text {
                         push @lines, {line=> $line, Tx => $Tx, Ty => $Ty, Tw => $Tw};
                         last WRAP_LINES;
                     }
+                } else {
+                    # We only split lines on spaces - it seems if we push a line too far, it can end
+                    # never getting short enough in which case we need to escape and the malformed PDF
+                    # will indicate the layout problem
+                    last WRAP_LINES if $cur_line eq $line;
+                    $cur_line = $line;
                 }
             }
         }
-- 
2.39.2