@@ -344,7 +344,12 @@ func Hijack[REQ sshfx.Packet](srv *Server, fn func(context.Context, REQ) error)
344344// This is really only useful for supporting newer versions of the SFTP standard.
345345func HijackWithResponse [REQ , RESP sshfx.Packet ](srv * Server , fn func (context.Context , REQ ) (RESP , error )) error {
346346 wrap := wrapHandler (func (ctx context.Context , req sshfx.Packet ) (sshfx.Packet , error ) {
347- return fn (ctx , req .(REQ ))
347+ resp , err := fn (ctx , req .(REQ ))
348+ if err != nil {
349+ // We have to convert maybe typed-zero to untyped-nil.
350+ return nil , err
351+ }
352+ return resp , nil
348353 })
349354
350355 var pkt REQ
@@ -515,6 +520,7 @@ func (srv *Server) handle(req sshfx.Packet, hint []byte, maxDataLen uint32) (ssh
515520
516521 if len (srv .hijacks ) > 0 {
517522 if fn := srv .hijacks [req .Type ()]; fn != nil {
523+ // Hijack takes care of wrapping the getter into an untyped-nil on error.
518524 return get (srv , req , fn )
519525 }
520526 }
@@ -595,7 +601,13 @@ func (srv *Server) handle(req sshfx.Packet, hint []byte, maxDataLen uint32) (ssh
595601
596602 case * openssh.StatVFSExtendedPacket :
597603 if statvfser , ok := srv .Handler .(StatVFSServerHandler ); ok {
598- return get (srv , req , statvfser .StatVFS )
604+ resp , err := get (srv , req , statvfser .StatVFS )
605+ if err != nil {
606+ // We have to convert typed-nil to untyped-nil.
607+ return nil , err
608+ }
609+
610+ return resp , nil
599611 }
600612
601613 case interface { GetHandle () string }:
@@ -618,7 +630,13 @@ func (srv *Server) handle(req sshfx.Packet, hint []byte, maxDataLen uint32) (ssh
618630 Path : file .Name (),
619631 }
620632
621- return get (srv , req , statvfser .StatVFS )
633+ resp , err := get (srv , req , statvfser .StatVFS )
634+ if err != nil {
635+ // We have to convert typed-nil to untyped-nil.
636+ return nil , err
637+ }
638+
639+ return resp , nil
622640 }
623641 }
624642 }
@@ -701,7 +719,7 @@ func (srv *Server) handle(req sshfx.Packet, hint []byte, maxDataLen uint32) (ssh
701719 }
702720
703721 hint = slices .Grow (hint [:0 ], int (req .Length ))[:req .Length ]
704-
722+
705723 n , err := file .ReadAt (hint , int64 (req .Offset ))
706724 if err != nil {
707725 // We cannot return results AND a status like SSH_FX_EOF,
0 commit comments