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
					
				| 
						 | 
				
			
			@ -154,6 +154,7 @@ 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
 | 
			
		||||
		statusCode = 0
 | 
			
		||||
		client     *http.Client
 | 
			
		||||
		res        *http.Response
 | 
			
		||||
		imageURL   = fmt.Sprintf("%simages/%s/layer", registry, imgID)
 | 
			
		||||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
			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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue