@@ -26,10 +26,10 @@ func EmbedReleaseDataInBinary(binPath string, releasePath string, outputPath str
26
26
// in arm64 binaries, the delimiters will already be part of the binary content in plain text,
27
27
// so we need to check if the binary content _ends_ with the end delimiter in order to
28
28
// determine if a release data is already embedded in the binary.
29
- if bytes .HasSuffix (binContent , endReleaseDelimiterBytes ( )) {
30
- start := bytes . LastIndex (binContent , beginReleaseDelimiterBytes () )
31
- end := bytes . LastIndex (binContent , endReleaseDelimiterBytes () )
32
- binContent = append (binContent [:start ], binContent [end + len ( endReleaseDelimiterBytes () ):]... )
29
+ if bytes .HasSuffix (binContent , delimiterBytes ( endReleaseDelimiter )) {
30
+ start := lastIndexOfDelimiter (binContent , beginReleaseDelimiter )
31
+ end := lastIndexOfDelimiter (binContent , endReleaseDelimiter )
32
+ binContent = append (binContent [:start ], binContent [end + lengthOfDelimiter ( endReleaseDelimiter ):]... )
33
33
}
34
34
35
35
binReader := bytes .NewReader (binContent )
@@ -62,15 +62,15 @@ func EmbedReleaseDataInBinaryReader(binReader io.Reader, binSize int64, releaseD
62
62
encodedRelease := base64 .StdEncoding .EncodeToString (releaseData )
63
63
64
64
newBinSize := binSize
65
- newBinSize += int64 (len ( beginReleaseDelimiterBytes () ))
65
+ newBinSize += int64 (lengthOfDelimiter ( beginReleaseDelimiter ))
66
66
newBinSize += int64 (len (encodedRelease ))
67
- newBinSize += int64 (len ( endReleaseDelimiterBytes () ))
67
+ newBinSize += int64 (lengthOfDelimiter ( endReleaseDelimiter ))
68
68
69
69
newBinReader := io .MultiReader (
70
70
binReader ,
71
- bytes .NewReader (beginReleaseDelimiterBytes ( )),
71
+ bytes .NewReader (delimiterBytes ( beginReleaseDelimiter )),
72
72
strings .NewReader (encodedRelease ),
73
- bytes .NewReader (endReleaseDelimiterBytes ( )),
73
+ bytes .NewReader (delimiterBytes ( endReleaseDelimiter )),
74
74
)
75
75
76
76
return newBinReader , newBinSize
@@ -83,25 +83,25 @@ func ExtractReleaseDataFromBinary(exe string) ([]byte, error) {
83
83
return nil , fmt .Errorf ("failed to read executable: %w" , err )
84
84
}
85
85
86
- start := bytes . LastIndex (binContent , beginReleaseDelimiterBytes () )
86
+ start := lastIndexOfDelimiter (binContent , beginReleaseDelimiter )
87
87
if start == - 1 {
88
88
return nil , nil
89
89
}
90
90
91
- end := bytes . LastIndex (binContent , endReleaseDelimiterBytes () )
91
+ end := lastIndexOfDelimiter (binContent , endReleaseDelimiter )
92
92
if end == - 1 {
93
93
return nil , fmt .Errorf ("failed to find end delimiter in executable" )
94
94
}
95
95
96
- if start + len ( beginReleaseDelimiterBytes () ) > len (binContent ) {
96
+ if start + lengthOfDelimiter ( beginReleaseDelimiter ) > len (binContent ) {
97
97
return nil , fmt .Errorf ("invalid start delimiter" )
98
- } else if start + len ( beginReleaseDelimiterBytes () ) > end {
98
+ } else if start + lengthOfDelimiter ( beginReleaseDelimiter ) > end {
99
99
return nil , fmt .Errorf ("start delimter after end delimter" )
100
100
} else if end > len (binContent ) {
101
101
return nil , fmt .Errorf ("invalid end delimiter" )
102
102
}
103
103
104
- encoded := binContent [start + len ( beginReleaseDelimiterBytes () ) : end ]
104
+ encoded := binContent [start + lengthOfDelimiter ( beginReleaseDelimiter ) : end ]
105
105
106
106
decoded , err := base64 .StdEncoding .DecodeString (string (encoded ))
107
107
if err != nil {
@@ -111,10 +111,18 @@ func ExtractReleaseDataFromBinary(exe string) ([]byte, error) {
111
111
return decoded , nil
112
112
}
113
113
114
- func beginReleaseDelimiterBytes () []byte {
115
- return []byte (dashes + beginReleaseDelimiter + dashes )
114
+ // the go compiler will optimize concatenation of bytes as a constant string which will cause
115
+ // ExtractReleaseDataFromBinary to fail because it will find the delimiter in the wrong place.
116
+ // This function is used to create a byte slice that will be used as a delimiter while working
117
+ // around this issue.
118
+ func delimiterBytes (delim string ) []byte {
119
+ return []byte (dashes + delim + dashes )
116
120
}
117
121
118
- func endReleaseDelimiterBytes () []byte {
119
- return []byte (dashes + endReleaseDelimiter + dashes )
122
+ func lastIndexOfDelimiter (s []byte , delim string ) int {
123
+ return bytes .LastIndex (s , delimiterBytes (delim ))
124
+ }
125
+
126
+ func lengthOfDelimiter (delim string ) int {
127
+ return len (delimiterBytes (delim ))
120
128
}
0 commit comments