Skip to content

Commit 844485e

Browse files
prestonvanloonkaralabeholiman
authored
consensus/ethash: fix usage of *reflect.SliceHeader (#21372)
* consensus/ethash: only use *reflect.SliceHeader, not reflect.SliceHeader. See comment here: https://github.com/golang/go/issues/40397\#issuecomment-663748689 * consensus/ethash: pr feedback from @mdempsky, makes a copy of dest such that is not mutated * consensus/ethash: remove noop assign * consensus/ethash: apply same fix to another location Co-authored-by: Péter Szilágyi <[email protected]> Co-authored-by: Martin Holst Swende <[email protected]>
1 parent 1ea7537 commit 844485e

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

consensus/ethash/algorithm.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,12 @@ func generateCache(dest []uint32, epoch uint64, seed []byte) {
151151
logFn("Generated ethash verification cache", "elapsed", common.PrettyDuration(elapsed))
152152
}()
153153
// Convert our destination slice to a byte buffer
154-
header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest))
155-
header.Len *= 4
156-
header.Cap *= 4
157-
cache := *(*[]byte)(unsafe.Pointer(&header))
154+
var cache []byte
155+
cacheHdr := (*reflect.SliceHeader)(unsafe.Pointer(&cache))
156+
dstHdr := (*reflect.SliceHeader)(unsafe.Pointer(&dest))
157+
cacheHdr.Data = dstHdr.Data
158+
cacheHdr.Len = dstHdr.Len * 4
159+
cacheHdr.Cap = dstHdr.Cap * 4
158160

159161
// Calculate the number of theoretical rows (we'll store in one buffer nonetheless)
160162
size := uint64(len(cache))
@@ -283,10 +285,12 @@ func generateDataset(dest []uint32, epoch uint64, cache []uint32) {
283285
swapped := !isLittleEndian()
284286

285287
// Convert our destination slice to a byte buffer
286-
header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest))
287-
header.Len *= 4
288-
header.Cap *= 4
289-
dataset := *(*[]byte)(unsafe.Pointer(&header))
288+
var dataset []byte
289+
datasetHdr := (*reflect.SliceHeader)(unsafe.Pointer(&dataset))
290+
destHdr := (*reflect.SliceHeader)(unsafe.Pointer(&dest))
291+
datasetHdr.Data = destHdr.Data
292+
datasetHdr.Len = destHdr.Len * 4
293+
datasetHdr.Cap = destHdr.Cap * 4
290294

291295
// Generate the dataset on many goroutines since it takes a while
292296
threads := runtime.NumCPU()

0 commit comments

Comments
 (0)