on master help sign in
Merge pull request #568 from LeifW/broaden_localhost_checking

Broaden localhost checking

commit6bcb9c7498c4abbb7efb40795a7312132a9bd024 authorEdwin Brady <edwin.brady@gmail.com> dateWed 30 Oct 2013, 01:16 (13 years ago) parente55e9e60548109
3 files changed+28−2
idris.cabal+1 src/Idris/REPL.hs+5−2 src/Util/Net.hs+22
idris.cabal+1
@@ -357,6 +357,7 @@ Executable idris
357357 , Util.Pretty
358358 , Util.System
359359 , Util.DynamicLinker
360+ , Util.Net
360361
361362 , Pkg.Package
362363 , Pkg.PParser
src/Idris/REPL.hs+5−2
@@ -27,6 +27,7 @@ import Idris.CaseSplit
2727import Paths_idris
2828import Util.System
2929import Util.DynamicLinker
30+import Util.Net (listenOnLocalhost)
3031
3132import Core.Evaluate
3233import Core.Execute (execute)
@@ -111,7 +112,7 @@ startServer orig stvar fn_in = do tid <- runIO $ forkOS serverLoop
111112 where serverLoop :: IO ()
112113 -- TODO: option for port number
113114 serverLoop = withSocketsDo $
114− do sock <- listenOn $ PortNumber 4294
115+ do sock <- listenOnLocalhost $ PortNumber 4294
115116 i <- readMVar stvar
116117 loop fn i sock
117118
@@ -121,7 +122,9 @@ startServer orig stvar fn_in = do tid <- runIO $ forkOS serverLoop
121122
122123 loop fn ist sock
123124 = do (h,host,_) <- accept sock
124− if (host == "localhost" ||
125+ -- just use the local part of the hostname
126+ -- for the "localhost.localdomain" case
127+ if ((takeWhile (/= '.') host) == "localhost" ||
125128 host == "127.0.0.1")
126129 then do
127130 cmd <- hGetLine h
src/Util/Net.hsnew file+22
@@ -0,0 +1,22 @@
1+module Util.Net (listenOnLocalhost) where
2+
3+import Network
4+import Network.Socket hiding (sClose, PortNumber)
5+import Network.BSD (getProtocolNumber)
6+import Control.Exception (bracketOnError)
7+
8+-- Copied from upstream impl of listenOn
9+-- bound to localhost interface instead of iNADDR_ANY
10+listenOnLocalhost (PortNumber port) = do
11+ proto <- getProtocolNumber "tcp"
12+ localhost <- inet_addr "127.0.0.1"
13+ bracketOnError
14+ (socket AF_INET Stream proto)
15+ (sClose)
16+ (\sock -> do
17+ setSocketOption sock ReuseAddr 1
18+ bindSocket sock (SockAddrInet port localhost)
19+ listen sock maxListenQueue
20+ return sock
21+ )
22+