XenForo_FrontController::dispatch has a catch statement which checks if an exception is printable (XenForo_Exception + is printable), and then calls postDispatch with the Exception response.
However, there is no explicit code path which ensures any active transaction is rolledback before calling postDispatch.
This causes all user status updates (including user session updates) done in postDispatch to be automatically included in a transaction destined to be rolled back.
If the Exception isn't printable, it calls XenForo_Error::logException() which rolls back any transactions.
However, there is no explicit code path which ensures any active transaction is rolledback before calling postDispatch.
This causes all user status updates (including user session updates) done in postDispatch to be automatically included in a transaction destined to be rolled back.
If the Exception isn't printable, it calls XenForo_Error::logException() which rolls back any transactions.