From 7c9c5d7cd9e1b946a25b57726d816abb79873bb9 Mon Sep 17 00:00:00 2001
From: fiatjaf <fiatjaf@gmail.com>
Date: Fri, 14 Mar 2025 21:09:33 -0300
Subject: [PATCH] fix unsafe strings that change underneath us on envelope
 parsing by force-copying them as gjson doesn't.

---
 envelopes.go | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/envelopes.go b/envelopes.go
index c2a52c9..3018862 100644
--- a/envelopes.go
+++ b/envelopes.go
@@ -100,7 +100,8 @@ func (v *EventEnvelope) FromJSON(data string) error {
 	case 2:
 		return easyjson.Unmarshal(unsafe.Slice(unsafe.StringData(arr[1].Raw), len(arr[1].Raw)), &v.Event)
 	case 3:
-		v.SubscriptionID = &arr[1].Str
+		subid := string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str)))
+		v.SubscriptionID = &subid
 		return easyjson.Unmarshal(unsafe.Slice(unsafe.StringData(arr[2].Raw), len(arr[2].Raw)), &v.Event)
 	default:
 		return fmt.Errorf("failed to decode EVENT envelope")
@@ -134,7 +135,7 @@ func (v *ReqEnvelope) FromJSON(data string) error {
 	if len(arr) < 3 {
 		return fmt.Errorf("failed to decode REQ envelope: missing filters")
 	}
-	v.SubscriptionID = arr[1].Str
+	v.SubscriptionID = string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str)))
 	v.Filters = make(Filters, len(arr)-2)
 	f := 0
 	for i := 2; i < len(arr); i++ {
@@ -180,7 +181,7 @@ func (v *CountEnvelope) FromJSON(data string) error {
 	if len(arr) < 3 {
 		return fmt.Errorf("failed to decode COUNT envelope: missing filters")
 	}
-	v.SubscriptionID = arr[1].Str
+	v.SubscriptionID = string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str)))
 
 	var countResult struct {
 		Count *int64 `json:"count"`
@@ -249,7 +250,7 @@ func (v *NoticeEnvelope) FromJSON(data string) error {
 	if len(arr) < 2 {
 		return fmt.Errorf("failed to decode NOTICE envelope")
 	}
-	*v = NoticeEnvelope(arr[1].Str)
+	*v = NoticeEnvelope(string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str))))
 	return nil
 }
 
@@ -276,7 +277,7 @@ func (v *EOSEEnvelope) FromJSON(data string) error {
 	if len(arr) < 2 {
 		return fmt.Errorf("failed to decode EOSE envelope")
 	}
-	*v = EOSEEnvelope(arr[1].Str)
+	*v = EOSEEnvelope(string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str))))
 	return nil
 }
 
@@ -302,7 +303,7 @@ func (v *CloseEnvelope) FromJSON(data string) error {
 	arr := r.Array()
 	switch len(arr) {
 	case 2:
-		*v = CloseEnvelope(arr[1].Str)
+		*v = CloseEnvelope(string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str))))
 		return nil
 	default:
 		return fmt.Errorf("failed to decode CLOSE envelope")
@@ -334,7 +335,10 @@ func (v *ClosedEnvelope) FromJSON(data string) error {
 	arr := r.Array()
 	switch len(arr) {
 	case 3:
-		*v = ClosedEnvelope{arr[1].Str, arr[2].Str}
+		*v = ClosedEnvelope{
+			string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str))),
+			string(unsafe.Slice(unsafe.StringData(arr[2].Str), len(arr[2].Str))),
+		}
 		return nil
 	default:
 		return fmt.Errorf("failed to decode CLOSED envelope")
@@ -370,9 +374,9 @@ func (v *OKEnvelope) FromJSON(data string) error {
 	if len(arr) < 4 {
 		return fmt.Errorf("failed to decode OK envelope: missing fields")
 	}
-	v.EventID = arr[1].Str
+	v.EventID = string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str)))
 	v.OK = arr[2].Raw == "true"
-	v.Reason = arr[3].Str
+	v.Reason = string(unsafe.Slice(unsafe.StringData(arr[3].Str), len(arr[3].Str)))
 
 	return nil
 }
@@ -414,7 +418,8 @@ func (v *AuthEnvelope) FromJSON(data string) error {
 	if arr[1].IsObject() {
 		return easyjson.Unmarshal(unsafe.Slice(unsafe.StringData(arr[1].Raw), len(arr[1].Raw)), &v.Event)
 	} else {
-		v.Challenge = &arr[1].Str
+		challenge := string(unsafe.Slice(unsafe.StringData(arr[1].Str), len(arr[1].Str)))
+		v.Challenge = &challenge
 	}
 	return nil
 }