015-fix-a-problem-that-supervisor-cannot-exit-normally.patch 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. From 3f78422f81f3abc2668fc3938b31d213bfe4dfff Mon Sep 17 00:00:00 2001
  2. From: mzz2017 <[email protected]>
  3. Date: Sun, 28 Aug 2022 17:54:36 +0800
  4. Subject: [PATCH] fix: a problem that supervisor cannot exit normally
  5. ---
  6. service/core/specialMode/infra/handle.go | 11 ++++++----
  7. service/core/specialMode/infra/supervisor.go | 22 ++++++++------------
  8. 2 files changed, 16 insertions(+), 17 deletions(-)
  9. --- a/core/specialMode/infra/handle.go
  10. +++ b/core/specialMode/infra/handle.go
  11. @@ -127,10 +127,13 @@ func (interfaceHandle *handle) handleRec
  12. return results, msg
  13. }
  14. -func packetFilter(portCache *portCache, pPacket *gopacket.Packet, whitelistDnsServers *v2router.GeoIPMatcher) (m *dnsmessage.Message, pSAddr, pSPort, pDAddr, pDPort *gopacket.Endpoint) {
  15. - packet := *pPacket
  16. - trans := packet.TransportLayer()
  17. +func packetFilter(portCache *portCache, packet gopacket.Packet, whitelistDnsServers *v2router.GeoIPMatcher) (m *dnsmessage.Message, pSAddr, pSPort, pDAddr, pDPort *gopacket.Endpoint) {
  18. + //跳过非网络层的包
  19. + if packet.NetworkLayer() == nil {
  20. + return
  21. + }
  22. //跳过非传输层的包
  23. + trans := packet.TransportLayer()
  24. if trans == nil {
  25. return
  26. }
  27. @@ -180,7 +183,7 @@ func packetFilter(portCache *portCache,
  28. }
  29. func (interfaceHandle *handle) handlePacket(packet gopacket.Packet, ifname string, whitelistDnsServers *v2router.GeoIPMatcher, whitelistDomains *strmatcher.MatcherGroup) {
  30. - m, sAddr, sPort, dAddr, dPort := packetFilter(interfaceHandle.portCache, &packet, whitelistDnsServers)
  31. + m, sAddr, sPort, dAddr, dPort := packetFilter(interfaceHandle.portCache, packet, whitelistDnsServers)
  32. if m == nil {
  33. return
  34. }
  35. --- a/core/specialMode/infra/supervisor.go
  36. +++ b/core/specialMode/infra/supervisor.go
  37. @@ -9,7 +9,6 @@ import (
  38. v2router "github.com/v2rayA/v2ray-lib/router"
  39. "github.com/v2rayA/v2rayA/pkg/util/log"
  40. "sync"
  41. - "time"
  42. )
  43. type DnsSupervisor struct {
  44. @@ -70,7 +69,7 @@ func (d *DnsSupervisor) DeleteHandles(if
  45. }
  46. close(d.handles[ifname].done)
  47. delete(d.handles, ifname)
  48. - log.Trace("DnsSupervisor:%v closed", ifname)
  49. + log.Trace("DnsSupervisor:%v deleted", ifname)
  50. return
  51. }
  52. @@ -81,28 +80,24 @@ func (d *DnsSupervisor) Run(ifname strin
  53. d.inner.Lock()
  54. handle, ok := d.handles[ifname]
  55. if !ok {
  56. + d.inner.Unlock()
  57. return fmt.Errorf("Run: %v not exsits", ifname)
  58. }
  59. if handle.running {
  60. + d.inner.Unlock()
  61. return fmt.Errorf("Run: %v is running", ifname)
  62. }
  63. handle.running = true
  64. log.Trace("[DnsSupervisor] " + ifname + ": running")
  65. - pkgsrc := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet)
  66. + // we only decode UDP packets
  67. + pkgsrc := gopacket.NewPacketSource(handle, layers.LayerTypeDNS)
  68. pkgsrc.NoCopy = true
  69. + //pkgsrc.Lazy = true
  70. d.inner.Unlock()
  71. packets := pkgsrc.Packets()
  72. go func() {
  73. - for {
  74. - //心跳包,防止内存泄漏
  75. - packets <- gopacket.NewPacket(nil, layers.LinkTypeEthernet, gopacket.DecodeOptions{})
  76. - select {
  77. - case <-handle.done:
  78. - return
  79. - default:
  80. - time.Sleep(2 * time.Second)
  81. - }
  82. - }
  83. + <-handle.done
  84. + packets <- gopacket.NewPacket(nil, layers.LinkTypeEthernet, pkgsrc.DecodeOptions)
  85. }()
  86. out:
  87. for packet := range packets {
  88. @@ -113,5 +108,6 @@ out:
  89. }
  90. go handle.handlePacket(packet, ifname, whitelistDnsServers, whitelistDomains)
  91. }
  92. + log.Trace("DnsSupervisor:%v closed", ifname)
  93. return
  94. }