diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,21 @@
 Brick changelog
 ---------------
 
+0.50.1
+------
+
+Bug fixes:
+ * Fixed a bug where a self-referential symlink would cause the file
+   browser to get into a loop and ultimately crash. (Thanks Kevin Quick)
+
+API changes:
+ * Added `Brick.Focus.focusRingLength` to get the size of a focus ring.
+   (Thanks Róman Joost)
+
+Other changes:
+ * Updated Travis configuration and base dependency to support GHC
+   8.8.1. (thanks Brandon Hamilton)
+
 0.50
 ----
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.50
+version:             0.50.1
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
@@ -37,7 +37,7 @@
 cabal-version:       1.18
 Homepage:            https://github.com/jtdaugherty/brick/
 Bug-reports:         https://github.com/jtdaugherty/brick/issues
-tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1, GHC == 8.6.5
+tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1, GHC == 8.6.5, GHC == 8.8.1
 
 extra-doc-files:     README.md,
                      docs/guide.rst,
@@ -87,7 +87,7 @@
     Brick.Types.Internal
     Brick.Widgets.Internal
 
-  build-depends:       base <= 4.12.0.0,
+  build-depends:       base <= 4.13.0.0,
                        vty >= 5.24,
                        transformers,
                        data-clist >= 0.1,
diff --git a/src/Brick/Focus.hs b/src/Brick/Focus.hs
--- a/src/Brick/Focus.hs
+++ b/src/Brick/Focus.hs
@@ -9,6 +9,7 @@
   , focusPrev
   , focusGetCurrent
   , focusSetCurrent
+  , focusRingLength
   , focusRingCursor
   , withFocusRing
   , focusRingModify
@@ -75,6 +76,10 @@
     case C.rotateTo n l of
         Nothing -> r
         Just l' -> FocusRing l'
+
+-- | Get the size of the FocusRing.
+focusRingLength :: FocusRing n -> Int
+focusRingLength (FocusRing l) = C.size l
 
 -- | Modify the internal circular list structure of a focus ring
 -- directly. This function permits modification of the circular list
diff --git a/src/Brick/Widgets/FileBrowser.hs b/src/Brick/Widgets/FileBrowser.hs
--- a/src/Brick/Widgets/FileBrowser.hs
+++ b/src/Brick/Widgets/FileBrowser.hs
@@ -347,35 +347,49 @@
             -- ^ The actual full path to the file or directory to
             -- inspect.
             -> IO FileInfo
-getFileInfo name fullPath = do
-    filePath <- D.makeAbsolute fullPath
-    statusResult <- E.try $ U.getSymbolicLinkStatus filePath
+getFileInfo name = go []
+    where
+        go history fullPath = do
+            filePath <- D.makeAbsolute fullPath
+            statusResult <- E.try $ U.getSymbolicLinkStatus filePath
 
-    let stat = do
-            status <- statusResult
-            let U.COff sz = U.fileSize status
-            return FileStatus { fileStatusFileType = fileTypeFromStatus status
-                              , fileStatusSize = sz
-                              }
+            let stat = do
+                  status <- statusResult
+                  let U.COff sz = U.fileSize status
+                  return FileStatus { fileStatusFileType = fileTypeFromStatus status
+                                    , fileStatusSize = sz
+                                    }
 
-    targetTy <- case fileStatusFileType <$> stat of
-        Right (Just SymbolicLink) -> do
-            targetPathResult <- E.try $ U.readSymbolicLink filePath
-            case targetPathResult of
-                Left (_::E.SomeException) -> return Nothing
-                Right targetPath -> do
-                    targetInfo <- liftIO $ getFileInfo "unused" targetPath
-                    case fileInfoFileStatus targetInfo of
-                        Right (FileStatus _ targetTy) -> return targetTy
-                        _ -> return Nothing
-        _ -> return Nothing
+            targetTy <- case fileStatusFileType <$> stat of
+                Right (Just SymbolicLink) -> do
+                    targetPathResult <- E.try $ U.readSymbolicLink filePath
+                    case targetPathResult of
+                        Left (_::E.SomeException) -> return Nothing
+                        Right targetPath ->
+                            -- Watch out for recursive symlink chains:
+                            -- if history starts repeating, abort the
+                            -- symlink following process.
+                            --
+                            -- Examples:
+                            --   $ ln -s foo foo
+                            --
+                            --   $ ln -s foo bar
+                            --   $ ln -s bar foo
+                            if targetPath `elem` history
+                            then return Nothing
+                            else do
+                                targetInfo <- liftIO $ go (fullPath : history) targetPath
+                                case fileInfoFileStatus targetInfo of
+                                    Right (FileStatus _ targetTy) -> return targetTy
+                                    _ -> return Nothing
+                _ -> return Nothing
 
-    return FileInfo { fileInfoFilename = name
-                    , fileInfoFilePath = filePath
-                    , fileInfoSanitizedFilename = sanitizeFilename name
-                    , fileInfoFileStatus = stat
-                    , fileInfoLinkTargetType = targetTy
-                    }
+            return FileInfo { fileInfoFilename = name
+                            , fileInfoFilePath = filePath
+                            , fileInfoSanitizedFilename = sanitizeFilename name
+                            , fileInfoFileStatus = stat
+                            , fileInfoLinkTargetType = targetTy
+                            }
 
 -- | Get the file type for this file info entry. If the file type could
 -- not be obtained due to an 'IOException', return 'Nothing'.
