Home | History | Annotate | Download | only in issue18676
      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 // The code is carefully crafted so that the two itabs are both from the
     14 // same bucket, and so that the second itab doesn't exist in
     15 // the itab hashmap yet (so the entire linked list must be searched).
     16 package main
     17 
     18 import (
     19 	"encoding/json"
     20 	"issue18676/dynamodbstreamsevt"
     21 	"plugin"
     22 )
     23 
     24 func main() {
     25 	plugin.Open("plugin.so")
     26 
     27 	var x interface{} = (*dynamodbstreamsevt.Event)(nil)
     28 	if _, ok := x.(json.Unmarshaler); !ok {
     29 		println("something")
     30 	}
     31 }
     32