Fix file descriptor leak in Confd Client
authorKlaus Aehlig <aehlig@google.com>
Thu, 12 Feb 2015 13:40:37 +0000 (14:40 +0100)
committerKlaus Aehlig <aehlig@google.com>
Thu, 12 Feb 2015 15:20:23 +0000 (16:20 +0100)
The queryOneServer function opens a UDP socket to connect
to the specified confd server. However, it would never
close it. Fix this and do so in a bracket construction
to make sure it also gets cleaned up in case of errors.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Petr Pudlak <pudlak@google.com>

src/Ganeti/Confd/Client.hs

index 8bd7613..02da747 100644 (file)
@@ -29,6 +29,7 @@ module Ganeti.Confd.Client
   ) where
 
 import Control.Concurrent
+import Control.Exception (bracket)
 import Control.Monad
 import Data.List
 import Data.Maybe
@@ -121,9 +122,10 @@ queryOneServer semaphore answer crType cQuery hmac (host, port) = do
   addr <- resolveAddr (fromIntegral port) host
   (af_family, sockaddr) <-
     exitIfBad "Unable to resolve the IP address" addr
-  s <- S.socket af_family S.Datagram S.defaultProtocol
-  _ <- S.sendTo s completeMsg sockaddr
-  replyMsg <- S.recv s C.maxUdpDataSize
+  replyMsg <- bracket (S.socket af_family S.Datagram S.defaultProtocol) S.sClose
+                $ \s -> do
+    _ <- S.sendTo s completeMsg sockaddr
+    S.recv s C.maxUdpDataSize
   parsedReply <-
     if C.confdMagicFourcc `isPrefixOf` replyMsg
       then return . parseReply hmac (drop 4 replyMsg) $ confdRqRsalt request