From 99358cee88e9a0db7f76c0d69bcfeeebfca4fae9 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 6 Jun 2025 15:33:42 +0100 Subject: [PATCH] onedrive: fix crash if no metadata was updated Before this change, rclone would crash if no metadata was updated. This could happen if the --onedrive-metadata-permissions read was supplied but metadata to write was supplied. Fixes #8586 --- backend/onedrive/metadata.go | 4 ++++ backend/onedrive/onedrive.go | 13 ++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/backend/onedrive/metadata.go b/backend/onedrive/metadata.go index f62c07028..63f9e7571 100644 --- a/backend/onedrive/metadata.go +++ b/backend/onedrive/metadata.go @@ -749,6 +749,8 @@ func (o *Object) fetchMetadataForCreate(ctx context.Context, src fs.ObjectInfo, // Fetch metadata and update updateInfo if --metadata is in use // modtime will still be set when there is no metadata to set +// +// May return info=nil and err=nil if there was no metadata to update. func (f *Fs) fetchAndUpdateMetadata(ctx context.Context, src fs.ObjectInfo, options []fs.OpenOption, updateInfo *Object) (info *api.Item, err error) { meta, err := fs.GetMetadataOptions(ctx, f, src, options) if err != nil { @@ -768,6 +770,8 @@ func (f *Fs) fetchAndUpdateMetadata(ctx context.Context, src fs.ObjectInfo, opti } // updateMetadata calls Get, Set, and Write +// +// May return info=nil and err=nil if there was no metadata to update. func (o *Object) updateMetadata(ctx context.Context, meta fs.Metadata) (info *api.Item, err error) { _, err = o.meta.Get(ctx) // refresh permissions if err != nil { diff --git a/backend/onedrive/onedrive.go b/backend/onedrive/onedrive.go index e425f29b6..ffca73dbe 100644 --- a/backend/onedrive/onedrive.go +++ b/backend/onedrive/onedrive.go @@ -1782,7 +1782,9 @@ func (f *Fs) Copy(ctx context.Context, src fs.Object, remote string) (dst fs.Obj if err != nil { return nil, err } - err = dstObj.setMetaData(info) + if info != nil { + err = dstObj.setMetaData(info) + } return dstObj, err } @@ -1862,7 +1864,9 @@ func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, if err != nil { return nil, err } - err = dstObj.setMetaData(info) + if info != nil { + err = dstObj.setMetaData(info) + } return dstObj, err } @@ -2629,7 +2633,10 @@ func (o *Object) uploadSinglepart(ctx context.Context, in io.Reader, src fs.Obje if err != nil { return nil, fmt.Errorf("failed to fetch and update metadata: %w", err) } - return info, o.setMetaData(info) + if info != nil { + err = o.setMetaData(info) + } + return info, err } // Update the object with the contents of the io.Reader, modTime and size