Add workaround for bulkBarrierPreWrite: unaligned arguments panic

This commit is contained in:
世界 2024-12-10 13:04:55 +08:00
parent 1e6a3f1f0b
commit cec7e47086
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
5 changed files with 28 additions and 22 deletions

View File

@ -139,17 +139,17 @@ func (s *platformInterfaceStub) SendNotification(notification *platform.Notifica
return nil return nil
} }
func FormatConfig(configContent string) (string, error) { func FormatConfig(configContent string) (*StringBox, error) {
options, err := parseConfig(configContent) options, err := parseConfig(configContent)
if err != nil { if err != nil {
return "", err return nil, err
} }
var buffer bytes.Buffer var buffer bytes.Buffer
encoder := json.NewEncoder(&buffer) encoder := json.NewEncoder(&buffer)
encoder.SetIndent("", " ") encoder.SetIndent("", " ")
err = encoder.Encode(options) err = encoder.Encode(options)
if err != nil { if err != nil {
return "", err return nil, err
} }
return buffer.String(), nil return wrapString(buffer.String()), nil
} }

View File

@ -50,8 +50,7 @@ type HTTPRequest interface {
} }
type HTTPResponse interface { type HTTPResponse interface {
GetContent() ([]byte, error) GetContent() (*StringBox, error)
GetContentString() (string, error)
WriteTo(path string) error WriteTo(path string) error
} }
@ -210,27 +209,22 @@ type httpResponse struct {
} }
func (h *httpResponse) errorString() string { func (h *httpResponse) errorString() string {
content, err := h.GetContentString() content, err := h.GetContent()
if err != nil { if err != nil {
return fmt.Sprint("HTTP ", h.Status) return fmt.Sprint("HTTP ", h.Status)
} }
return fmt.Sprint("HTTP ", h.Status, ": ", content) return fmt.Sprint("HTTP ", h.Status, ": ", content)
} }
func (h *httpResponse) GetContent() ([]byte, error) { func (h *httpResponse) GetContent() (*StringBox, error) {
h.getContentOnce.Do(func() { h.getContentOnce.Do(func() {
defer h.Body.Close() defer h.Body.Close()
h.content, h.contentError = io.ReadAll(h.Body) h.content, h.contentError = io.ReadAll(h.Body)
}) })
return h.content, h.contentError if h.contentError != nil {
} return nil, h.contentError
func (h *httpResponse) GetContentString() (string, error) {
content, err := h.GetContent()
if err != nil {
return "", err
} }
return string(content), nil return wrapString(string(h.content)), nil
} }
func (h *httpResponse) WriteTo(path string) error { func (h *httpResponse) WriteTo(path string) error {

View File

@ -0,0 +1,12 @@
package libbox
// https://github.com/golang/go/issues/46893
// TODO: remove after `bulkBarrierPreWrite: unaligned arguments` fixed
type StringBox struct {
Value string
}
func wrapString(value string) *StringBox {
return &StringBox{Value: value}
}

View File

@ -13,12 +13,12 @@ func ClearServiceError() {
os.Remove(serviceErrorPath()) os.Remove(serviceErrorPath())
} }
func ReadServiceError() (string, error) { func ReadServiceError() (*StringBox, error) {
data, err := os.ReadFile(serviceErrorPath()) data, err := os.ReadFile(serviceErrorPath())
if err == nil { if err == nil {
os.Remove(serviceErrorPath()) os.Remove(serviceErrorPath())
} }
return string(data), err return wrapString(string(data)), err
} }
func WriteServiceError(message string) error { func WriteServiceError(message string) error {

View File

@ -13,7 +13,7 @@ import (
type TunOptions interface { type TunOptions interface {
GetInet4Address() RoutePrefixIterator GetInet4Address() RoutePrefixIterator
GetInet6Address() RoutePrefixIterator GetInet6Address() RoutePrefixIterator
GetDNSServerAddress() (string, error) GetDNSServerAddress() (*StringBox, error)
GetMTU() int32 GetMTU() int32
GetAutoRoute() bool GetAutoRoute() bool
GetStrictRoute() bool GetStrictRoute() bool
@ -89,11 +89,11 @@ func (o *tunOptions) GetInet6Address() RoutePrefixIterator {
return mapRoutePrefix(o.Inet6Address) return mapRoutePrefix(o.Inet6Address)
} }
func (o *tunOptions) GetDNSServerAddress() (string, error) { func (o *tunOptions) GetDNSServerAddress() (*StringBox, error) {
if len(o.Inet4Address) == 0 || o.Inet4Address[0].Bits() == 32 { if len(o.Inet4Address) == 0 || o.Inet4Address[0].Bits() == 32 {
return "", E.New("need one more IPv4 address for DNS hijacking") return nil, E.New("need one more IPv4 address for DNS hijacking")
} }
return o.Inet4Address[0].Addr().Next().String(), nil return wrapString(o.Inet4Address[0].Addr().Next().String()), nil
} }
func (o *tunOptions) GetMTU() int32 { func (o *tunOptions) GetMTU() int32 {