diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,7 +1,11 @@
-## 4.2.1
+## 4.2.2
 
 * Adding rate limit for RST_STREAM to work around CVE-2023-44487.
   [#94](https://github.com/kazu-yamamoto/http2/pull/94)
+
+## 4.2.1
+
+* This version is identical to v4.2.0 by accident.
 
 ## 4.2.0
 
diff --git a/Network/HTTP2/Arch/Context.hs b/Network/HTTP2/Arch/Context.hs
--- a/Network/HTTP2/Arch/Context.hs
+++ b/Network/HTTP2/Arch/Context.hs
@@ -88,6 +88,7 @@
   , pingRate           :: Rate
   , settingsRate       :: Rate
   , emptyFrameRate     :: Rate
+  , rstRate            :: Rate
   , mySockAddr         :: SockAddr
   , peerSockAddr       :: SockAddr
   }
@@ -115,6 +116,7 @@
                <*> newDynamicTableForDecoding defaultDynamicTableSize 4096
                <*> newTVarIO defaultWindowSize
                <*> newIORef 0
+               <*> newRate
                <*> newRate
                <*> newRate
                <*> newRate
diff --git a/Network/HTTP2/Arch/Receiver.hs b/Network/HTTP2/Arch/Receiver.hs
--- a/Network/HTTP2/Arch/Receiver.hs
+++ b/Network/HTTP2/Arch/Receiver.hs
@@ -46,6 +46,9 @@
 emptyFrameRateLimit :: Int
 emptyFrameRateLimit = 4
 
+rstRateLimit :: Int
+rstRateLimit = 4
+
 ----------------------------------------------------------------
 
 frameReceiver :: Context -> Config -> IO ()
@@ -449,6 +452,9 @@
 
 -- Transition (stream6)
 stream FrameRSTStream header@FrameHeader{streamId} bs ctx s strm = do
+    rate <- getRate $ rstRate ctx
+    when (rate > rstRateLimit) $
+        E.throwIO $ ConnectionErrorIsSent ProtocolError streamId "too many rst_stream"
     RSTStreamFrame err <- guardIt $ decodeRSTStreamFrame header bs
     let cc = Reset err
 
diff --git a/http2.cabal b/http2.cabal
--- a/http2.cabal
+++ b/http2.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               http2
-version:            4.2.1
+version:            4.2.2
 license:            BSD3
 license-file:       LICENSE
 maintainer:         Kazu Yamamoto <kazu@iij.ad.jp>
