diff --git a/CONTRIBUTORS b/CONTRIBUTORS
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -8,9 +8,11 @@
 Ben M
 Echo Nolan
 Conrad Parker
+Akio Takano
 Paulo Tanimoto
 Magnus Therning
 Johan Tibell
 Bas van Dijk
 Valery Vorotyntsev
+Maciej Wos
 Edward Yang
diff --git a/iteratee.cabal b/iteratee.cabal
--- a/iteratee.cabal
+++ b/iteratee.cabal
@@ -1,5 +1,5 @@
 name:          iteratee
-version:       0.7.0.1
+version:       0.7.0.2
 synopsis:      Iteratee-based I/O
 description:
   The Iteratee monad provides strict, safe, and functional I/O. In addition
diff --git a/src/Data/Iteratee/IO/Fd.hs b/src/Data/Iteratee/IO/Fd.hs
--- a/src/Data/Iteratee/IO/Fd.hs
+++ b/src/Data/Iteratee/IO/Fd.hs
@@ -62,33 +62,34 @@
 -- over the entire contents of a file, in order, unless stopped by
 -- the iteratee.  In particular, seeking is not supported.
 enumFd
-  :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadIO m) =>
+  :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
      Int
      -> Fd
      -> Enumerator s m a
-enumFd bs fd iter = do
+enumFd bs fd iter =
   let bufsize = bs * (sizeOf (undefined :: el))
-  p <- liftIO $ mallocBytes bufsize
-  enumFromCallback (makefdCallback p (fromIntegral bufsize) fd) () iter
+  in CIO.bracket (liftIO $ mallocBytes bufsize)
+                 (liftIO . free)
+                 (\p -> enumFromCallback (makefdCallback p (fromIntegral bufsize) fd) () iter)
 
 -- |A variant of enumFd that catches exceptions raised by the @Iteratee@.
 enumFdCatch
- :: forall e s el m a.(IException e, NullPoint s, ReadableChunk s el, MonadIO m)
+ :: forall e s el m a.(IException e, NullPoint s, ReadableChunk s el, MonadCatchIO m)
     => Int
     -> Fd
     -> (e -> m (Maybe EnumException))
     -> Enumerator s m a
-enumFdCatch bs fd handler iter = do
+enumFdCatch bs fd handler iter =
   let bufsize = bs * (sizeOf (undefined :: el))
-  p <- liftIO $ mallocBytes bufsize
-  enumFromCallbackCatch (makefdCallback p (fromIntegral bufsize) fd)
-    handler () iter
+  in CIO.bracket (liftIO $ mallocBytes bufsize)
+                 (liftIO . free)
+                 (\p -> enumFromCallbackCatch (makefdCallback p (fromIntegral bufsize) fd) handler () iter)
 
 
 -- |The enumerator of a POSIX File Descriptor: a variation of @enumFd@ that
 -- supports RandomIO (seek requests).
 enumFdRandom
- :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadIO m) =>
+ :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
     Int
     -> Fd
     -> Enumerator s m a
diff --git a/src/Data/Iteratee/IO/Handle.hs b/src/Data/Iteratee/IO/Handle.hs
--- a/src/Data/Iteratee/IO/Handle.hs
+++ b/src/Data/Iteratee/IO/Handle.hs
@@ -61,10 +61,11 @@
   Int -- ^Buffer size (number of elements per read)
   -> Handle
   -> Enumerator s m a
-enumHandle bs h i = do
+enumHandle bs h i =
   let bufsize = bs * sizeOf (undefined :: el)
-  p <- liftIO $ mallocBytes bufsize
-  enumFromCallback (makeHandleCallback p bufsize h) () i
+  in CIO.bracket (liftIO $ mallocBytes bufsize)
+                 (liftIO . free)
+                 (\p -> enumFromCallback (makeHandleCallback p bufsize h) () i)
 
 -- |An enumerator of a file handle that catches exceptions raised by
 -- the Iteratee.
@@ -78,10 +79,11 @@
   -> Handle
   -> (e -> m (Maybe EnumException))
   -> Enumerator s m a
-enumHandleCatch bs h handler i = do
+enumHandleCatch bs h handler i =
   let bufsize = bs * sizeOf (undefined :: el)
-  p <- liftIO $ mallocBytes bufsize
-  enumFromCallbackCatch (makeHandleCallback p bufsize h) handler () i
+  in CIO.bracket (liftIO $ mallocBytes bufsize)
+                 (liftIO . free)
+                 (\p -> enumFromCallbackCatch (makeHandleCallback p bufsize h) handler () i)
 
 
 -- |The enumerator of a Handle: a variation of enumHandle that
