summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-12-30 18:14:19 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-12-30 18:14:19 -0400
commit75f582c9f6356c0d7d5a443451e1d1cd4a870c92 (patch)
tree24b35ee960bd2e659da98a5b31f49738c4f6c205
parentbbdf6091270fab2697c6d7466e0153cbbad234da (diff)
work around ghc segfault
hSetEncoding of a closed handle segfaults. https://ghc.haskell.org/trac/ghc/ticket/7161 3b9d9a267b7c9247d36d9b622e1b836724ca5fb0 introduced the crash. In particular, stdin may get closed (by eg, getContents) and then trying to set its encoding will crash. We didn't need to adjust stdin's encoding anyway, but only stderr, to work around https://github.com/yesodweb/persistent/issues/474 Thanks to Mesar Hameed for assistance related to reproducing this bug.
-rw-r--r--Database/Handle.hs2
-rw-r--r--Utility/FileSystemEncoding.hs8
2 files changed, 9 insertions, 1 deletions
diff --git a/Database/Handle.hs b/Database/Handle.hs
index 9071cd538..d84ce5b62 100644
--- a/Database/Handle.hs
+++ b/Database/Handle.hs
@@ -69,7 +69,7 @@ openDb db tablename = do
worker <- async (workerThread (T.pack db) tablename jobs)
-- work around https://github.com/yesodweb/persistent/issues/474
- liftIO useFileSystemEncoding
+ liftIO $ fileEncoding stderr
return $ DbHandle worker jobs
diff --git a/Utility/FileSystemEncoding.hs b/Utility/FileSystemEncoding.hs
index be43ace95..ae3bd35d7 100644
--- a/Utility/FileSystemEncoding.hs
+++ b/Utility/FileSystemEncoding.hs
@@ -10,6 +10,7 @@
module Utility.FileSystemEncoding (
useFileSystemEncoding,
+ fileEncoding,
withFilePath,
md5FilePath,
decodeBS,
@@ -63,6 +64,13 @@ useFileSystemEncoding = do
hSetEncoding stderr e
Encoding.setLocaleEncoding e
+fileEncoding :: Handle -> IO ()
+#ifndef mingw32_HOST_OS
+fileEncoding h = hSetEncoding h =<< Encoding.getFileSystemEncoding
+#else
+fileEncoding h = hSetEncoding h Encoding.utf8
+#endif
+
{- Marshal a Haskell FilePath into a NUL terminated C string using temporary
- storage. The FilePath is encoded using the filesystem encoding,
- reversing the decoding that should have been done when the FilePath