From d4c18e7ffdc496a38de67dde6e29b2f364afc472 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Wed, 15 Jun 2016 21:17:20 +1000 Subject: [PATCH] Integrate readPacket and writePacket into handlePacket (#120) --- server.go | 65 ++++++++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/server.go b/server.go index f25a4d1f..e097bda3 100644 --- a/server.go +++ b/server.go @@ -302,6 +302,30 @@ func handlePacket(s *Server, p interface{}) error { Path: p.Path, Pflags: ssh_FXF_READ, }.respond(s) + case *sshFxpReadPacket: + f, ok := s.getHandle(p.Handle) + if !ok { + return s.sendError(p, syscall.EBADF) + } + + data := make([]byte, clamp(p.Len, s.maxTxPacket)) + n, err := f.ReadAt(data, int64(p.Offset)) + if err != nil && (err != io.EOF || n == 0) { + return s.sendError(p, err) + } + return s.sendPacket(sshFxpDataPacket{ + ID: p.ID, + Length: uint32(n), + Data: data[:n], + }) + case *sshFxpWritePacket: + f, ok := s.getHandle(p.Handle) + if !ok { + return s.sendError(p, syscall.EBADF) + } + + _, err := f.WriteAt(p.Data, int64(p.Offset)) + return s.sendError(p, err) case serverRespondablePacket: err := p.respond(s) return errors.Wrap(err, "pkt.respond failed") @@ -415,40 +439,6 @@ func (p sshFxpOpenPacket) respond(svr *Server) error { return svr.sendPacket(sshFxpHandlePacket{p.ID, handle}) } -func (p sshFxpReadPacket) respond(svr *Server) error { - f, ok := svr.getHandle(p.Handle) - if !ok { - return svr.sendError(p, syscall.EBADF) - } - - if p.Len > svr.maxTxPacket { - p.Len = svr.maxTxPacket - } - ret := sshFxpDataPacket{ - ID: p.ID, - Length: p.Len, - Data: make([]byte, p.Len), - } - - n, err := f.ReadAt(ret.Data, int64(p.Offset)) - if err != nil && (err != io.EOF || n == 0) { - return svr.sendError(p, err) - } - - ret.Length = uint32(n) - return svr.sendPacket(ret) -} - -func (p sshFxpWritePacket) respond(svr *Server) error { - f, ok := svr.getHandle(p.Handle) - if !ok { - return svr.sendError(p, syscall.EBADF) - } - - _, err := f.WriteAt(p.Data, int64(p.Offset)) - return svr.sendError(p, err) -} - func (p sshFxpReaddirPacket) respond(svr *Server) error { f, ok := svr.getHandle(p.Handle) if !ok { @@ -608,3 +598,10 @@ func statusFromError(p id, err error) sshFxpStatusPacket { } return ret } + +func clamp(v, max uint32) uint32 { + if v > max { + return max + } + return v +}