Repository : ssh://darcs.haskell.org//srv/darcs/packages/unix On branch : ghc-7.6
http://hackage.haskell.org/trac/ghc/changeset/b95a003b20436863ef2f5fc01e6cd77f5bef94a0 >--------------------------------------------------------------- commit b95a003b20436863ef2f5fc01e6cd77f5bef94a0 Author: Simon Hengel <[email protected]> Date: Thu Oct 18 00:27:42 2012 +0200 Fix a memory corruption issue in putEnv (fixes #7342) >--------------------------------------------------------------- System/Posix/Env.hsc | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletions(-) diff --git a/System/Posix/Env.hsc b/System/Posix/Env.hsc index be4711b..c30a20e 100644 --- a/System/Posix/Env.hsc +++ b/System/Posix/Env.hsc @@ -38,6 +38,10 @@ import Foreign.Ptr import Foreign.Storable import Control.Monad import Data.Maybe (fromMaybe) +#ifdef __GLASGOW_HASKELL__ +import GHC.IO.Encoding (getFileSystemEncoding) +import qualified GHC.Foreign as GHC +#endif #if __GLASGOW_HASKELL__ > 700 import System.Posix.Internals (withFilePath, peekFilePath) #elif __GLASGOW_HASKELL__ > 611 @@ -53,6 +57,13 @@ peekFilePath :: CString -> IO FilePath peekFilePath = peekCString #endif +newFilePath :: String -> IO CString +#ifdef __GLASGOW_HASKELL__ +newFilePath s = getFileSystemEncoding >>= (`GHC.newCString` s) +#else +newFilePath = newCString +#endif + -- |'getEnv' looks up a variable in the environment. getEnv :: String -> IO (Maybe String) @@ -137,7 +148,11 @@ unsetEnv name = putEnv (name ++ "=") -- and is equivalent to @setEnv(key,value,True{-overwrite-})@. putEnv :: String -> IO () -putEnv keyvalue = withFilePath keyvalue $ \s -> +putEnv keyvalue = newFilePath keyvalue >>= \s -> + -- IMPORTANT: Do not free `s` after calling putenv! + -- + -- According to SUSv2, the string passed to putenv becomes part of the + -- enviroment. throwErrnoIfMinus1_ "putenv" (c_putenv s) foreign import ccall unsafe "putenv" _______________________________________________ Cvs-libraries mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-libraries
