Don't propagate StackOverflowErrors from VisibilityCache

Change-Id: Idd0b15a5517114602731217260ec743718931be0
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
index 335f8d0..449f415 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
@@ -43,6 +43,7 @@
 import com.google.common.base.Throwables;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
+import com.google.common.util.concurrent.ExecutionError;
 
 /** Cache of per-user object visibility. */
 public class VisibilityCache {
@@ -119,6 +120,14 @@
     } catch (ExecutionException e) {
       Throwables.propagateIfInstanceOf(e.getCause(), IOException.class);
       throw new IOException(e);
+    } catch (ExecutionError e) {
+      // markUninteresting may overflow on pathological repos with very long
+      // merge chains. Play it safe and return false rather than letting the
+      // error propagate.
+      if (e.getCause() instanceof StackOverflowError) {
+        return false;
+      }
+      throw e;
     }
   }