[Haskell-cafe] getSymbolicLinkStatus completely broken on some 6.8.2 systems

Adam Langley agl at imperialviolet.org
Wed Feb 13 01:44:17 EST 2008


On Feb 12, 2008 8:38 PM, Jeremy Shaw <jeremy.shaw at linspireinc.com> wrote:
> I get funny results when I call getSymbolicLinkStatus in ghc 6.8.2 on
> Ubuntu 7.10. This happens on several systems and has been confirmed by
> other people.

Currently I'm looking at hsc2hs for this bug. On a 32 bit box here:

int main() {
  struct stat st;
  printf("size of structure is %d\n", sizeof(st));
  printf("inode is at offset %d\n", __builtin_offsetof(struct stat, st_ino));
}

Gives:

size of structure is 88
inode is at offset 12

However, building Files.hsc gives:

fileID (FileStatus stat) =
  unsafePerformIO $ withForeignPtr stat $ ((\hsc_ptr -> peekByteOff hsc_ptr 88))
{-# LINE 315 "Files.hsc" #-}


e.g. it's reading random memory at the end of the structure. Looking
at the code from the documentation:

http://haskell.org/ghc/docs/latest/html/libraries/unix/src/System-Posix-Files.html#fileID

fileID (FileStatus stat) =
  unsafePerformIO $ withForeignPtr stat $ ((\hsc_ptr -> peekByteOff hsc_ptr 8))
{-# LINE 315 "System/Posix/Files.hsc" #-}

Seems like it might work, but that offset is too small. It appears
that it might be a 64-bit build (because the size of the stat
structure which when it gets malloced is 144), but a 64-bit build
should have larger offsets, not smaller.

You can't write your own fileID function, because FileStatus isn't
exported from Posix.Files. You can, however, write
getSymbolicLinkInode a c function (which does both the lstat and
extraction from the structure) and FFI it.


AGL


-- 
Adam Langley                                      agl at imperialviolet.org
http://www.imperialviolet.org                       650-283-9641


More information about the Haskell-Cafe mailing list