aboutsummaryrefslogtreecommitdiff
path: root/hotline/server.go
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2022-06-08 20:41:57 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2022-06-08 20:41:57 -0700
commitba29c43bb23de83c7715271e0830cb9f00e9e1c1 (patch)
tree40adf0940e4a7f2d1c1a4a55e159e21a4e07f951 /hotline/server.go
parentb196a50a44a5c72fc43df39fce4407d05ec8863b (diff)
Fix folder upload hang with resource forks
Diffstat (limited to 'hotline/server.go')
-rw-r--r--hotline/server.go23
1 files changed, 17 insertions, 6 deletions
diff --git a/hotline/server.go b/hotline/server.go
index 33888e0..1a6d163 100644
--- a/hotline/server.go
+++ b/hotline/server.go
@@ -978,15 +978,26 @@ func (s *Server) handleFileTransfer(conn io.ReadWriteCloser) error {
}
fileSize := make([]byte, 4)
- readBuffer := make([]byte, 1024)
for i := 0; i < fileTransfer.ItemCount(); i++ {
- // TODO: fix potential short read with io.ReadFull
- _, err := conn.Read(readBuffer)
- if err != nil {
+ s.Stats.UploadCounter += 1
+
+ var fu folderUpload
+ if _, err := io.ReadFull(conn, fu.DataSize[:]); err != nil {
+ return err
+ }
+
+ if _, err := io.ReadFull(conn, fu.IsFolder[:]); err != nil {
+ return err
+ }
+ if _, err := io.ReadFull(conn, fu.PathItemCount[:]); err != nil {
+ return err
+ }
+ fu.FileNamePath = make([]byte, binary.BigEndian.Uint16(fu.DataSize[:])-4)
+
+ if _, err := io.ReadFull(conn, fu.FileNamePath); err != nil {
return err
}
- fu := readFolderUpload(readBuffer)
s.Logger.Infow(
"Folder upload continued",
@@ -1073,7 +1084,7 @@ func (s *Server) handleFileTransfer(conn io.ReadWriteCloser) error {
}
case dlFldrActionSendFile:
- if _, err := conn.Read(fileSize); err != nil {
+ if _, err := io.ReadFull(conn, fileSize); err != nil {
return err
}