mirror of
https://github.com/golang/go
synced 2024-11-14 09:00:21 -07:00
eb2d1cdd1b
Updates #30228 Updates #28387 Change-Id: Iad7d960b70221f90ccc2372bb1d4d41cec3926e4 Reviewed-on: https://go-review.googlesource.com/c/163214 Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
32 lines
1.1 KiB
Go
32 lines
1.1 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// The bug happened like this:
|
|
// 1) The main binary adds an itab for *json.UnsupportedValueError / error
|
|
// (concrete type / interface type). This itab goes in hash bucket 0x111.
|
|
// 2) The plugin adds that same itab again. That makes a cycle in the itab
|
|
// chain rooted at hash bucket 0x111.
|
|
// 3) The main binary then asks for the itab for *dynamodbstreamsevt.Event /
|
|
// json.Unmarshaler. This itab happens to also live in bucket 0x111.
|
|
// The lookup code goes into an infinite loop searching for this itab.
|
|
// The code is carefully crafted so that the two itabs are both from the
|
|
// same bucket, and so that the second itab doesn't exist in
|
|
// the itab hashmap yet (so the entire linked list must be searched).
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"plugin"
|
|
"testplugin/issue18676/dynamodbstreamsevt"
|
|
)
|
|
|
|
func main() {
|
|
plugin.Open("plugin.so")
|
|
|
|
var x interface{} = (*dynamodbstreamsevt.Event)(nil)
|
|
if _, ok := x.(json.Unmarshaler); !ok {
|
|
println("something")
|
|
}
|
|
}
|