Skip to content

Commit bbb1a80

Browse files
authored
Fix data race of Scp (#56)
1 parent ee85dc9 commit bbb1a80

File tree

1 file changed

+31
-11
lines changed

1 file changed

+31
-11
lines changed

easyssh.go

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -335,23 +335,43 @@ func (ssh_conf *MakeConfig) Scp(sourceFile string, etargetFile string) error {
335335
return statErr
336336
}
337337

338-
go func() {
339-
w, err := session.StdinPipe()
338+
w, err := session.StdinPipe()
339+
if err != nil {
340+
return err
341+
}
340342

343+
copyF := func() error {
344+
_, err := fmt.Fprintln(w, "C0644", srcStat.Size(), targetFile)
341345
if err != nil {
342-
return
346+
return err
343347
}
344-
defer w.Close()
345-
346-
fmt.Fprintln(w, "C0644", srcStat.Size(), targetFile)
347348

348349
if srcStat.Size() > 0 {
349-
io.Copy(w, src)
350-
fmt.Fprint(w, "\x00")
351-
} else {
352-
fmt.Fprint(w, "\x00")
350+
_, err = io.Copy(w, src)
351+
if err != nil {
352+
return err
353+
}
354+
}
355+
356+
_, err = fmt.Fprint(w, "\x00")
357+
if err != nil {
358+
return err
353359
}
360+
361+
return nil
362+
}
363+
364+
copyErrC := make(chan error, 1)
365+
go func() {
366+
defer w.Close()
367+
copyErrC <- copyF()
354368
}()
355369

356-
return session.Run(fmt.Sprintf("scp -tr %s", etargetFile))
370+
err = session.Run(fmt.Sprintf("scp -tr %s", etargetFile))
371+
if err != nil {
372+
return err
373+
}
374+
375+
err = <-copyErrC
376+
return err
357377
}

0 commit comments

Comments
 (0)