forked from TrueCloudLab/rclone
copy: fix nil pointer dereference when corrupted on transfer with nil dst
This commit is contained in:
parent
c2d96113ac
commit
e053c8a1c0
2 changed files with 19 additions and 2 deletions
|
@ -76,6 +76,23 @@ func TestUpdatingCheck(t *testing.T) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test corrupted on transfer
|
||||||
|
// should error due to size/hash mismatch
|
||||||
|
func TestVerifyCopy(t *testing.T) {
|
||||||
|
r := fstest.NewRun(t)
|
||||||
|
filePath := "sub dir/local test"
|
||||||
|
r.WriteFile(filePath, "some content", time.Now())
|
||||||
|
src, err := r.Flocal.NewObject(context.Background(), filePath)
|
||||||
|
require.NoError(t, err)
|
||||||
|
src.(*Object).fs.opt.NoCheckUpdated = true
|
||||||
|
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
go r.WriteFile(src.Remote(), fmt.Sprintf("some new content %d", i), src.ModTime(context.Background()))
|
||||||
|
}
|
||||||
|
_, err = operations.Copy(context.Background(), r.Fremote, nil, filePath+"2", src)
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestSymlink(t *testing.T) {
|
func TestSymlink(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
r := fstest.NewRun(t)
|
r := fstest.NewRun(t)
|
||||||
|
|
|
@ -266,14 +266,14 @@ func (c *copy) manualCopy(ctx context.Context) (actionTaken string, newDst fs.Ob
|
||||||
func (c *copy) verify(ctx context.Context, newDst fs.Object) (err error) {
|
func (c *copy) verify(ctx context.Context, newDst fs.Object) (err error) {
|
||||||
// Verify sizes are the same after transfer
|
// Verify sizes are the same after transfer
|
||||||
if sizeDiffers(ctx, c.src, newDst) {
|
if sizeDiffers(ctx, c.src, newDst) {
|
||||||
return fmt.Errorf("corrupted on transfer: sizes differ src(%s) %d vs dst(%s) %d", c.src.Fs(), c.src.Size(), c.dst.Fs(), c.dst.Size())
|
return fmt.Errorf("corrupted on transfer: sizes differ src(%s) %d vs dst(%s) %d", c.src.Fs(), c.src.Size(), newDst.Fs(), newDst.Size())
|
||||||
}
|
}
|
||||||
// Verify hashes are the same after transfer - ignoring blank hashes
|
// Verify hashes are the same after transfer - ignoring blank hashes
|
||||||
if c.hashType != hash.None {
|
if c.hashType != hash.None {
|
||||||
// checkHashes has logs and counts errors
|
// checkHashes has logs and counts errors
|
||||||
equal, _, srcSum, dstSum, _ := checkHashes(ctx, c.src, newDst, c.hashType)
|
equal, _, srcSum, dstSum, _ := checkHashes(ctx, c.src, newDst, c.hashType)
|
||||||
if !equal {
|
if !equal {
|
||||||
return fmt.Errorf("corrupted on transfer: %v hashes differ src(%s) %q vs dst(%s) %q", c.hashType, c.src.Fs(), srcSum, c.dst.Fs(), dstSum)
|
return fmt.Errorf("corrupted on transfer: %v hashes differ src(%s) %q vs dst(%s) %q", c.hashType, c.src.Fs(), srcSum, newDst.Fs(), dstSum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in a new issue