diff --git a/HsSVN.cabal b/HsSVN.cabal
--- a/HsSVN.cabal
+++ b/HsSVN.cabal
@@ -4,7 +4,7 @@
     HsSVN is a (part of) Subversion binding for Haskell. Currently it
     can do most things related to the Subversion FS but others are
     left uncovered.
-Version:       0.4.2
+Version:       0.4.3
 License:       PublicDomain
 License-File:  COPYING
 Author:        PHO <pho at cielonegro dot org>
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,10 @@
+Changes from 0.4.2 to 0.4.3
+---------------------------
+* Fixed a serious bug which leads to segmentation fault at
+  apr_hash_next. The hidden module Subversion.Hash was handling APR
+  memory pools wrongly.
+
+
 Changes from 0.4.1 to 0.4.2
 ---------------------------
 * Fixed breakage on GHC 6.12.1.
diff --git a/Subversion/Hash.hsc b/Subversion/Hash.hsc
--- a/Subversion/Hash.hsc
+++ b/Subversion/Hash.hsc
@@ -88,7 +88,10 @@
 foreign import ccall unsafe "apr_hash_next"
         _next :: Ptr APR_HASH_INDEX_T -> IO (Ptr APR_HASH_INDEX_T)
 
+foreign import ccall unsafe "apr_hash_pool_get"
+        _pool :: Ptr APR_HASH_T -> IO (Ptr APR_POOL_T)
 
+
 wrapHash :: IO () -> Ptr APR_HASH_T -> IO (Hash a)
 wrapHash finalizer hashPtr
     = do hash <- newForeignPtr_ hashPtr
@@ -169,14 +172,16 @@
 
 getFirst :: Hash a -> IO (Maybe (HashIndex a))
 getFirst hash
-    = do pool <- newPool
-         withPoolPtr pool $ \ poolPtr ->
-             withHashPtr hash $ \ hashPtr ->
-             do idxPtr <- _first poolPtr hashPtr
-                if idxPtr == nullPtr then
-                    return Nothing
-                  else
-                    liftM Just $ wrapHashIdx (touchPool pool) idxPtr
+    = withHashPtr hash $ \ hashPtr ->
+      do poolPtr <- _pool hashPtr
+         -- The resulting idx must keep the hashtable itself alive
+         -- during its lifetime. We must reuse the hashtable's memory
+         -- pool.
+         idxPtr  <- _first poolPtr hashPtr
+         if idxPtr == nullPtr then
+             return Nothing
+           else
+             liftM Just $ wrapHashIdx (touchHash hash) idxPtr
 
 
 getThis :: HashValue a => HashIndex a -> IO (String, a)
@@ -200,14 +205,10 @@
          return (key, castPtr valPtr)
 
 
-getNext :: HashIndex a -> IO (Maybe (HashIndex a))
-getNext idx
+next :: HashIndex a -> IO Bool
+next idx
     = withHashIdxPtr idx $ \ idxPtr ->
-      do idxPtr' <- _next idxPtr
-         if idxPtr' == nullPtr then
-             return Nothing
-           else
-             liftM Just $ wrapHashIdx (touchHashIdx idx) idxPtr'
+      fmap (/= nullPtr) (_next idxPtr)
                     
 
 pairsToHash :: HashValue a => [(String, a)] -> IO (Hash a)
@@ -230,8 +231,12 @@
     where
       loop Nothing    = return []
       loop (Just idx) = do x  <- f =<< getThis idx
-                           xs <- unsafeInterleaveIO
-                                 (getNext idx >>= loop)
+                           xs <- unsafeInterleaveIO $
+                                 do hasNext <- next idx
+                                    if hasNext then
+                                        loop (Just idx)
+                                      else
+                                        return []
                            return (x:xs)
 
 
@@ -240,6 +245,10 @@
     where
       loop Nothing    = return []
       loop (Just idx) = do x  <- f =<< getThis' idx
-                           xs <- unsafeInterleaveIO
-                                 (getNext idx >>= loop)
+                           xs <- unsafeInterleaveIO $
+                                 do hasNext <- next idx
+                                    if hasNext then
+                                        loop (Just idx)
+                                      else
+                                        return []
                            return (x:xs)
