forked from TrueCloudLab/restic
sftp: improve handling of too short files
This commit is contained in:
parent
7ed560a201
commit
c6d74458ee
1 changed files with 18 additions and 0 deletions
|
@ -43,6 +43,8 @@ type SFTP struct {
|
||||||
|
|
||||||
var _ backend.Backend = &SFTP{}
|
var _ backend.Backend = &SFTP{}
|
||||||
|
|
||||||
|
var errTooShort = fmt.Errorf("file is too short")
|
||||||
|
|
||||||
func NewFactory() location.Factory {
|
func NewFactory() location.Factory {
|
||||||
return location.NewLimitedBackendFactory("sftp", ParseConfig, location.NoPassword, limiter.WrapBackendConstructor(Create), limiter.WrapBackendConstructor(Open))
|
return location.NewLimitedBackendFactory("sftp", ParseConfig, location.NoPassword, limiter.WrapBackendConstructor(Create), limiter.WrapBackendConstructor(Open))
|
||||||
}
|
}
|
||||||
|
@ -212,6 +214,10 @@ func (r *SFTP) IsNotExist(err error) bool {
|
||||||
return errors.Is(err, os.ErrNotExist)
|
return errors.Is(err, os.ErrNotExist)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *SFTP) IsPermanentError(err error) bool {
|
||||||
|
return r.IsNotExist(err) || errors.Is(err, errTooShort) || errors.Is(err, os.ErrPermission)
|
||||||
|
}
|
||||||
|
|
||||||
func buildSSHCommand(cfg Config) (cmd string, args []string, err error) {
|
func buildSSHCommand(cfg Config) (cmd string, args []string, err error) {
|
||||||
if cfg.Command != "" {
|
if cfg.Command != "" {
|
||||||
args, err := backend.SplitShellStrings(cfg.Command)
|
args, err := backend.SplitShellStrings(cfg.Command)
|
||||||
|
@ -428,6 +434,18 @@ func (r *SFTP) openReader(_ context.Context, h backend.Handle, length int, offse
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fi, err := f.Stat()
|
||||||
|
if err != nil {
|
||||||
|
_ = f.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
size := fi.Size()
|
||||||
|
if size < offset+int64(length) {
|
||||||
|
_ = f.Close()
|
||||||
|
return nil, errTooShort
|
||||||
|
}
|
||||||
|
|
||||||
if offset > 0 {
|
if offset > 0 {
|
||||||
_, err = f.Seek(offset, 0)
|
_, err = f.Seek(offset, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in a new issue