sshd write failed

Rasmus Kaj kaj at kth.se
Sun Jan 29 13:35:46 CET 2012


lör 2012-01-28 klockan 19:53 +0100 skrev Rasmus Kaj:
> Jag har råkat ut för ett märkligt problem med sshd på FreeBSD 8.2.  När
> jag för över större filer säger avbryts kopplingen plötsligt mitt i.
> 

Efter att ha provat att köra servern i debugläge var ju nästa naturliga
steg att köra ktrace på sshd.  Mycket riktigt är det ett write-anrop som
får permission denied.   Vad jag begriper så är det som ska skrivas helt
enkelt data till socketen.

En sak som kan vara intressant är att write har misslyckats några gånger
innan dess, med errno 35 Resource temporarily unavailable.

Här kommer anrop och returer från write från en lämplig del av ktracen:

  4609 sshd     CALL  write(0x3,0x801e65000,0x60)
  4609 sshd     RET   write 96/0x60
  4609 sshd     CALL  write(0x3,0x801e65000,0x40)
  4609 sshd     RET   write 64/0x40
  4609 sshd     CALL  write(0x8,0x801e72000,0x1)
  4609 sshd     RET   write 1
  4610 scp      CALL  write(0x1,0x80184a000,0x20000)
  4610 scp      RET   write 65536/0x10000
  4610 scp      CALL  write(0x1,0x80185a000,0x10000)
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4610 scp      CALL  write(0x1,0x80185a000,0x10000)
  4610 scp      RET   write 16384/0x4000
  4610 scp      CALL  write(0x1,0x80185e000,0xc000)
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4610 scp      CALL  write(0x1,0x80185e000,0xc000)
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4610 scp      RET   write 16384/0x4000
  4610 scp      CALL  write(0x1,0x801862000,0x8000)
  4609 sshd     RET   write 16432/0x4030
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4610 scp      CALL  write(0x1,0x801862000,0x8000)
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4610 scp      RET   write 16384/0x4000
  4609 sshd     RET   write 16432/0x4030
  4610 scp      CALL  write(0x1,0x801866000,0x4000)
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4610 scp      CALL  write(0x1,0x801866000,0x4000)
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4610 scp      RET   write 16384/0x4000
  4609 sshd     RET   write 6232/0x1858
  4610 scp      CALL  write(0x1,0x80184a000,0x20000)
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4610 scp      CALL  write(0x1,0x80184a000,0x20000)
  4609 sshd     CALL  write(0x3,0x801e85858,0x6808)
  4610 scp      RET   write 16384/0x4000
  4610 scp      CALL  write(0x1,0x80184e000,0x1c000)
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4609 sshd     RET   write 26632/0x6808
  4610 scp      CALL  write(0x1,0x80184e000,0x1c000)
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4609 sshd     RET   write -1 errno 13 Permission denied
  4610 scp      RET   write 16384/0x4000
  4610 scp      CALL  write(0x1,0x801852000,0x18000)
  4610 scp      RET   write -1 errno 35 Resource temporarily unavailable
  4610 scp      CALL  write(0x1,0x801852000,0x18000)
  4610 scp      RET   write -1 errno 32 Broken pipe

Om jag har fattat rätt hur det hänger ihop så skriver "scp" det data som
ska föras över på sin stdout (0x1), vilket läses av "sshd" som krypterar
datat och skriver det på nätsocketen (0x3).  De gånger scp får Resource
temporarily unavailable är det sshd som inte har hunnit få iväg det den
fick förra gången än.  Tittar man bara på write från sshd ser man:

  4609 sshd     RET   write 64/0x40
  4609 sshd     CALL  write(0x8,0x801e72000,0x1)
  4609 sshd     RET   write 1
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4609 sshd     RET   write 16432/0x4030
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4609 sshd     RET   write 16432/0x4030
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4609 sshd     RET   write 6232/0x1858
  4609 sshd     CALL  write(0x3,0x801e85858,0x6808)
  4609 sshd     RET   write 26632/0x6808
  4609 sshd     CALL  write(0x3,0x801e84000,0x4030)
  4609 sshd     RET   write -1 errno 13 Permission denied

Den skriver ett par block om 0x4030 om går bra, sen skriver den ett till
och får inte iväg hela.  Sen skriver den det som blev över av det
blocket tillsammans med nästa block (0x6808) och det går bra.  Sen
skriver den ett block till och får plötsligt permission denied.  Varför
det?  Fortfarande ingen aning ...

// Rasmus




More information about the BUS mailing list