[commit: packages/unix] master, safe710fixes, safe710fixes-again, safefixes710again: Use correct POSIX offset-type for tell/seekdir (43343c1)

git at git.haskell.org git at git.haskell.org
Thu Mar 19 15:50:17 UTC 2015


Repository : ssh://git@git.haskell.org/unix

On branches: master,safe710fixes,safe710fixes-again,safefixes710again
Link       : http://ghc.haskell.org/trac/ghc/changeset/43343c151f9824a44bd6e353610fdeb23f910c72/unix

>---------------------------------------------------------------

commit 43343c151f9824a44bd6e353610fdeb23f910c72
Author: Herbert Valerio Riedel <hvr at gnu.org>
Date:   Thu Aug 7 12:23:07 2014 +0200

    Use correct POSIX offset-type for tell/seekdir
    
    This fixes the FFI imports to use the proper `CLong` type over the
    previous incorrect `COff` type, as using the wrong argument type can
    cause problems when the `long` and `off_t` types have different size.
    
    Historic note from the manual page:
    
      In glibc up to version 2.1.1, the return type of telldir() was off_t.
      POSIX.1-2001 specifies long, and this is the type used since glibc
      2.1.2 (released in 1999).


>---------------------------------------------------------------

43343c151f9824a44bd6e353610fdeb23f910c72
 System/Posix/Directory/Common.hsc | 8 ++++----
 changelog.md                      | 2 ++
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/System/Posix/Directory/Common.hsc b/System/Posix/Directory/Common.hsc
index 86d87ca..7cc61af 100644
--- a/System/Posix/Directory/Common.hsc
+++ b/System/Posix/Directory/Common.hsc
@@ -62,20 +62,20 @@ newtype DirStreamOffset = DirStreamOffset COff
 #ifdef HAVE_SEEKDIR
 seekDirStream :: DirStream -> DirStreamOffset -> IO ()
 seekDirStream (DirStream dirp) (DirStreamOffset off) =
-  c_seekdir dirp off
+  c_seekdir dirp (fromIntegral off) -- TODO: check for CLong/COff overflow
 
 foreign import ccall unsafe "seekdir"
-  c_seekdir :: Ptr CDir -> COff -> IO ()
+  c_seekdir :: Ptr CDir -> CLong -> IO ()
 #endif
 
 #ifdef HAVE_TELLDIR
 tellDirStream :: DirStream -> IO DirStreamOffset
 tellDirStream (DirStream dirp) = do
   off <- c_telldir dirp
-  return (DirStreamOffset off)
+  return (DirStreamOffset (fromIntegral off)) -- TODO: check for overflow
 
 foreign import ccall unsafe "telldir"
-  c_telldir :: Ptr CDir -> IO COff
+  c_telldir :: Ptr CDir -> IO CLong
 #endif
 
 changeWorkingDirectoryFd :: Fd -> IO ()
diff --git a/changelog.md b/changelog.md
index ae5b726..c481922 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 # Changelog for [`unix` package](http://hackage.haskell.org/package/unix)
 
 ## 2.7.0.2  *TBA*
@@ -9,6 +10,7 @@
     CPP macros for required getgrgid_r and getgrnam_r functions definition
     so the fix is to change from C ABI calling convention to C API calling
     convention
+  * Fix potential type-mismatch in `telldir`/`seekdir` FFI imports
 
 ## 2.7.0.1  *Mar 2014*
 



More information about the ghc-commits mailing list