|  | // run | 
|  |  | 
|  | // Copyright 2010 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. | 
|  |  | 
|  | // Issue 1011.  Removing either #1 or #3 avoided the crash at #2. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "io" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | func readU16BE(b []byte) uint16 { | 
|  | b[0] = 0 | 
|  | b[1] = 1 | 
|  | return uint16(b[0])<<8 + uint16(b[1]) // #1 | 
|  | n := uint16(b[0])<<8 + uint16(b[1]) | 
|  | return n | 
|  | } | 
|  |  | 
|  | func readStr(r io.Reader, b []byte) string { | 
|  | n := readU16BE(b) | 
|  | if int(n) > len(b) { | 
|  | return "err: n>b" | 
|  | } | 
|  | io.ReadFull(r, b[0:n]) // #2 | 
|  | return string(b[0:n])  // #3 | 
|  | return "ok" | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | br := strings.NewReader("abcd") | 
|  | readStr(br, make([]byte, 256)) | 
|  | } |