Skip to content

Commit f7fad14

Browse files
authored
Merge pull request #145 from felixmulder/free-ptr-after-use
Fix #143: memory leak from not freeing per-message callback pointer
2 parents bd48858 + f173cc5 commit f7fad14

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

src/Kafka/Producer/Callbacks.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ module Kafka.Producer.Callbacks
66
where
77

88
import Control.Monad (void)
9+
import Control.Exception (bracket)
910
import Control.Concurrent (forkIO)
1011
import Foreign.C.Error (getErrno)
1112
import Foreign.Ptr (Ptr, nullPtr)
1213
import Foreign.Storable (Storable(peek))
13-
import Foreign.StablePtr (castPtrToStablePtr, deRefStablePtr)
14+
import Foreign.StablePtr (castPtrToStablePtr, deRefStablePtr, freeStablePtr)
1415
import Kafka.Callbacks as X
1516
import Kafka.Consumer.Types (Offset(..))
1617
import Kafka.Internal.RdKafka (RdKafkaMessageT(..), RdKafkaRespErrT(..), rdKafkaConfSetDrMsgCb)
@@ -44,8 +45,8 @@ deliveryCallback callback kc = rdKafkaConfSetDrMsgCb (getRdKafkaConf kc) realCb
4445
callback rep
4546
if cbPtr == nullPtr then
4647
pure ()
47-
else do
48-
msgCb <- deRefStablePtr @(DeliveryReport -> IO ()) $ castPtrToStablePtr $ cbPtr
48+
else bracket (pure $ castPtrToStablePtr cbPtr) freeStablePtr $ \stablePtr -> do
49+
msgCb <- deRefStablePtr @(DeliveryReport -> IO ()) stablePtr
4950
-- Here we fork the callback since it might be a longer action and
5051
-- blocking here would block librdkafka from continuing its execution
5152
void . forkIO $ msgCb rep

0 commit comments

Comments
 (0)