diff --git a/carray.cabal b/carray.cabal
--- a/carray.cabal
+++ b/carray.cabal
@@ -1,5 +1,5 @@
 name:                carray
-version:             0.1.6.2
+version:             0.1.6.3
 synopsis:            A C-compatible array library.
 description:
   A C-compatible array library.
@@ -21,7 +21,7 @@
   Makefile
 
 source-repository this
-  tag:         0.1.6.2
+  tag:         0.1.6.3
   type:        darcs
   location:    http://hub.darcs.net/thielema/carray/
 
diff --git a/src/Data/Array/CArray/Base.hs b/src/Data/Array/CArray/Base.hs
--- a/src/Data/Array/CArray/Base.hs
+++ b/src/Data/Array/CArray/Base.hs
@@ -60,11 +60,12 @@
 import qualified Data.ByteString.Internal as S
 import Data.Binary (Binary, get, put)
 
-import System.IO.Unsafe (unsafePerformIO)
+import System.IO.Unsafe (unsafePerformIO, unsafeDupablePerformIO)
 import Foreign.Storable
             (Storable, sizeOf, alignment, peek, peekElemOff, pokeElemOff)
 import Foreign.ForeignPtr
             (ForeignPtr, withForeignPtr, castForeignPtr, touchForeignPtr)
+import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
 import Foreign.Marshal.Array (copyArray, withArray)
 import Foreign.Ptr (plusPtr, alignPtr, castPtr)
 
@@ -167,10 +168,14 @@
           go dummy (l,u) | safe = Just (CArray l u n fp)
                          | otherwise = Nothing
               where n = rangeSize (l,u)
-                    !((ForeignPtr addr contents), off, len) = S.toForeignPtr bs
-                    !p@(Ptr addr') = Ptr addr `plusPtr` off
-                    fp = ForeignPtr addr' contents
+                    !(fp0, off, len) = S.toForeignPtr bs
+                    fp = mapPtr (flip plusPtr off) fp0
+                    p = unsafeForeignPtrToPtr fp
                     safe = sizeOf dummy * n <= len && p == p `alignPtr` alignment dummy
+          mapPtr :: (Ptr a -> Ptr b) -> ForeignPtr a -> ForeignPtr b
+          mapPtr f (ForeignPtr addr contents) =
+              case f $ Ptr addr of
+                  Ptr addr' -> ForeignPtr addr' contents
 
 copy :: (Ix i, Storable e) => CArray i e -> IO (CArray i e)
 copy ain@(CArray l u n _) =
@@ -217,7 +222,7 @@
     {-# NOINLINE unsafeArray #-}
     unsafeArray lu ies = unsafePerformIO $ unsafeArrayCArray lu ies (zeroElem (undefined :: e))
     {-# INLINE unsafeAt #-}
-    unsafeAt (CArray _ _ _ fp) i = S.inlinePerformIO $
+    unsafeAt (CArray _ _ _ fp) i = unsafeDupablePerformIO $
                                    withForeignPtr fp $ \a -> peekElemOff a i
     {-# NOINLINE unsafeReplace #-}
     unsafeReplace arr ies = unsafePerformIO $ unsafeReplaceCArray arr ies
@@ -416,7 +421,7 @@
 -- transparency!
 {-# INLINE mapCArrayInPlace #-}
 mapCArrayInPlace :: (Ix i, Storable e) => (e -> e) -> CArray i e -> CArray i e
-mapCArrayInPlace f a = S.inlinePerformIO $ do
+mapCArrayInPlace f a = unsafeDupablePerformIO $ do
     withCArray a $ \p ->
         forM_ [0 .. size a - 1] $ \i ->
             peekElemOff p i >>= pokeElemOff p i . f
