Controller::LoginScreen: AuthHandler::handle ohne Argumente aufrufen
authorSven Schöling <s.schoeling@linet-services.de>
Wed, 24 Jan 2018 15:16:31 +0000 (16:16 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Wed, 24 Jan 2018 15:16:31 +0000 (16:16 +0100)
Abgesehen davon, dass die Parameter nicht mehr benutzt werden, behebt
das einen ganz ekeligen Bug: "panic: attempt to copy freed scalar"

Das Problem ist, dass der AuthHandler selber das Einloggen übernimmt und
dafür %::myconfig neu beschreibt. Wenn währenddessen aber ein Alias von
einem %::myconfig Value auf dem Stack liegt, wird der sofort freigegeben
weil der Stack nicht refcounted ist.

Normalerweise fällt das nicht weiter auf, und die Daten werden im
final pass aufgeräumt. Aber mit backtrace_on_error wird bei einem Fehler
sofort ein Carp::confess aufgerufen, und das nimmt für den Stacktrace
den Stack auseinander und stolpert dabei über den bereits freigegeben Wert.

SL/Controller/LoginScreen.pm

index 8ac63a7..673c6b4 100644 (file)
@@ -58,7 +58,7 @@ sub action_login {
 
   %::myconfig      = $login ? $::auth->read_user(login => $login) : ();
   $::locale        = Locale->new($::myconfig{countrycode}) if $::myconfig{countrycode};
-  SL::Dispatcher::AuthHandler::User->new->handle(countrycode => $::myconfig{countrycode});
+  SL::Dispatcher::AuthHandler::User->new->handle;
 
   $::request->layout(SL::Layout::Dispatcher->new(style => $::myconfig{menustyle}));