@@ -360,3 +360,57 @@ func TestAcceptIgnoreAbortedConnRequest(t *testing.T) {
360
360
t .Error (err )
361
361
}
362
362
}
363
+
364
+ func TestZeroByteRead (t * testing.T ) {
365
+ for _ , network := range []string {"tcp" , "unix" , "unixpacket" } {
366
+ if ! testableNetwork (network ) {
367
+ t .Logf ("skipping %s test" , network )
368
+ continue
369
+ }
370
+
371
+ ln , err := newLocalListener (network )
372
+ if err != nil {
373
+ t .Fatal (err )
374
+ }
375
+ connc := make (chan Conn , 1 )
376
+ go func () {
377
+ defer ln .Close ()
378
+ c , err := ln .Accept ()
379
+ if err != nil {
380
+ t .Error (err )
381
+ }
382
+ connc <- c // might be nil
383
+ }()
384
+ c , err := Dial (network , ln .Addr ().String ())
385
+ if err != nil {
386
+ t .Fatal (err )
387
+ }
388
+ defer c .Close ()
389
+ sc := <- connc
390
+ if sc == nil {
391
+ continue
392
+ }
393
+ defer sc .Close ()
394
+
395
+ if runtime .GOOS == "windows" {
396
+ // A zero byte read on Windows caused a wait for readability first.
397
+ // Rather than change that behavior, satisfy it in this test.
398
+ // See Issue 15735.
399
+ go io .WriteString (sc , "a" )
400
+ }
401
+
402
+ n , err := c .Read (nil )
403
+ if n != 0 || err != nil {
404
+ t .Errorf ("%s: zero byte client read = %v, %v; want 0, nil" , network , n , err )
405
+ }
406
+
407
+ if runtime .GOOS == "windows" {
408
+ // Same as comment above.
409
+ go io .WriteString (c , "a" )
410
+ }
411
+ n , err = sc .Read (nil )
412
+ if n != 0 || err != nil {
413
+ t .Errorf ("%s: zero byte server read = %v, %v; want 0, nil" , network , n , err )
414
+ }
415
+ }
416
+ }
0 commit comments