--- path_redirect.module	2008-03-04 21:27:06.000000000 -0600
+++ path_redirect.module	2008-03-06 08:15:50.000000000 -0600
@@ -33,14 +33,14 @@ function path_redirect_init() {
   if (preg_match('/^\?q=/', $path)) {
     $path = preg_replace(array('/^\?q=/', '/&/'), array('', '?'), $path, 1);
   }
-  $r = db_fetch_object(db_query("SELECT redirect, query, fragment, type FROM {path_redirect} WHERE path = '%s' OR path = '%s'", $path, utf8_encode($path)));
+  $r = db_fetch_object(db_query("SELECT rid, redirect, query, fragment, type FROM {path_redirect} WHERE path = '%s' OR path = '%s'", $path, utf8_encode($path)));
   if (!$r) {
     $path = preg_replace('/\?.*/', '', $path);
-    $r = db_fetch_object(db_query("SELECT redirect, query, fragment, type FROM {path_redirect} WHERE path = '%s' OR path = '%s'", $path, utf8_encode($path)));
+    $r = db_fetch_object(db_query("SELECT rid, redirect, query, fragment, type FROM {path_redirect} WHERE path = '%s' OR path = '%s'", $path, utf8_encode($path)));
   }
 
   // only redirect if allow_bypass is off or bypass is not requested
-  if ($r && !(variable_get('path_redirect_allow_bypass', 0) && !empty($_GET['redirect']) && $_GET['redirect'] == 'no')) {
+  if ($r && !(variable_get('path_redirect_allow_bypass', 0) && !empty($_GET['redirect']) && $_GET['redirect'] == 'no') && url($r->redirect) != url($path)) {
     if (variable_get('path_redirect_redirect_warning', 0)) {
       drupal_set_message(t('This page has been moved. You may want to update your bookmarks.'));
     }
@@ -54,6 +54,11 @@ function path_redirect_init() {
       path_redirect_goto($r->redirect, ($r->query ? $r->query: NULL), ($r->fragment ? $r->fragment : NULL), $r->type);
     }
   }
+  else if (url($r->redirect) == url($path)) {
+    // warn about cyclical redirects
+    watchdog('path_redirect', t('Redirect to <code>%redirect</code> is causing an infinite loop; redirect cancelled.', array('%redirect' => $r->redirect)), WATCHDOG_WARNING, l(t('edit'), 'admin/build/path-redirect/edit/'. $r->rid));
+    return;
+  }
   else if ($r && variable_get('path_redirect_allow_bypass', 0) && !empty($_GET['redirect']) && $_GET['redirect'] === 'no') {
     drupal_set_message(t('This page is redirected to:') .' <code>'. l($r->redirect, $r->redirect, ($r->query ? $r->query: NULL), ($r->fragment ? $r->fragment : NULL)) .'</code>');
   }
