Skip to content

Commit

Permalink
S3 API: validate obj names; multipart pathnames
Browse files Browse the repository at this point in the history
* s3: add obj names validation
* multipart put: create full pathname
  (safe since validated)

Signed-off-by: Alex Aizman <[email protected]>
  • Loading branch information
alex-aizman committed Jan 23, 2024
1 parent bb33642 commit a166158
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 3 deletions.
4 changes: 2 additions & 2 deletions ais/htrun.go
Original file line number Diff line number Diff line change
Expand Up @@ -1267,8 +1267,8 @@ func (h *htrun) writeErrActf(w http.ResponseWriter, r *http.Request, action stri

// also, validatePrefix
func (h *htrun) isValidObjname(w http.ResponseWriter, r *http.Request, name string) bool {
if cos.IsLastB(name, filepath.Separator) || strings.Contains(name, "../") {
h.writeErrf(w, r, "invalid object name %q", name)
if err := cmn.ValidateObjName(name); err != nil {
h.writeErr(w, r, err)
return false
}
return true
Expand Down
20 changes: 20 additions & 0 deletions ais/prxs3.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,10 @@ func (p *proxy) handleMptUpload(w http.ResponseWriter, r *http.Request, parts []
}
smap := p.owner.smap.get()
objName := s3.ObjName(parts)
if err := cmn.ValidateObjName(objName); err != nil {
s3.WriteErr(w, r, err, 0)
return
}
si, netPub, err := smap.HrwMultiHome(bck.MakeUname(objName))
if err != nil {
s3.WriteErr(w, r, err, 0)
Expand Down Expand Up @@ -478,6 +482,10 @@ func (p *proxy) directPutObjS3(w http.ResponseWriter, r *http.Request, items []s
return
}
objName := s3.ObjName(items)
if err := cmn.ValidateObjName(objName); err != nil {
s3.WriteErr(w, r, err, 0)
return
}
si, netPub, err = smap.HrwMultiHome(bck.MakeUname(objName))
if err != nil {
s3.WriteErr(w, r, err, 0)
Expand Down Expand Up @@ -517,6 +525,10 @@ func (p *proxy) getObjS3(w http.ResponseWriter, r *http.Request, items []string,
return
}
objName := s3.ObjName(items)
if err := cmn.ValidateObjName(objName); err != nil {
s3.WriteErr(w, r, err, 0)
return
}
si, netPub, err = smap.HrwMultiHome(bck.MakeUname(objName))
if err != nil {
s3.WriteErr(w, r, err, 0)
Expand Down Expand Up @@ -584,6 +596,10 @@ func (p *proxy) headObjS3(w http.ResponseWriter, r *http.Request, items []string
return
}
bucket, objName := items[0], s3.ObjName(items)
if err := cmn.ValidateObjName(objName); err != nil {
s3.WriteErr(w, r, err, 0)
return
}
bck, err, errCode := meta.InitByNameOnly(bucket, p.owner.bmd)
if err != nil {
s3.WriteErr(w, r, err, errCode)
Expand Down Expand Up @@ -627,6 +643,10 @@ func (p *proxy) delObjS3(w http.ResponseWriter, r *http.Request, items []string)
return
}
objName := s3.ObjName(items)
if err := cmn.ValidateObjName(objName); err != nil {
s3.WriteErr(w, r, err, 0)
return
}
si, err = smap.HrwName2T(bck.MakeUname(objName))
if err != nil {
s3.WriteErr(w, r, err, 0)
Expand Down
2 changes: 1 addition & 1 deletion ais/tgts3mpt.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (t *target) putMptPart(w http.ResponseWriter, r *http.Request, items []stri

prefix := fmt.Sprintf("%s.%d", uploadID, partNum) // workfile name format: <upload-id>.<part-number>.<obj-name>
wfqn := fs.CSM.Gen(lom, fs.WorkfileType, prefix)
fh, err := os.Create(wfqn)
fh, err := cos.CreateFile(wfqn)
if err != nil {
s3.WriteErr(w, r, err, 0)
return
Expand Down
19 changes: 19 additions & 0 deletions cmn/err.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,10 @@ type (
reason string
detail string
}

ErrInvalidObjName struct {
name string
}
)

var (
Expand Down Expand Up @@ -724,6 +728,21 @@ func IsErrXactUsePrev(err error) bool {
return ok
}

//
// ErrInvalidObjName
//

func ValidateObjName(name string) (err *ErrInvalidObjName) {
if cos.IsLastB(name, filepath.Separator) || strings.Contains(name, "../") {
err = &ErrInvalidObjName{name}
}
return err
}

func (e *ErrInvalidObjName) Error() string {
return fmt.Sprintf("invalid object name %q", e.name)
}

///////////////////////
// ErrXactTgtInMaint //
///////////////////////
Expand Down

0 comments on commit a166158

Please sign in to comment.