Fingerprint.getFileHash: Fix not reading file at all.
authorNiklas Hamb├╝chen <mail@nh2.me>
Fri, 23 Aug 2013 12:46:14 +0000 (21:46 +0900)
committerAustin Seipp <aseipp@pobox.com>
Fri, 23 Aug 2013 14:26:11 +0000 (09:26 -0500)
This lead to the stage1 compiler calculating random iface hashes.

Signed-off-by: Austin Seipp <aseipp@pobox.com>
compiler/utils/Fingerprint.hsc

index aad964a..2f59f2a 100644 (file)
@@ -20,6 +20,7 @@ module Fingerprint (
 #include "md5.h"
 ##include "HsVersions.h"
 
+import Control.Monad    ( when )
 import Numeric          ( readHex )
 #if __GLASGOW_HASKELL__ < 707
 -- Only needed for getFileHash below.
@@ -50,7 +51,10 @@ getFileHash path = withBinaryFile path ReadMode $ \h -> do
 
   fileSize <- toIntFileSize `fmap` hFileSize h
 
-  allocaBytes fileSize (\bufPtr -> fingerprintData bufPtr fileSize)
+  allocaBytes fileSize $ \bufPtr -> do
+    n <- hGetBuf h bufPtr fileSize
+    when (n /= fileSize) readFailedError
+    fingerprintData bufPtr fileSize
 
   where
     toIntFileSize :: Integer -> Int
@@ -59,4 +63,7 @@ getFileHash path = withBinaryFile path ReadMode $ \h -> do
           Sorry $ "Fingerprint.getFileHash: Tried to calculate hash of file "
                   ++ path ++ " with size > maxBound :: Int. This is not supported."
       | otherwise = fromIntegral size
+
+    readFailedError = throwGhcException $
+        Panic $ "Fingerprint.getFileHash: hGetBuf failed on interface file"
 #endif