Revision ae69689a
Von Sven Schöling vor fast 7 Jahren hinzugefügt
SL/Controller/LoginScreen.pm | ||
---|---|---|
58 | 58 |
|
59 | 59 |
%::myconfig = $login ? $::auth->read_user(login => $login) : (); |
60 | 60 |
$::locale = Locale->new($::myconfig{countrycode}) if $::myconfig{countrycode}; |
61 |
SL::Dispatcher::AuthHandler::User->new->handle(countrycode => $::myconfig{countrycode});
|
|
61 |
SL::Dispatcher::AuthHandler::User->new->handle; |
|
62 | 62 |
|
63 | 63 |
$::request->layout(SL::Layout::Dispatcher->new(style => $::myconfig{menustyle})); |
64 | 64 |
|
Auch abrufbar als: Unified diff
Controller::LoginScreen: AuthHandler::handle ohne Argumente aufrufen
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.