Skip to content

Commit 08adc22

Browse files
authored
Merge pull request #29 from xiekeyang/desc-val
descriptor validation
2 parents ec6ed80 + a05db7a commit 08adc22

File tree

4 files changed

+99
-26
lines changed

4 files changed

+99
-26
lines changed

image/descriptor.go

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -105,28 +105,14 @@ func (d *descriptor) validate(w walker, mts []string) error {
105105
if !found {
106106
return fmt.Errorf("invalid descriptor MediaType %q", d.MediaType)
107107
}
108-
switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
109-
if info.IsDir() {
110-
return nil
111-
}
112-
113-
filename, err := filepath.Rel(filepath.Join("blobs", d.algo()), filepath.Clean(path))
114-
if err != nil || d.hash() != filename {
115-
return nil
116-
}
117108

118-
if err := d.validateContent(r); err != nil {
119-
return err
120-
}
121-
return errEOW
122-
}); err {
123-
case nil:
124-
return fmt.Errorf("%s: not found", d.Digest)
125-
case errEOW:
126-
return nil
127-
default:
128-
return errors.Wrapf(err, "%s: validation failed", d.Digest)
109+
rc, err := w.Get(*d)
110+
if err != nil {
111+
return err
129112
}
113+
defer rc.Close()
114+
115+
return d.validateContent(rc)
130116
}
131117

132118
func (d *descriptor) validateContent(r io.Reader) error {

image/image.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func Validate(tarFile string, refs []string, out *log.Logger) error {
4040
}
4141
defer f.Close()
4242

43-
return validate(newTarWalker(f), refs, out)
43+
return validate(newTarWalker(tarFile, f), refs, out)
4444
}
4545

4646
var validRefMediaTypes = []string{
@@ -111,7 +111,7 @@ func Unpack(tarFile, dest, ref string) error {
111111
}
112112
defer f.Close()
113113

114-
return unpack(newTarWalker(f), dest, ref)
114+
return unpack(newTarWalker(tarFile, f), dest, ref)
115115
}
116116

117117
func unpack(w walker, dest, refName string) error {
@@ -153,7 +153,7 @@ func CreateRuntimeBundle(tarFile, dest, ref, root string) error {
153153
}
154154
defer f.Close()
155155

156-
return createRuntimeBundle(newTarWalker(f), dest, ref, root)
156+
return createRuntimeBundle(newTarWalker(tarFile, f), dest, ref, root)
157157
}
158158

159159
func createRuntimeBundle(w walker, dest, refName, rootfs string) error {

image/reader.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright 2016 The Linux Foundation
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package image
16+
17+
import (
18+
"archive/tar"
19+
"bytes"
20+
"fmt"
21+
"io"
22+
"io/ioutil"
23+
"os"
24+
"path/filepath"
25+
)
26+
27+
type reader interface {
28+
Get(desc descriptor) (io.ReadCloser, error)
29+
}
30+
31+
type tarReader struct {
32+
name string
33+
}
34+
35+
func (r *tarReader) Get(desc descriptor) (io.ReadCloser, error) {
36+
f, err := os.Open(r.name)
37+
if err != nil {
38+
return nil, err
39+
}
40+
defer f.Close()
41+
42+
tr := tar.NewReader(f)
43+
loop:
44+
for {
45+
hdr, err := tr.Next()
46+
switch err {
47+
case io.EOF:
48+
break loop
49+
case nil:
50+
// success, continue below
51+
default:
52+
return nil, err
53+
}
54+
if hdr.Name == filepath.Join("blobs", desc.algo(), desc.hash()) &&
55+
!hdr.FileInfo().IsDir() {
56+
buf, err := ioutil.ReadAll(tr)
57+
if err != nil {
58+
return nil, err
59+
}
60+
return ioutil.NopCloser(bytes.NewReader(buf)), nil
61+
}
62+
}
63+
64+
return nil, fmt.Errorf("object not found")
65+
}
66+
67+
type layoutReader struct {
68+
root string
69+
}
70+
71+
func (r *layoutReader) Get(desc descriptor) (io.ReadCloser, error) {
72+
name := filepath.Join(r.root, "blobs", desc.algo(), desc.hash())
73+
74+
info, err := os.Stat(name)
75+
if err != nil {
76+
return nil, err
77+
}
78+
79+
if info.IsDir() {
80+
return nil, fmt.Errorf("object is dir")
81+
}
82+
83+
return os.Open(name)
84+
}

image/walker.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,17 @@ type walkFunc func(path string, _ os.FileInfo, _ io.Reader) error
3535
// calling walk for each file or directory in the tree.
3636
type walker interface {
3737
walk(walkFunc) error
38+
reader
3839
}
3940

4041
type tarWalker struct {
4142
r io.ReadSeeker
43+
tarReader
4244
}
4345

4446
// newTarWalker returns a Walker that walks through .tar files.
45-
func newTarWalker(r io.ReadSeeker) walker {
46-
return &tarWalker{r}
47+
func newTarWalker(tarFile string, r io.ReadSeeker) walker {
48+
return &tarWalker{r, tarReader{name: tarFile}}
4749
}
4850

4951
func (w *tarWalker) walk(f walkFunc) error {
@@ -82,12 +84,13 @@ func (eofReader) Read(_ []byte) (int, error) {
8284

8385
type pathWalker struct {
8486
root string
87+
layoutReader
8588
}
8689

8790
// newPathWalker returns a Walker that walks through directories
8891
// starting at the given root path. It does not follow symlinks.
8992
func newPathWalker(root string) walker {
90-
return &pathWalker{root}
93+
return &pathWalker{root, layoutReader{root: root}}
9194
}
9295

9396
func (w *pathWalker) walk(f walkFunc) error {

0 commit comments

Comments
 (0)