https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=43167

            Bug ID: 43167
           Summary: Bug in C4::Ris::marc2ris: Destructive STDOUT closing
                    breaks under Plack/PSGI (Error 500) and causes 0-byte
                    exports when processing flawed MARC fields (e.g., 100
                    ind1 blank)
   Initiative type: ---
        Sponsorship ---
            status:
           Product: Koha
           Version: unspecified
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P5 - low
         Component: OPAC
          Assignee: [email protected]
          Reporter: [email protected]
        QA Contact: [email protected]
  Target Milestone: ---

In KOHA 23.05.01 when exporting certain records to RIS format via OPAC or
Intranet, the server throws an HTTP 500 Error. Plack error logs show: print()
on closed filehandle STDOUT at opac-export.pl.

This is triggered when the marc2ris function encounters a flawed MARC
record—specifically, we isolated the trigger to MARC field 100 having a
blank/empty Indicator 1, which breaks the author string evaluation.

When this parsing fails, it triggers a cascade effect due to legacy code in
/Koha/lib/C4/Ris.pm (sub marc2ris) that attempts to redirect STDOUT
destructively:

open my $oldout, qw{>}, "&STDOUT";
my $outvar;
close STDOUT;
open STDOUT,'>:encoding(utf8)', \$outvar;

Under a Plack/PSGI environment, closing STDOUT destroys the HTTP output stream
handle (_GEN_...), making it impossible to restore it at the end of the
function. Any subsequent print call throws an HTTP 500.

Furthermore, for analytic records lacking authors (like serials) where the
output size doesn't exceed the memory buffer, skipping a proper STDOUT flush
before the return causes the function to return an uninitialized variable,
resulting in a 0-byte RIS file.

Proposed Solution:

Use local *STDOUT for a safe memory redirection, and close the localized handle
strictly to flush the UTF-8 buffer before returning.

Remove lines:

open my $oldout, qw{>}, "&STDOUT";
# ...
close STDOUT;
open STDOUT,'>:encoding(utf8)', \$outvar;

Replace with:

local *STDOUT;
open STDOUT,'>:encoding(utf8)', \$outvar;


At the end of the function, remove the $oldout restoration and ensure the
buffer is flushed:

    # close STDOUT;
    # open STDOUT, ">&", $oldout;

Replace with:

    close STDOUT; # Flushes the buffer into $outvar
    return $outvar;

-- 
You are receiving this mail because:
You are watching all bug changes.
_______________________________________________
Koha-bugs mailing list -- [email protected]
To unsubscribe send an email to [email protected]
website : http://www.koha-community.org/
git : http://git.koha-community.org/
bugs : http://bugs.koha-community.org/

Reply via email to