server.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. // DNS server implementation.
  2. package dns
  3. import (
  4. "bytes"
  5. "context"
  6. "crypto/tls"
  7. "encoding/binary"
  8. "errors"
  9. "io"
  10. "net"
  11. "strings"
  12. "sync"
  13. "sync/atomic"
  14. "time"
  15. )
  16. // Default maximum number of TCP queries before we close the socket.
  17. const maxTCPQueries = 128
  18. // The maximum number of idle workers.
  19. //
  20. // This controls the maximum number of workers that are allowed to stay
  21. // idle waiting for incoming requests before being torn down.
  22. //
  23. // If this limit is reached, the server will just keep spawning new
  24. // workers (goroutines) for each incoming request. In this case, each
  25. // worker will only be used for a single request.
  26. const maxIdleWorkersCount = 10000
  27. // The maximum length of time a worker may idle for before being destroyed.
  28. const idleWorkerTimeout = 10 * time.Second
  29. // aLongTimeAgo is a non-zero time, far in the past, used for
  30. // immediate cancelation of network operations.
  31. var aLongTimeAgo = time.Unix(1, 0)
  32. // Handler is implemented by any value that implements ServeDNS.
  33. type Handler interface {
  34. ServeDNS(w ResponseWriter, r *Msg)
  35. }
  36. // The HandlerFunc type is an adapter to allow the use of
  37. // ordinary functions as DNS handlers. If f is a function
  38. // with the appropriate signature, HandlerFunc(f) is a
  39. // Handler object that calls f.
  40. type HandlerFunc func(ResponseWriter, *Msg)
  41. // ServeDNS calls f(w, r).
  42. func (f HandlerFunc) ServeDNS(w ResponseWriter, r *Msg) {
  43. f(w, r)
  44. }
  45. // A ResponseWriter interface is used by an DNS handler to
  46. // construct an DNS response.
  47. type ResponseWriter interface {
  48. // LocalAddr returns the net.Addr of the server
  49. LocalAddr() net.Addr
  50. // RemoteAddr returns the net.Addr of the client that sent the current request.
  51. RemoteAddr() net.Addr
  52. // WriteMsg writes a reply back to the client.
  53. WriteMsg(*Msg) error
  54. // Write writes a raw buffer back to the client.
  55. Write([]byte) (int, error)
  56. // Close closes the connection.
  57. Close() error
  58. // TsigStatus returns the status of the Tsig.
  59. TsigStatus() error
  60. // TsigTimersOnly sets the tsig timers only boolean.
  61. TsigTimersOnly(bool)
  62. // Hijack lets the caller take over the connection.
  63. // After a call to Hijack(), the DNS package will not do anything with the connection.
  64. Hijack()
  65. }
  66. // A ConnectionStater interface is used by a DNS Handler to access TLS connection state
  67. // when available.
  68. type ConnectionStater interface {
  69. ConnectionState() *tls.ConnectionState
  70. }
  71. type response struct {
  72. msg []byte
  73. closed bool // connection has been closed
  74. hijacked bool // connection has been hijacked by handler
  75. tsigTimersOnly bool
  76. tsigStatus error
  77. tsigRequestMAC string
  78. tsigSecret map[string]string // the tsig secrets
  79. udp *net.UDPConn // i/o connection if UDP was used
  80. tcp net.Conn // i/o connection if TCP was used
  81. udpSession *SessionUDP // oob data to get egress interface right
  82. writer Writer // writer to output the raw DNS bits
  83. wg *sync.WaitGroup // for gracefull shutdown
  84. }
  85. // HandleFailed returns a HandlerFunc that returns SERVFAIL for every request it gets.
  86. func HandleFailed(w ResponseWriter, r *Msg) {
  87. m := new(Msg)
  88. m.SetRcode(r, RcodeServerFailure)
  89. // does not matter if this write fails
  90. w.WriteMsg(m)
  91. }
  92. // ListenAndServe Starts a server on address and network specified Invoke handler
  93. // for incoming queries.
  94. func ListenAndServe(addr string, network string, handler Handler) error {
  95. server := &Server{Addr: addr, Net: network, Handler: handler}
  96. return server.ListenAndServe()
  97. }
  98. // ListenAndServeTLS acts like http.ListenAndServeTLS, more information in
  99. // http://golang.org/pkg/net/http/#ListenAndServeTLS
  100. func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
  101. cert, err := tls.LoadX509KeyPair(certFile, keyFile)
  102. if err != nil {
  103. return err
  104. }
  105. config := tls.Config{
  106. Certificates: []tls.Certificate{cert},
  107. }
  108. server := &Server{
  109. Addr: addr,
  110. Net: "tcp-tls",
  111. TLSConfig: &config,
  112. Handler: handler,
  113. }
  114. return server.ListenAndServe()
  115. }
  116. // ActivateAndServe activates a server with a listener from systemd,
  117. // l and p should not both be non-nil.
  118. // If both l and p are not nil only p will be used.
  119. // Invoke handler for incoming queries.
  120. func ActivateAndServe(l net.Listener, p net.PacketConn, handler Handler) error {
  121. server := &Server{Listener: l, PacketConn: p, Handler: handler}
  122. return server.ActivateAndServe()
  123. }
  124. // Writer writes raw DNS messages; each call to Write should send an entire message.
  125. type Writer interface {
  126. io.Writer
  127. }
  128. // Reader reads raw DNS messages; each call to ReadTCP or ReadUDP should return an entire message.
  129. type Reader interface {
  130. // ReadTCP reads a raw message from a TCP connection. Implementations may alter
  131. // connection properties, for example the read-deadline.
  132. ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error)
  133. // ReadUDP reads a raw message from a UDP connection. Implementations may alter
  134. // connection properties, for example the read-deadline.
  135. ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error)
  136. }
  137. // defaultReader is an adapter for the Server struct that implements the Reader interface
  138. // using the readTCP and readUDP func of the embedded Server.
  139. type defaultReader struct {
  140. *Server
  141. }
  142. func (dr defaultReader) ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  143. return dr.readTCP(conn, timeout)
  144. }
  145. func (dr defaultReader) ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  146. return dr.readUDP(conn, timeout)
  147. }
  148. // DecorateReader is a decorator hook for extending or supplanting the functionality of a Reader.
  149. // Implementations should never return a nil Reader.
  150. type DecorateReader func(Reader) Reader
  151. // DecorateWriter is a decorator hook for extending or supplanting the functionality of a Writer.
  152. // Implementations should never return a nil Writer.
  153. type DecorateWriter func(Writer) Writer
  154. // A Server defines parameters for running an DNS server.
  155. type Server struct {
  156. // Address to listen on, ":dns" if empty.
  157. Addr string
  158. // if "tcp" or "tcp-tls" (DNS over TLS) it will invoke a TCP listener, otherwise an UDP one
  159. Net string
  160. // TCP Listener to use, this is to aid in systemd's socket activation.
  161. Listener net.Listener
  162. // TLS connection configuration
  163. TLSConfig *tls.Config
  164. // UDP "Listener" to use, this is to aid in systemd's socket activation.
  165. PacketConn net.PacketConn
  166. // Handler to invoke, dns.DefaultServeMux if nil.
  167. Handler Handler
  168. // Default buffer size to use to read incoming UDP messages. If not set
  169. // it defaults to MinMsgSize (512 B).
  170. UDPSize int
  171. // The net.Conn.SetReadTimeout value for new connections, defaults to 2 * time.Second.
  172. ReadTimeout time.Duration
  173. // The net.Conn.SetWriteTimeout value for new connections, defaults to 2 * time.Second.
  174. WriteTimeout time.Duration
  175. // TCP idle timeout for multiple queries, if nil, defaults to 8 * time.Second (RFC 5966).
  176. IdleTimeout func() time.Duration
  177. // Secret(s) for Tsig map[<zonename>]<base64 secret>. The zonename must be in canonical form (lowercase, fqdn, see RFC 4034 Section 6.2).
  178. TsigSecret map[string]string
  179. // If NotifyStartedFunc is set it is called once the server has started listening.
  180. NotifyStartedFunc func()
  181. // DecorateReader is optional, allows customization of the process that reads raw DNS messages.
  182. DecorateReader DecorateReader
  183. // DecorateWriter is optional, allows customization of the process that writes raw DNS messages.
  184. DecorateWriter DecorateWriter
  185. // Maximum number of TCP queries before we close the socket. Default is maxTCPQueries (unlimited if -1).
  186. MaxTCPQueries int
  187. // Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address.
  188. // It is only supported on go1.11+ and when using ListenAndServe.
  189. ReusePort bool
  190. // AcceptMsgFunc will check the incoming message and will reject it early in the process.
  191. // By default DefaultMsgAcceptFunc will be used.
  192. MsgAcceptFunc MsgAcceptFunc
  193. // UDP packet or TCP connection queue
  194. queue chan *response
  195. // Workers count
  196. workersCount int32
  197. // Shutdown handling
  198. lock sync.RWMutex
  199. started bool
  200. shutdown chan struct{}
  201. conns map[net.Conn]struct{}
  202. // A pool for UDP message buffers.
  203. udpPool sync.Pool
  204. }
  205. func (srv *Server) isStarted() bool {
  206. srv.lock.RLock()
  207. started := srv.started
  208. srv.lock.RUnlock()
  209. return started
  210. }
  211. func (srv *Server) worker(w *response) {
  212. srv.serve(w)
  213. for {
  214. count := atomic.LoadInt32(&srv.workersCount)
  215. if count > maxIdleWorkersCount {
  216. return
  217. }
  218. if atomic.CompareAndSwapInt32(&srv.workersCount, count, count+1) {
  219. break
  220. }
  221. }
  222. defer atomic.AddInt32(&srv.workersCount, -1)
  223. inUse := false
  224. timeout := time.NewTimer(idleWorkerTimeout)
  225. defer timeout.Stop()
  226. LOOP:
  227. for {
  228. select {
  229. case w, ok := <-srv.queue:
  230. if !ok {
  231. break LOOP
  232. }
  233. inUse = true
  234. srv.serve(w)
  235. case <-timeout.C:
  236. if !inUse {
  237. break LOOP
  238. }
  239. inUse = false
  240. timeout.Reset(idleWorkerTimeout)
  241. }
  242. }
  243. }
  244. func (srv *Server) spawnWorker(w *response) {
  245. select {
  246. case srv.queue <- w:
  247. default:
  248. go srv.worker(w)
  249. }
  250. }
  251. func makeUDPBuffer(size int) func() interface{} {
  252. return func() interface{} {
  253. return make([]byte, size)
  254. }
  255. }
  256. func (srv *Server) init() {
  257. srv.queue = make(chan *response)
  258. srv.shutdown = make(chan struct{})
  259. srv.conns = make(map[net.Conn]struct{})
  260. if srv.UDPSize == 0 {
  261. srv.UDPSize = MinMsgSize
  262. }
  263. if srv.MsgAcceptFunc == nil {
  264. srv.MsgAcceptFunc = defaultMsgAcceptFunc
  265. }
  266. srv.udpPool.New = makeUDPBuffer(srv.UDPSize)
  267. }
  268. func unlockOnce(l sync.Locker) func() {
  269. var once sync.Once
  270. return func() { once.Do(l.Unlock) }
  271. }
  272. // ListenAndServe starts a nameserver on the configured address in *Server.
  273. func (srv *Server) ListenAndServe() error {
  274. unlock := unlockOnce(&srv.lock)
  275. srv.lock.Lock()
  276. defer unlock()
  277. if srv.started {
  278. return &Error{err: "server already started"}
  279. }
  280. addr := srv.Addr
  281. if addr == "" {
  282. addr = ":domain"
  283. }
  284. srv.init()
  285. defer close(srv.queue)
  286. switch srv.Net {
  287. case "tcp", "tcp4", "tcp6":
  288. l, err := listenTCP(srv.Net, addr, srv.ReusePort)
  289. if err != nil {
  290. return err
  291. }
  292. srv.Listener = l
  293. srv.started = true
  294. unlock()
  295. return srv.serveTCP(l)
  296. case "tcp-tls", "tcp4-tls", "tcp6-tls":
  297. if srv.TLSConfig == nil || (len(srv.TLSConfig.Certificates) == 0 && srv.TLSConfig.GetCertificate == nil) {
  298. return errors.New("dns: neither Certificates nor GetCertificate set in Config")
  299. }
  300. network := strings.TrimSuffix(srv.Net, "-tls")
  301. l, err := listenTCP(network, addr, srv.ReusePort)
  302. if err != nil {
  303. return err
  304. }
  305. l = tls.NewListener(l, srv.TLSConfig)
  306. srv.Listener = l
  307. srv.started = true
  308. unlock()
  309. return srv.serveTCP(l)
  310. case "udp", "udp4", "udp6":
  311. l, err := listenUDP(srv.Net, addr, srv.ReusePort)
  312. if err != nil {
  313. return err
  314. }
  315. u := l.(*net.UDPConn)
  316. if e := setUDPSocketOptions(u); e != nil {
  317. return e
  318. }
  319. srv.PacketConn = l
  320. srv.started = true
  321. unlock()
  322. return srv.serveUDP(u)
  323. }
  324. return &Error{err: "bad network"}
  325. }
  326. // ActivateAndServe starts a nameserver with the PacketConn or Listener
  327. // configured in *Server. Its main use is to start a server from systemd.
  328. func (srv *Server) ActivateAndServe() error {
  329. unlock := unlockOnce(&srv.lock)
  330. srv.lock.Lock()
  331. defer unlock()
  332. if srv.started {
  333. return &Error{err: "server already started"}
  334. }
  335. srv.init()
  336. defer close(srv.queue)
  337. pConn := srv.PacketConn
  338. l := srv.Listener
  339. if pConn != nil {
  340. // Check PacketConn interface's type is valid and value
  341. // is not nil
  342. if t, ok := pConn.(*net.UDPConn); ok && t != nil {
  343. if e := setUDPSocketOptions(t); e != nil {
  344. return e
  345. }
  346. srv.started = true
  347. unlock()
  348. return srv.serveUDP(t)
  349. }
  350. }
  351. if l != nil {
  352. srv.started = true
  353. unlock()
  354. return srv.serveTCP(l)
  355. }
  356. return &Error{err: "bad listeners"}
  357. }
  358. // Shutdown shuts down a server. After a call to Shutdown, ListenAndServe and
  359. // ActivateAndServe will return.
  360. func (srv *Server) Shutdown() error {
  361. return srv.ShutdownContext(context.Background())
  362. }
  363. // ShutdownContext shuts down a server. After a call to ShutdownContext,
  364. // ListenAndServe and ActivateAndServe will return.
  365. //
  366. // A context.Context may be passed to limit how long to wait for connections
  367. // to terminate.
  368. func (srv *Server) ShutdownContext(ctx context.Context) error {
  369. srv.lock.Lock()
  370. if !srv.started {
  371. srv.lock.Unlock()
  372. return &Error{err: "server not started"}
  373. }
  374. srv.started = false
  375. if srv.PacketConn != nil {
  376. srv.PacketConn.SetReadDeadline(aLongTimeAgo) // Unblock reads
  377. }
  378. if srv.Listener != nil {
  379. srv.Listener.Close()
  380. }
  381. for rw := range srv.conns {
  382. rw.SetReadDeadline(aLongTimeAgo) // Unblock reads
  383. }
  384. srv.lock.Unlock()
  385. if testShutdownNotify != nil {
  386. testShutdownNotify.Broadcast()
  387. }
  388. var ctxErr error
  389. select {
  390. case <-srv.shutdown:
  391. case <-ctx.Done():
  392. ctxErr = ctx.Err()
  393. }
  394. if srv.PacketConn != nil {
  395. srv.PacketConn.Close()
  396. }
  397. return ctxErr
  398. }
  399. var testShutdownNotify *sync.Cond
  400. // getReadTimeout is a helper func to use system timeout if server did not intend to change it.
  401. func (srv *Server) getReadTimeout() time.Duration {
  402. if srv.ReadTimeout != 0 {
  403. return srv.ReadTimeout
  404. }
  405. return dnsTimeout
  406. }
  407. // serveTCP starts a TCP listener for the server.
  408. func (srv *Server) serveTCP(l net.Listener) error {
  409. defer l.Close()
  410. if srv.NotifyStartedFunc != nil {
  411. srv.NotifyStartedFunc()
  412. }
  413. var wg sync.WaitGroup
  414. defer func() {
  415. wg.Wait()
  416. close(srv.shutdown)
  417. }()
  418. for srv.isStarted() {
  419. rw, err := l.Accept()
  420. if err != nil {
  421. if !srv.isStarted() {
  422. return nil
  423. }
  424. if neterr, ok := err.(net.Error); ok && neterr.Temporary() {
  425. continue
  426. }
  427. return err
  428. }
  429. srv.lock.Lock()
  430. // Track the connection to allow unblocking reads on shutdown.
  431. srv.conns[rw] = struct{}{}
  432. srv.lock.Unlock()
  433. wg.Add(1)
  434. srv.spawnWorker(&response{
  435. tsigSecret: srv.TsigSecret,
  436. tcp: rw,
  437. wg: &wg,
  438. })
  439. }
  440. return nil
  441. }
  442. // serveUDP starts a UDP listener for the server.
  443. func (srv *Server) serveUDP(l *net.UDPConn) error {
  444. defer l.Close()
  445. if srv.NotifyStartedFunc != nil {
  446. srv.NotifyStartedFunc()
  447. }
  448. reader := Reader(defaultReader{srv})
  449. if srv.DecorateReader != nil {
  450. reader = srv.DecorateReader(reader)
  451. }
  452. var wg sync.WaitGroup
  453. defer func() {
  454. wg.Wait()
  455. close(srv.shutdown)
  456. }()
  457. rtimeout := srv.getReadTimeout()
  458. // deadline is not used here
  459. for srv.isStarted() {
  460. m, s, err := reader.ReadUDP(l, rtimeout)
  461. if err != nil {
  462. if !srv.isStarted() {
  463. return nil
  464. }
  465. if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
  466. continue
  467. }
  468. return err
  469. }
  470. if len(m) < headerSize {
  471. if cap(m) == srv.UDPSize {
  472. srv.udpPool.Put(m[:srv.UDPSize])
  473. }
  474. continue
  475. }
  476. wg.Add(1)
  477. srv.spawnWorker(&response{
  478. msg: m,
  479. tsigSecret: srv.TsigSecret,
  480. udp: l,
  481. udpSession: s,
  482. wg: &wg,
  483. })
  484. }
  485. return nil
  486. }
  487. func (srv *Server) serve(w *response) {
  488. if srv.DecorateWriter != nil {
  489. w.writer = srv.DecorateWriter(w)
  490. } else {
  491. w.writer = w
  492. }
  493. if w.udp != nil {
  494. // serve UDP
  495. srv.serveDNS(w)
  496. w.wg.Done()
  497. return
  498. }
  499. defer func() {
  500. if !w.hijacked {
  501. w.Close()
  502. }
  503. srv.lock.Lock()
  504. delete(srv.conns, w.tcp)
  505. srv.lock.Unlock()
  506. w.wg.Done()
  507. }()
  508. reader := Reader(defaultReader{srv})
  509. if srv.DecorateReader != nil {
  510. reader = srv.DecorateReader(reader)
  511. }
  512. idleTimeout := tcpIdleTimeout
  513. if srv.IdleTimeout != nil {
  514. idleTimeout = srv.IdleTimeout()
  515. }
  516. timeout := srv.getReadTimeout()
  517. limit := srv.MaxTCPQueries
  518. if limit == 0 {
  519. limit = maxTCPQueries
  520. }
  521. for q := 0; (q < limit || limit == -1) && srv.isStarted(); q++ {
  522. var err error
  523. w.msg, err = reader.ReadTCP(w.tcp, timeout)
  524. if err != nil {
  525. // TODO(tmthrgd): handle error
  526. break
  527. }
  528. srv.serveDNS(w)
  529. if w.tcp == nil {
  530. break // Close() was called
  531. }
  532. if w.hijacked {
  533. break // client will call Close() themselves
  534. }
  535. // The first read uses the read timeout, the rest use the
  536. // idle timeout.
  537. timeout = idleTimeout
  538. }
  539. }
  540. func (srv *Server) disposeBuffer(w *response) {
  541. if w.udp != nil && cap(w.msg) == srv.UDPSize {
  542. srv.udpPool.Put(w.msg[:srv.UDPSize])
  543. }
  544. w.msg = nil
  545. }
  546. func (srv *Server) serveDNS(w *response) {
  547. dh, off, err := unpackMsgHdr(w.msg, 0)
  548. if err != nil {
  549. // Let client hang, they are sending crap; any reply can be used to amplify.
  550. return
  551. }
  552. req := new(Msg)
  553. req.setHdr(dh)
  554. switch srv.MsgAcceptFunc(dh) {
  555. case MsgAccept:
  556. case MsgIgnore:
  557. return
  558. case MsgReject:
  559. req.SetRcodeFormatError(req)
  560. // Are we allowed to delete any OPT records here?
  561. req.Ns, req.Answer, req.Extra = nil, nil, nil
  562. w.WriteMsg(req)
  563. srv.disposeBuffer(w)
  564. return
  565. }
  566. if err := req.unpack(dh, w.msg, off); err != nil {
  567. req.SetRcodeFormatError(req)
  568. req.Ns, req.Answer, req.Extra = nil, nil, nil
  569. w.WriteMsg(req)
  570. srv.disposeBuffer(w)
  571. return
  572. }
  573. w.tsigStatus = nil
  574. if w.tsigSecret != nil {
  575. if t := req.IsTsig(); t != nil {
  576. if secret, ok := w.tsigSecret[t.Hdr.Name]; ok {
  577. w.tsigStatus = TsigVerify(w.msg, secret, "", false)
  578. } else {
  579. w.tsigStatus = ErrSecret
  580. }
  581. w.tsigTimersOnly = false
  582. w.tsigRequestMAC = req.Extra[len(req.Extra)-1].(*TSIG).MAC
  583. }
  584. }
  585. srv.disposeBuffer(w)
  586. handler := srv.Handler
  587. if handler == nil {
  588. handler = DefaultServeMux
  589. }
  590. handler.ServeDNS(w, req) // Writes back to the client
  591. }
  592. func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  593. // If we race with ShutdownContext, the read deadline may
  594. // have been set in the distant past to unblock the read
  595. // below. We must not override it, otherwise we may block
  596. // ShutdownContext.
  597. srv.lock.RLock()
  598. if srv.started {
  599. conn.SetReadDeadline(time.Now().Add(timeout))
  600. }
  601. srv.lock.RUnlock()
  602. l := make([]byte, 2)
  603. n, err := conn.Read(l)
  604. if err != nil || n != 2 {
  605. if err != nil {
  606. return nil, err
  607. }
  608. return nil, ErrShortRead
  609. }
  610. length := binary.BigEndian.Uint16(l)
  611. if length == 0 {
  612. return nil, ErrShortRead
  613. }
  614. m := make([]byte, int(length))
  615. n, err = conn.Read(m[:int(length)])
  616. if err != nil || n == 0 {
  617. if err != nil {
  618. return nil, err
  619. }
  620. return nil, ErrShortRead
  621. }
  622. i := n
  623. for i < int(length) {
  624. j, err := conn.Read(m[i:int(length)])
  625. if err != nil {
  626. return nil, err
  627. }
  628. i += j
  629. }
  630. n = i
  631. m = m[:n]
  632. return m, nil
  633. }
  634. func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  635. srv.lock.RLock()
  636. if srv.started {
  637. // See the comment in readTCP above.
  638. conn.SetReadDeadline(time.Now().Add(timeout))
  639. }
  640. srv.lock.RUnlock()
  641. m := srv.udpPool.Get().([]byte)
  642. n, s, err := ReadFromSessionUDP(conn, m)
  643. if err != nil {
  644. srv.udpPool.Put(m)
  645. return nil, nil, err
  646. }
  647. m = m[:n]
  648. return m, s, nil
  649. }
  650. // WriteMsg implements the ResponseWriter.WriteMsg method.
  651. func (w *response) WriteMsg(m *Msg) (err error) {
  652. if w.closed {
  653. return &Error{err: "WriteMsg called after Close"}
  654. }
  655. var data []byte
  656. if w.tsigSecret != nil { // if no secrets, dont check for the tsig (which is a longer check)
  657. if t := m.IsTsig(); t != nil {
  658. data, w.tsigRequestMAC, err = TsigGenerate(m, w.tsigSecret[t.Hdr.Name], w.tsigRequestMAC, w.tsigTimersOnly)
  659. if err != nil {
  660. return err
  661. }
  662. _, err = w.writer.Write(data)
  663. return err
  664. }
  665. }
  666. data, err = m.Pack()
  667. if err != nil {
  668. return err
  669. }
  670. _, err = w.writer.Write(data)
  671. return err
  672. }
  673. // Write implements the ResponseWriter.Write method.
  674. func (w *response) Write(m []byte) (int, error) {
  675. if w.closed {
  676. return 0, &Error{err: "Write called after Close"}
  677. }
  678. switch {
  679. case w.udp != nil:
  680. return WriteToSessionUDP(w.udp, m, w.udpSession)
  681. case w.tcp != nil:
  682. lm := len(m)
  683. if lm < 2 {
  684. return 0, io.ErrShortBuffer
  685. }
  686. if lm > MaxMsgSize {
  687. return 0, &Error{err: "message too large"}
  688. }
  689. l := make([]byte, 2, 2+lm)
  690. binary.BigEndian.PutUint16(l, uint16(lm))
  691. m = append(l, m...)
  692. n, err := io.Copy(w.tcp, bytes.NewReader(m))
  693. return int(n), err
  694. default:
  695. panic("dns: internal error: udp and tcp both nil")
  696. }
  697. }
  698. // LocalAddr implements the ResponseWriter.LocalAddr method.
  699. func (w *response) LocalAddr() net.Addr {
  700. switch {
  701. case w.udp != nil:
  702. return w.udp.LocalAddr()
  703. case w.tcp != nil:
  704. return w.tcp.LocalAddr()
  705. default:
  706. panic("dns: internal error: udp and tcp both nil")
  707. }
  708. }
  709. // RemoteAddr implements the ResponseWriter.RemoteAddr method.
  710. func (w *response) RemoteAddr() net.Addr {
  711. switch {
  712. case w.udpSession != nil:
  713. return w.udpSession.RemoteAddr()
  714. case w.tcp != nil:
  715. return w.tcp.RemoteAddr()
  716. default:
  717. panic("dns: internal error: udpSession and tcp both nil")
  718. }
  719. }
  720. // TsigStatus implements the ResponseWriter.TsigStatus method.
  721. func (w *response) TsigStatus() error { return w.tsigStatus }
  722. // TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
  723. func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
  724. // Hijack implements the ResponseWriter.Hijack method.
  725. func (w *response) Hijack() { w.hijacked = true }
  726. // Close implements the ResponseWriter.Close method
  727. func (w *response) Close() error {
  728. if w.closed {
  729. return &Error{err: "connection already closed"}
  730. }
  731. w.closed = true
  732. switch {
  733. case w.udp != nil:
  734. // Can't close the udp conn, as that is actually the listener.
  735. return nil
  736. case w.tcp != nil:
  737. return w.tcp.Close()
  738. default:
  739. panic("dns: internal error: udp and tcp both nil")
  740. }
  741. }
  742. // ConnectionState() implements the ConnectionStater.ConnectionState() interface.
  743. func (w *response) ConnectionState() *tls.ConnectionState {
  744. type tlsConnectionStater interface {
  745. ConnectionState() tls.ConnectionState
  746. }
  747. if v, ok := w.tcp.(tlsConnectionStater); ok {
  748. t := v.ConnectionState()
  749. return &t
  750. }
  751. return nil
  752. }