diff --git a/api/panel/node.go b/api/panel/node.go index 25a75e3..abd9bb8 100644 --- a/api/panel/node.go +++ b/api/panel/node.go @@ -134,8 +134,18 @@ func (c *Client) GetNodeInfo() (node *NodeInfo, err error) { if err = c.checkResponse(r, path, err); err != nil { return nil, err } - if r.StatusCode() == 304 { - return nil, nil + + if r != nil { + defer func() { + if r.RawBody() != nil { + r.RawBody().Close() + } + }() + if r.StatusCode() == 304 { + return nil, nil + } + } else { + return nil, fmt.Errorf("received nil response") } node = &NodeInfo{ Id: c.NodeId, diff --git a/api/panel/user.go b/api/panel/user.go index b2a4aea..023a502 100644 --- a/api/panel/user.go +++ b/api/panel/user.go @@ -30,13 +30,21 @@ func (c *Client) GetUserList() (UserList []UserInfo, err error) { r, err := c.client.R(). SetHeader("If-None-Match", c.userEtag). Get(path) - err = c.checkResponse(r, path, err) - if err != nil { + if err = c.checkResponse(r, path, err); err != nil { return nil, err } - if r.StatusCode() == 304 { - return nil, nil + if r != nil { + defer func() { + if r.RawBody() != nil { + r.RawBody().Close() + } + }() + if r.StatusCode() == 304 { + return nil, nil + } + } else { + return nil, fmt.Errorf("received nil response") } var userList *UserListBody err = json.Unmarshal(r.Body(), &userList) diff --git a/conf/conf.go b/conf/conf.go index 7fdd933..7ffa61a 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -2,9 +2,11 @@ package conf import ( "fmt" - "github.com/InazumaV/V2bX/common/json5" + "io" "os" + "github.com/InazumaV/V2bX/common/json5" + "github.com/goccy/go-json" ) @@ -29,5 +31,17 @@ func (p *Conf) LoadFromPath(filePath string) error { return fmt.Errorf("open config file error: %s", err) } defer f.Close() - return json.NewDecoder(json5.NewTrimNodeReader(f)).Decode(p) + + reader := json5.NewTrimNodeReader(f) + data, err := io.ReadAll(reader) + if err != nil { + return fmt.Errorf("read config file error: %s", err) + } + + err = json.Unmarshal(data, p) + if err != nil { + return fmt.Errorf("unmarshal config error: %s", err) + } + + return nil } diff --git a/core/sing/sing.go b/core/sing/sing.go index 6bf6550..cd6b451 100644 --- a/core/sing/sing.go +++ b/core/sing/sing.go @@ -3,6 +3,7 @@ package sing import ( "context" "fmt" + "io" "os" "github.com/sagernet/sing-box/log" @@ -38,14 +39,13 @@ func init() { func New(c *conf.CoreConfig) (vCore.Core, error) { options := option.Options{} if len(c.SingConfig.OriginalPath) != 0 { - f, err := os.Open(c.SingConfig.OriginalPath) + data, err := os.ReadFile(c.SingConfig.OriginalPath) if err != nil { - return nil, fmt.Errorf("open original config error: %s", err) + return nil, fmt.Errorf("read original config error: %s", err) } - defer f.Close() - err = json.NewDecoder(f).Decode(&options) + err = json.Unmarshal(data, &options) if err != nil { - return nil, fmt.Errorf("decode original config error: %s", err) + return nil, fmt.Errorf("unmarshal original config error: %s", err) } } options.Log = &option.LogOptions{ @@ -68,11 +68,19 @@ func New(c *conf.CoreConfig) (vCore.Core, error) { return nil, fmt.Errorf("failed to open or create sing dns config file: %s", err) } defer f.Close() - if err := json.NewDecoder(f).Decode(options.DNS); err != nil { + data, err := io.ReadAll(f) + if err != nil { log.Warn(fmt.Sprintf( - "Failed to unmarshal sing dns config from file '%v': %v. Using default DNS options", + "Failed to read sing dns config from file '%v': %v. Using default DNS options", f.Name(), err)) options.DNS = &option.DNSOptions{} + } else { + if err := json.Unmarshal(data, options.DNS); err != nil { + log.Warn(fmt.Sprintf( + "Failed to unmarshal sing dns config from file '%v': %v. Using default DNS options", + f.Name(), err)) + options.DNS = &option.DNSOptions{} + } } os.Setenv("SING_DNS_PATH", c.SingConfig.DnsConfigPath) } diff --git a/core/xray/dns.go b/core/xray/dns.go index 59a6f81..db9af8c 100644 --- a/core/xray/dns.go +++ b/core/xray/dns.go @@ -2,14 +2,15 @@ package xray import ( "bytes" - "github.com/InazumaV/V2bX/api/panel" - "github.com/goccy/go-json" - log "github.com/sirupsen/logrus" - coreConf "github.com/xtls/xray-core/infra/conf" "net" "os" "strconv" "strings" + + "github.com/InazumaV/V2bX/api/panel" + "github.com/goccy/go-json" + log "github.com/sirupsen/logrus" + coreConf "github.com/xtls/xray-core/infra/conf" ) func updateDNSConfig(node *panel.NodeInfo) (err error) { @@ -62,7 +63,7 @@ func saveDnsConfig(dns []byte, dnsPath string) (err error) { } if !bytes.Equal(currentData, dns) { coreDnsConfig := &coreConf.DNSConfig{} - if err = json.NewDecoder(bytes.NewReader(dns)).Decode(coreDnsConfig); err != nil { + if err = json.Unmarshal(dns, coreDnsConfig); err != nil { log.WithField("err", err).Error("Failed to unmarshal DNS config") } _, err := coreDnsConfig.Build() diff --git a/main.go b/main.go index 58a08b9..d8a280c 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - _ "net/http" _ "net/http/pprof" "github.com/InazumaV/V2bX/cmd" @@ -10,7 +9,7 @@ import ( func main() { //内存泄漏排查 // go func() { - // http.ListenAndServe("0.0.0.0:6060", nil) + // http.ListenAndServe("127.0.0.1:6060", nil) // }() cmd.Run() } diff --git a/node/lego.go b/node/lego.go index 2bafbae..8d8af04 100644 --- a/node/lego.go +++ b/node/lego.go @@ -262,12 +262,14 @@ func (u *User) DecodePrivate(pemEncodedPriv string) (*ecdsa.PrivateKey, error) { privateKey, err := x509.ParseECPrivateKey(x509EncodedPriv) return privateKey, err } + func (u *User) Load(path string) error { - f, err := os.Open(path) + data, err := os.ReadFile(path) if err != nil { return fmt.Errorf("open file error: %s", err) } - err = json.NewDecoder(f).Decode(u) + + err = json.Unmarshal(data, u) if err != nil { return fmt.Errorf("unmarshal json error: %s", err) }