diff --git a/graph/pull.go b/graph/pull.go index 4e7d78f8f1..02d6267879 100644 --- a/graph/pull.go +++ b/graph/pull.go @@ -39,6 +39,9 @@ func (s *TagStore) verifyManifest(eng *engine.Engine, manifestBytes []byte) (*re if err := json.Unmarshal(payload, &manifest); err != nil { return nil, false, fmt.Errorf("error unmarshalling manifest: %s", err) } + if manifest.SchemaVersion != 1 { + return nil, false, fmt.Errorf("unsupported schema version: %d", manifest.SchemaVersion) + } var verified bool for _, key := range keys { @@ -454,6 +457,10 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri } out.Write(sf.FormatStatus(tag, "Pulling from %s", localName)) + if len(manifest.BlobSums) == 0 { + return fmt.Errorf("no blobSums in manifest") + } + downloads := make([]downloadInfo, len(manifest.BlobSums)) for i := len(manifest.BlobSums) - 1; i >= 0; i-- { @@ -493,6 +500,7 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri log.Debugf("Image (id: %s) pull is already running, skipping: %v", img.ID, err) } } else { + defer s.poolRemove("pull", "img:"+img.ID) tmpFile, err := ioutil.TempFile("", "GetV2ImageBlob") if err != nil { return err @@ -513,7 +521,6 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri di.downloaded = true } di.imgJSON = imgJSON - defer s.poolRemove("pull", "img:"+img.ID) return nil }