diff --git a/lib/Filesystem.hs b/lib/Filesystem.hs
--- a/lib/Filesystem.hs
+++ b/lib/Filesystem.hs
@@ -346,7 +346,7 @@
 foreign import ccall unsafe "opendir"
 	c_opendir :: CString -> IO (Ptr ())
 
-foreign import ccall unsafe "opendir"
+foreign import ccall unsafe "closedir"
 	c_closedir :: Ptr () -> IO CInt
 
 foreign import ccall unsafe "hssystemfileio_alloc_dirent"
diff --git a/system-fileio.cabal b/system-fileio.cabal
--- a/system-fileio.cabal
+++ b/system-fileio.cabal
@@ -1,5 +1,5 @@
 name: system-fileio
-version: 0.3.6
+version: 0.3.7
 license: MIT
 license-file: license.txt
 author: John Millikin <jmillikin@gmail.com>
@@ -42,7 +42,7 @@
 source-repository this
   type: bazaar
   location: https://john-millikin.com/branches/system-fileio/0.3/
-  tag: system-fileio_0.3.6
+  tag: system-fileio_0.3.7
 
 library
   ghc-options: -Wall -O2
diff --git a/tests/FilesystemTests/Posix.hs b/tests/FilesystemTests/Posix.hs
--- a/tests/FilesystemTests/Posix.hs
+++ b/tests/FilesystemTests/Posix.hs
@@ -31,6 +31,8 @@
 import qualified GHC.IOBase as GHC
 #endif
 
+import qualified System.Posix.IO as PosixIO
+
 import           Filesystem
 import           Filesystem.Path
 import qualified Filesystem.Path.Rules as Rules
@@ -229,6 +231,9 @@
 	, todo "readTextFile"
 	, todo "writeTextFile"
 	, todo "appendTextFile"
+	, suite "regression-tests"
+		[ test_ListDirectoryLeaksFds
+		]
 	]
 
 test_IsFile :: Text -> FilePath -> Suite
@@ -549,6 +554,22 @@
 		Filesystem.withTextFile file_path ReadMode $
 		Data.Text.IO.hGetContents
 	$expect (equalLines (Data.Text.pack contents) read_contents)
+
+test_ListDirectoryLeaksFds :: Suite
+test_ListDirectoryLeaksFds = assertionsWithTemp "listDirectory-leaks-fds" $ \tmp -> do
+	-- Test that listDirectory doesn't leak file descriptors.
+	let dir_path = tmp </> "subdir"
+	mkdir_ffi dir_path
+	
+	nullfd1 <- liftIO $ PosixIO.openFd "/dev/null" PosixIO.ReadOnly Nothing PosixIO.defaultFileFlags
+	liftIO $ PosixIO.closeFd nullfd1
+	
+	subdirContents <- liftIO $ listDirectory dir_path
+	
+	nullfd2 <- liftIO $ PosixIO.openFd "/dev/null" PosixIO.ReadOnly Nothing PosixIO.defaultFileFlags
+	liftIO $ PosixIO.closeFd nullfd2
+	
+	$assert (equal nullfd1 nullfd2)
 
 withPathCString :: FilePath -> (CString -> IO a) -> IO a
 withPathCString p = Data.ByteString.useAsCString (encode p)
