• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// The bug happened like this:
6//  1. The main binary adds an itab for *json.UnsupportedValueError / error
7//     (concrete type / interface type).  This itab goes in hash bucket 0x111.
8//  2. The plugin adds that same itab again.  That makes a cycle in the itab
9//     chain rooted at hash bucket 0x111.
10//  3. The main binary then asks for the itab for *dynamodbstreamsevt.Event /
11//     json.Unmarshaler.  This itab happens to also live in bucket 0x111.
12//     The lookup code goes into an infinite loop searching for this itab.
13//
14// The code is carefully crafted so that the two itabs are both from the
15// same bucket, and so that the second itab doesn't exist in
16// the itab hashmap yet (so the entire linked list must be searched).
17package main
18
19import (
20	"encoding/json"
21	"plugin"
22	"testplugin/issue18676/dynamodbstreamsevt"
23)
24
25func main() {
26	plugin.Open("plugin.so")
27
28	var x interface{} = (*dynamodbstreamsevt.Event)(nil)
29	if _, ok := x.(json.Unmarshaler); !ok {
30		println("something")
31	}
32}
33