以下のように無限に2バイトを返し続けるio.Readerを実装して、そこから奇数バイト(例では5バイト)をio.CopyNでコピーしようとするとpanicを起こしました。偶数バイトをコピーする場合には起きません。なぜでしょうか?

package main

import (
    "io"
    "os"
)

type stream int

func (s *stream) Read(p []byte) (n int, err error) {
    p[0] = byte('a')
    p[1] = byte('b')
    return 2, nil
}

func main() {
    io.CopyN(os.Stdout, new(stream), 5)
    // panic: runtime error: index out of range
}

環境:go version go1.10.3 windows/386