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>master
							parent
							
								
									2c78019539
								
							
						
					
					
						commit
						eaf57e8f55
					
				| 
						 | 
					@ -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) {
 | 
					func (r *Session) GetRemoteImageLayer(imgID, registry string, token []string, imgSize int64) (io.ReadCloser, error) {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		retries  = 5
 | 
							retries    = 5
 | 
				
			||||||
		client   *http.Client
 | 
							statusCode = 0
 | 
				
			||||||
		res      *http.Response
 | 
							client     *http.Client
 | 
				
			||||||
		imageURL = fmt.Sprintf("%simages/%s/layer", registry, imgID)
 | 
							res        *http.Response
 | 
				
			||||||
 | 
							imageURL   = fmt.Sprintf("%simages/%s/layer", registry, imgID)
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req, err := r.reqFactory.NewRequest("GET", imageURL, nil)
 | 
						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)
 | 
						setTokenAuth(req, token)
 | 
				
			||||||
	for i := 1; i <= retries; i++ {
 | 
						for i := 1; i <= retries; i++ {
 | 
				
			||||||
 | 
							statusCode = 0
 | 
				
			||||||
		res, client, err = r.doRequest(req)
 | 
							res, client, err = r.doRequest(req)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if res.Body != nil {
 | 
								log.Debugf("Error contacting registry: %s", err)
 | 
				
			||||||
				res.Body.Close()
 | 
								if res != nil {
 | 
				
			||||||
 | 
									if res.Body != nil {
 | 
				
			||||||
 | 
										res.Body.Close()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									statusCode = res.StatusCode
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if i == retries {
 | 
								if i == retries {
 | 
				
			||||||
				return nil, fmt.Errorf("Server error: Status %d while fetching image layer (%s)",
 | 
									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)
 | 
								time.Sleep(time.Duration(i) * 5 * time.Second)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue