mirror of
https://github.com/rclone/rclone.git
synced 2024-12-22 23:22:08 +01:00
compress: fix crash due to nil metadata #6434
Before this fix, if an error ocurred reading the metadata, it could be set as nil and then used, causing a crash. This fix changes the readMetadata function so it returns an error, and the error is always set if the metadata returned is nil.
This commit is contained in:
parent
bc09105d2e
commit
fb6ddd680c
@ -367,9 +367,9 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
meta := readMetadata(ctx, mo)
|
meta, err := readMetadata(ctx, mo)
|
||||||
if meta == nil {
|
if err != nil {
|
||||||
return nil, errors.New("error decoding metadata")
|
return nil, fmt.Errorf("error decoding metadata: %w", err)
|
||||||
}
|
}
|
||||||
// Create our Object
|
// Create our Object
|
||||||
o, err := f.Fs.NewObject(ctx, makeDataName(remote, meta.CompressionMetadata.Size, meta.Mode))
|
o, err := f.Fs.NewObject(ctx, makeDataName(remote, meta.CompressionMetadata.Size, meta.Mode))
|
||||||
@ -1040,24 +1040,19 @@ func newMetadata(size int64, mode int, cmeta sgzip.GzipMetadata, md5 string, mim
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This function will read the metadata from a metadata object.
|
// This function will read the metadata from a metadata object.
|
||||||
func readMetadata(ctx context.Context, mo fs.Object) (meta *ObjectMetadata) {
|
func readMetadata(ctx context.Context, mo fs.Object) (meta *ObjectMetadata, err error) {
|
||||||
// Open our meradata object
|
// Open our meradata object
|
||||||
rc, err := mo.Open(ctx)
|
rc, err := mo.Open(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil, err
|
||||||
}
|
}
|
||||||
defer func() {
|
defer fs.CheckClose(rc, &err)
|
||||||
err := rc.Close()
|
|
||||||
if err != nil {
|
|
||||||
fs.Errorf(mo, "Error closing object: %v", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
jr := json.NewDecoder(rc)
|
jr := json.NewDecoder(rc)
|
||||||
meta = new(ObjectMetadata)
|
meta = new(ObjectMetadata)
|
||||||
if err = jr.Decode(meta); err != nil {
|
if err = jr.Decode(meta); err != nil {
|
||||||
return nil
|
return nil, err
|
||||||
}
|
}
|
||||||
return meta
|
return meta, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes this object
|
// Remove removes this object
|
||||||
@ -1167,7 +1162,7 @@ func (o *Object) loadMetadataIfNotLoaded(ctx context.Context) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if o.meta == nil {
|
if o.meta == nil {
|
||||||
o.meta = readMetadata(ctx, o.mo)
|
o.meta, err = readMetadata(ctx, o.mo)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user