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