Skip to content

Commit 7410a42

Browse files
committed
fix: hack utils finds delim in code
1 parent 0a853bd commit 7410a42

File tree

2 files changed

+44
-22
lines changed

2 files changed

+44
-22
lines changed

Diff for: utils/pkg/embed/embed.go

+25-17
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ func EmbedReleaseDataInBinary(binPath string, releasePath string, outputPath str
2626
// in arm64 binaries, the delimiters will already be part of the binary content in plain text,
2727
// so we need to check if the binary content _ends_ with the end delimiter in order to
2828
// 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):]...)
3333
}
3434

3535
binReader := bytes.NewReader(binContent)
@@ -62,15 +62,15 @@ func EmbedReleaseDataInBinaryReader(binReader io.Reader, binSize int64, releaseD
6262
encodedRelease := base64.StdEncoding.EncodeToString(releaseData)
6363

6464
newBinSize := binSize
65-
newBinSize += int64(len(beginReleaseDelimiterBytes()))
65+
newBinSize += int64(lengthOfDelimiter(beginReleaseDelimiter))
6666
newBinSize += int64(len(encodedRelease))
67-
newBinSize += int64(len(endReleaseDelimiterBytes()))
67+
newBinSize += int64(lengthOfDelimiter(endReleaseDelimiter))
6868

6969
newBinReader := io.MultiReader(
7070
binReader,
71-
bytes.NewReader(beginReleaseDelimiterBytes()),
71+
bytes.NewReader(delimiterBytes(beginReleaseDelimiter)),
7272
strings.NewReader(encodedRelease),
73-
bytes.NewReader(endReleaseDelimiterBytes()),
73+
bytes.NewReader(delimiterBytes(endReleaseDelimiter)),
7474
)
7575

7676
return newBinReader, newBinSize
@@ -83,25 +83,25 @@ func ExtractReleaseDataFromBinary(exe string) ([]byte, error) {
8383
return nil, fmt.Errorf("failed to read executable: %w", err)
8484
}
8585

86-
start := bytes.LastIndex(binContent, beginReleaseDelimiterBytes())
86+
start := lastIndexOfDelimiter(binContent, beginReleaseDelimiter)
8787
if start == -1 {
8888
return nil, nil
8989
}
9090

91-
end := bytes.LastIndex(binContent, endReleaseDelimiterBytes())
91+
end := lastIndexOfDelimiter(binContent, endReleaseDelimiter)
9292
if end == -1 {
9393
return nil, fmt.Errorf("failed to find end delimiter in executable")
9494
}
9595

96-
if start+len(beginReleaseDelimiterBytes()) > len(binContent) {
96+
if start+lengthOfDelimiter(beginReleaseDelimiter) > len(binContent) {
9797
return nil, fmt.Errorf("invalid start delimiter")
98-
} else if start+len(beginReleaseDelimiterBytes()) > end {
98+
} else if start+lengthOfDelimiter(beginReleaseDelimiter) > end {
9999
return nil, fmt.Errorf("start delimter after end delimter")
100100
} else if end > len(binContent) {
101101
return nil, fmt.Errorf("invalid end delimiter")
102102
}
103103

104-
encoded := binContent[start+len(beginReleaseDelimiterBytes()) : end]
104+
encoded := binContent[start+lengthOfDelimiter(beginReleaseDelimiter) : end]
105105

106106
decoded, err := base64.StdEncoding.DecodeString(string(encoded))
107107
if err != nil {
@@ -111,10 +111,18 @@ func ExtractReleaseDataFromBinary(exe string) ([]byte, error) {
111111
return decoded, nil
112112
}
113113

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)
116120
}
117121

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))
120128
}

Diff for: utils/pkg/embed/embed_test.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,36 @@ func TestEmbedReleaseDataInBinary(t *testing.T) {
4141
gotBinContent, err := os.ReadFile(outputFile.Name())
4242
assert.NoError(t, err)
4343

44-
wantBinContent := append(binContent, beginReleaseDelimiterBytes()...)
44+
wantBinContent := append(binContent, delimiterBytes(beginReleaseDelimiter)...)
4545
wantBinContent = append(wantBinContent, []byte(encodedRelease)...)
46-
wantBinContent = append(wantBinContent, endReleaseDelimiterBytes()...)
46+
wantBinContent = append(wantBinContent, delimiterBytes(endReleaseDelimiter)...)
4747

4848
assert.Equal(t, string(wantBinContent), string(gotBinContent))
4949

5050
// Verify the new binary size
5151
gotBinSize := int64(len(gotBinContent))
52-
wantBinSize := int64(len(binContent)) + int64(len(beginReleaseDelimiterBytes())) + int64(len(encodedRelease)) + int64(len(endReleaseDelimiterBytes()))
52+
wantBinSize := int64(len(binContent)) + int64(lengthOfDelimiter(beginReleaseDelimiter)) + int64(len(encodedRelease)) + int64(lengthOfDelimiter(endReleaseDelimiter))
5353
assert.Equal(t, wantBinSize, gotBinSize)
5454

5555
// Extract and verify the embedded release data
5656
embeddedData, err := ExtractReleaseDataFromBinary(outputFile.Name())
5757
assert.NoError(t, err)
5858

5959
assert.Equal(t, string(releaseData), string(embeddedData))
60+
61+
outputOutputFile, err := os.CreateTemp("", "test-output")
62+
assert.NoError(t, err)
63+
defer os.Remove(outputOutputFile.Name())
64+
65+
// Embed twice to make sure it does not duplicate the release data
66+
err = EmbedReleaseDataInBinary(outputFile.Name(), releaseFile.Name(), outputOutputFile.Name())
67+
assert.NoError(t, err)
68+
69+
// Verify the new binary content
70+
gotBinContent, err = os.ReadFile(outputOutputFile.Name())
71+
assert.NoError(t, err)
72+
73+
assert.Equal(t, string(wantBinContent), string(gotBinContent))
6074
}
6175

6276
func TestNoReleaseData(t *testing.T) {
@@ -71,9 +85,9 @@ func TestNoReleaseData(t *testing.T) {
7185
}
7286

7387
func Test_beginReleaseDelimiterBytes(t *testing.T) {
74-
assert.Equalf(t, []byte("-----BEGIN APP RELEASE-----"), beginReleaseDelimiterBytes(), "beginReleaseDelimiterBytes()")
88+
assert.Equalf(t, []byte("-----BEGIN APP RELEASE-----"), delimiterBytes(beginReleaseDelimiter), "beginReleaseDelimiterBytes()")
7589
}
7690

7791
func Test_endReleaseDelimiterBytes(t *testing.T) {
78-
assert.Equalf(t, []byte("-----END APP RELEASE-----"), endReleaseDelimiterBytes(), "beginReleaseDelimiterBytes()")
92+
assert.Equalf(t, []byte("-----END APP RELEASE-----"), delimiterBytes(endReleaseDelimiter), "beginReleaseDelimiterBytes()")
7993
}

0 commit comments

Comments
 (0)