=== modified file 'includes/menu.inc'
--- includes/menu.inc	2007-12-22 23:24:24 +0000
+++ includes/menu.inc	2007-12-23 01:48:53 +0000
@@ -333,8 +333,12 @@ function menu_get_item($path = NULL, $ro
  * Execute the page callback associated with the current path
  */
 function menu_execute_active_handler($path = NULL) {
-  if (_menu_site_is_offline()) {
-    return MENU_SITE_OFFLINE;
+  if ($return = _menu_site_is_offline()) {
+    if ($return === TRUE) {
+      return MENU_SITE_OFFLINE;
+    }
+    // The function might return 'logout', let's use that.
+    $path = $return;
   }
   if ($router_item = menu_get_item($path)) {
     if ($router_item['access']) {
@@ -2228,17 +2232,24 @@ function menu_path_is_external($path) {
 }
 
 /**
- * Returns TRUE if the site is off-line for maintenance.
+ * Checks whether the site is off-line for maintenance.
+ *
+ * @return
+ *   FALSE if the site is not off-line or its the login page or the user has
+ *     'administer site configuration' permission.
+ *   'logout' if an unprivileged user is logged in,
+ *   TRUE for anonymous users if the site is off-line.
  */
 function _menu_site_is_offline() {
   // Check if site is set to off-line mode.
   if (variable_get('site_offline', 0)) {
     // Check if the user has administration privileges.
     if (!user_access('administer site configuration')) {
-      // Check if this is an attempt to login.
-      if (drupal_get_normal_path($_GET['q']) != 'user') {
-        return TRUE;
+      if (!user_is_anonymous()) {
+        return 'logout';
       }
+      // Check if this is an attempt to login.
+      return $_GET['q'] != 'user';
     }
     else {
       $offline_message = t('Operating in off-line mode.');

