@@ -27,12 +27,12 @@ import (
2727
2828 "github.com/spf13/pflag"
2929
30- "vitess.io/vitess/go/os2"
31- "vitess.io/vitess/go/vt/mysqlctl/errors"
32-
30+ "vitess.io/vitess/go/fileutil"
3331 "vitess.io/vitess/go/ioutil"
32+ "vitess.io/vitess/go/os2"
3433 stats "vitess.io/vitess/go/vt/mysqlctl/backupstats"
3534 "vitess.io/vitess/go/vt/mysqlctl/backupstorage"
35+ "vitess.io/vitess/go/vt/mysqlctl/errors"
3636 "vitess.io/vitess/go/vt/servenv"
3737 "vitess.io/vitess/go/vt/utils"
3838)
@@ -127,7 +127,10 @@ func (fbh *FileBackupHandle) ReadFile(ctx context.Context, filename string) (io.
127127 if ! fbh .readOnly {
128128 return nil , fmt .Errorf ("ReadFile cannot be called on read-write backup" )
129129 }
130- p := path .Join (FileBackupStorageRoot , fbh .dir , fbh .name , filename )
130+ p , err := fileutil .SafePathJoin (FileBackupStorageRoot , fbh .dir , fbh .name , filename )
131+ if err != nil {
132+ return nil , err
133+ }
131134 f , err := os .Open (p )
132135 if err != nil {
133136 return nil , err
@@ -147,9 +150,13 @@ func newFileBackupStorage(params backupstorage.Params) *FileBackupStorage {
147150
148151// ListBackups is part of the BackupStorage interface
149152func (fbs * FileBackupStorage ) ListBackups (ctx context.Context , dir string ) ([]backupstorage.BackupHandle , error ) {
150- // ReadDir already sorts the results
151- p := path .Join (FileBackupStorageRoot , dir )
152- fi , err := os .ReadDir (p )
153+ // Check dir is not a directory traversal.
154+ path , err := fileutil .SafePathJoin (FileBackupStorageRoot , dir )
155+ if err != nil {
156+ return nil , fmt .Errorf ("failed to parse backup path %q: %w" , path , err )
157+ }
158+
159+ fi , err := os .ReadDir (path )
153160 if err != nil {
154161 if os .IsNotExist (err ) {
155162 return nil , nil
@@ -173,14 +180,17 @@ func (fbs *FileBackupStorage) ListBackups(ctx context.Context, dir string) ([]ba
173180// StartBackup is part of the BackupStorage interface
174181func (fbs * FileBackupStorage ) StartBackup (ctx context.Context , dir , name string ) (backupstorage.BackupHandle , error ) {
175182 // Make sure the directory exists.
176- p := path .Join (FileBackupStorageRoot , dir )
177- if err := os2 .MkdirAll (p ); err != nil {
183+ p , err := fileutil .SafePathJoin (FileBackupStorageRoot , dir )
184+ if err != nil {
185+ return nil , err
186+ }
187+ if err = os2 .MkdirAll (p ); err != nil {
178188 return nil , err
179189 }
180190
181191 // Create the subdirectory for this named backup.
182192 p = path .Join (p , name )
183- if err : = os2 .Mkdir (p ); err != nil {
193+ if err = os2 .Mkdir (p ); err != nil {
184194 return nil , err
185195 }
186196
@@ -189,7 +199,10 @@ func (fbs *FileBackupStorage) StartBackup(ctx context.Context, dir, name string)
189199
190200// RemoveBackup is part of the BackupStorage interface
191201func (fbs * FileBackupStorage ) RemoveBackup (ctx context.Context , dir , name string ) error {
192- p := path .Join (FileBackupStorageRoot , dir , name )
202+ p , err := fileutil .SafePathJoin (FileBackupStorageRoot , dir , name )
203+ if err != nil {
204+ return err
205+ }
193206 return os .RemoveAll (p )
194207}
195208
0 commit comments