diff --git a/Network/DNS/Decode.hs b/Network/DNS/Decode.hs
--- a/Network/DNS/Decode.hs
+++ b/Network/DNS/Decode.hs
@@ -130,7 +130,7 @@
 decodeRData AAAA len  = (RD_AAAA . toIPv6 . combine) <$> getNBytes len
   where
     combine [] = []
-    combine [_] = error "combine"
+    combine [_] = fail "combine"
     combine (a:b:cs) =  a * 256 + b : combine cs
 decodeRData SOA _ = RD_SOA <$> decodeDomain
                            <*> decodeDomain
@@ -170,7 +170,10 @@
         if isPointer c then do
             d <- getInt8
             let offset = n * 256 + d
-            fromMaybe (error $ "decodeDomain: " ++ show offset) <$> pop offset
+            mo <- pop offset
+            case mo of
+                Nothing -> fail $ "decodeDomain: " ++ show offset
+                Just o -> return o
           else do
             hs <- getNByteString n
             ds <- decodeDomain
diff --git a/dns.cabal b/dns.cabal
--- a/dns.cabal
+++ b/dns.cabal
@@ -1,5 +1,5 @@
 Name:                   dns
-Version:                1.2.2
+Version:                1.2.3
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
