| // 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") |
| } |
| } |