Update copy.go
This commit is contained in:
+11
-4
@@ -231,11 +231,18 @@ func streamOne(src, dst *imapclient.Client, dstFolder string, uid imap.UID, flag
|
|||||||
}
|
}
|
||||||
|
|
||||||
appendCmd := dst.Append(dstFolder, int64(len(body)), &imap.AppendOptions{Flags: keepFlags(flags), Time: internalDate})
|
appendCmd := dst.Append(dstFolder, int64(len(body)), &imap.AppendOptions{Flags: keepFlags(flags), Time: internalDate})
|
||||||
if _, err := io.Copy(appendCmd, bytes.NewReader(body)); err != nil {
|
// Append acquires go-imap's per-client encoder mutex and holds it until
|
||||||
return err
|
// Close() calls enc.end(). Close() MUST run on every path: if io.Copy
|
||||||
|
// fails mid-write (server stall, idle timeout), returning without Close()
|
||||||
|
// leaks the mutex and the NEXT Append on this client deadlocks forever on
|
||||||
|
// beginCommand. Close() is idempotent and always releases the lock.
|
||||||
|
_, copyErr := io.Copy(appendCmd, bytes.NewReader(body))
|
||||||
|
closeErr := appendCmd.Close()
|
||||||
|
if copyErr != nil {
|
||||||
|
return fmt.Errorf("append body uid %v: %w", uid, copyErr)
|
||||||
}
|
}
|
||||||
if err := appendCmd.Close(); err != nil {
|
if closeErr != nil {
|
||||||
return err
|
return closeErr
|
||||||
}
|
}
|
||||||
_, err := appendCmd.Wait()
|
_, err := appendCmd.Wait()
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user