Found this warn in moremember on 22.11 (no longer in master): [2024/10/16 09:57:01] [WARN] Odd number of elements in anonymous hash at /usr/share/koha/members/moremember.pl line 127. Coming from: $template->param( csrf_token => Koha::Token->new->generate_csrf({ session_id => $input->cookie('CGISESSID'),}), ); Note that CGI::cookie may return an empty list! From CGI code: return () unless $self->{'.cookies'}->{$name}; So we should put a scalar in front of this call to cookie. But the problem is wider looking at this grep: git grep -P "CGISESSID['\"]\)," C4/Auth.pm: $in->{query}->cookie("CGISESSID"), => From: $sth->execute( $borrowernumber, $in->{query}->cookie("CGISESSID"), Note that if there would be no cookie, the parameter order will be wrong. [OK] C4/Output.pm: session_id => scalar $query->cookie('CGISESSID'), acqui/check_uniqueness.pl: check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } ); => Wrong. No cookie: wrong order. Etc. authorities/authorities-home.pl: sessionid => $query->cookie("CGISESSID"), authorities/ysearch.pl:my ( $auth_status) = check_cookie_auth( $query->cookie('CGISESSID'), { catalogue => 1 } ); catalogue/image.pl: check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } ); catalogue/search-history.pl: sessionid => $cgi->cookie("CGISESSID"), catalogue/search.pl: sessionid => $cgi->cookie("CGISESSID"), cataloguing/plugin_launcher.pl: check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } ); cataloguing/ysearch.pl:my ( $auth_status ) = check_cookie_auth( $input->cookie('CGISESSID'), { editcatalogue => '*' } ); labels/label-create-csv.pl: check_cookie_auth( $cgi->cookie('CGISESSID'), { catalogue => 1 } ); labels/label-create-xml.pl: check_cookie_auth( $cgi->cookie('CGISESSID'), { catalogue => 1 } ); members/two_factor_auth.pl: session_id => scalar $cgi->cookie('CGISESSID'), opac/opac-authorities-home.pl: sessionid => $query->cookie("CGISESSID"), opac/opac-search-history.pl: sessionid => $cgi->cookie("CGISESSID"), opac/opac-search.pl: sessionid => $cgi->cookie("CGISESSID"), opac/svc/checkout_notes:my ( $auth_status ) = check_cookie_auth( $query->cookie('CGISESSID'), {} ); plugins/plugins-enable.pl:my ( $auth_status ) = check_cookie_auth( $input->cookie('CGISESSID'), { plugins => 'manage' } ); serials/create-numberpattern.pl:my ($auth_status) = check_cookie_auth($input->cookie('CGISESSID'), { serials => '*' }); serials/lateissues-export.pl: check_cookie_auth( $query->cookie('CGISESSID'), { catalogue => 1 } ); serials/subscription-frequency.pl:my ($auth_status) = check_cookie_auth($input->cookie('CGISESSID'), { serials => '*' }); serials/subscription-numberpattern.pl:my ($auth_status) = check_cookie_auth($input->cookie('CGISESSID'), { serials => '*' }); svc/article_request: check_cookie_auth( $cgi->cookie('CGISESSID'), { circulate => 'circulate_remaining_permissions' } ); svc/barcode:my ( $auth_status ) = check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => '*' } ); svc/cataloguing/automatic_linker.pl: C4::Auth::check_cookie_auth( $input->cookie('CGISESSID'), { svc/checkin: check_cookie_auth( $input->cookie('CGISESSID'), svc/checkout_notes:my ( $auth_status ) = check_cookie_auth( $query->cookie('CGISESSID'), { circulate => 'manage_checkout_notes' } ); svc/club/cancel_enrollment: check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } ); svc/club/delete:my ( $auth_status ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'edit_clubs' } ); svc/club/enroll: check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } ); svc/club/template/delete:my ( $auth_status ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'edit_templates' } ); svc/cover_images: $input->cookie('CGISESSID'), svc/creator_batches:my ( $auth_status ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { catalogue => 1 } ); svc/holds: check_cookie_auth( $input->cookie('CGISESSID'), svc/mana/increment: check_cookie_auth( $input->cookie('CGISESSID'), svc/mana/share: check_cookie_auth( $input->cookie('CGISESSID'), svc/mana/use: check_cookie_auth( $input->cookie('CGISESSID'), svc/members/add_to_list: $input->cookie('CGISESSID'), svc/problem_reports:my ( $auth_status ) = check_cookie_auth( $query->cookie('CGISESSID'), { problem_reports => 1 } ); svc/recall:my ( $auth_status, $sessionID ) = check_cookie_auth( $input->cookie('CGISESSID'), { recall => 'manage_recalls' } ); svc/renew: check_cookie_auth( $input->cookie('CGISESSID'), tools/batch_records_ajax.pl: check_cookie_auth( $input->cookie('CGISESSID'), { tools => 'manage_staged_marc' } );