Bladeren bron

Fix SEGFAULT if dns resolv error

Per registry.doRequest, res and client might be nil in case of error
For example, dns resolution errors, /etc/docker/certs.d perms, failed
loading of x509 cert ...
This will make res.StatusCode and res.Body SEGFAULT.

Signed-off-by: Arthur Gautier <baloo@gandi.net>
Arthur Gautier 10 jaren geleden
bovenliggende
commit
3e6c69e5a1
1 gewijzigde bestanden met toevoegingen van 13 en 7 verwijderingen
  1. 13 7
      registry/session.go

+ 13 - 7
registry/session.go

@@ -153,10 +153,11 @@ func (r *Session) GetRemoteImageJSON(imgID, registry string, token []string) ([]
 
 func (r *Session) GetRemoteImageLayer(imgID, registry string, token []string, imgSize int64) (io.ReadCloser, error) {
 	var (
-		retries  = 5
-		client   *http.Client
-		res      *http.Response
-		imageURL = fmt.Sprintf("%simages/%s/layer", registry, imgID)
+		retries    = 5
+		statusCode = 0
+		client     *http.Client
+		res        *http.Response
+		imageURL   = fmt.Sprintf("%simages/%s/layer", registry, imgID)
 	)
 
 	req, err := r.reqFactory.NewRequest("GET", imageURL, nil)
@@ -165,14 +166,19 @@ func (r *Session) GetRemoteImageLayer(imgID, registry string, token []string, im
 	}
 	setTokenAuth(req, token)
 	for i := 1; i <= retries; i++ {
+		statusCode = 0
 		res, client, err = r.doRequest(req)
 		if err != nil {
-			if res.Body != nil {
-				res.Body.Close()
+			log.Debugf("Error contacting registry: %s", err)
+			if res != nil {
+				if res.Body != nil {
+					res.Body.Close()
+				}
+				statusCode = res.StatusCode
 			}
 			if i == retries {
 				return nil, fmt.Errorf("Server error: Status %d while fetching image layer (%s)",
-					res.StatusCode, imgID)
+					statusCode, imgID)
 			}
 			time.Sleep(time.Duration(i) * 5 * time.Second)
 			continue