mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Validate --cpuset-cpus, --cpuset-mems
Before this patch libcontainer badly errored out with `invalid argument` or `numerical result out of range` while trying to write to cpuset.cpus or cpuset.mems with an invalid value provided. This patch adds validation to --cpuset-cpus and --cpuset-mems flag along with validation based on system's available cpus/mems before starting a container. Signed-off-by: Antonio Murdaca <runcom@linux.com>
This commit is contained in:
		
							parent
							
								
									2ed0739c7a
								
							
						
					
					
						commit
						94464e3a5e
					
				
					 10 changed files with 303 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -127,7 +127,7 @@ func PartParser(template, data string) (map[string]string, error) {
 | 
			
		|||
		out           = make(map[string]string, len(templateParts))
 | 
			
		||||
	)
 | 
			
		||||
	if len(parts) != len(templateParts) {
 | 
			
		||||
		return nil, fmt.Errorf("Invalid format to parse.  %s should match template %s", data, template)
 | 
			
		||||
		return nil, fmt.Errorf("Invalid format to parse. %s should match template %s", data, template)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, t := range templateParts {
 | 
			
		||||
| 
						 | 
				
			
			@ -196,3 +196,53 @@ func ParseLink(val string) (string, string, error) {
 | 
			
		|||
	}
 | 
			
		||||
	return arr[0], arr[1], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseUintList parses and validates the specified string as the value
 | 
			
		||||
// found in some cgroup file (e.g. `cpuset.cpus`, `cpuset.mems`), which could be
 | 
			
		||||
// one of the formats below. Note that duplicates are actually allowed in the
 | 
			
		||||
// input string. It returns a `map[int]bool` with available elements from `val`
 | 
			
		||||
// set to `true`.
 | 
			
		||||
// Supported formats:
 | 
			
		||||
//     7
 | 
			
		||||
//     1-6
 | 
			
		||||
//     0,3-4,7,8-10
 | 
			
		||||
//     0-0,0,1-7
 | 
			
		||||
//     03,1-3      <- this is gonna get parsed as [1,2,3]
 | 
			
		||||
//     3,2,1
 | 
			
		||||
//     0-2,3,1
 | 
			
		||||
func ParseUintList(val string) (map[int]bool, error) {
 | 
			
		||||
	if val == "" {
 | 
			
		||||
		return map[int]bool{}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	availableInts := make(map[int]bool)
 | 
			
		||||
	split := strings.Split(val, ",")
 | 
			
		||||
	errInvalidFormat := fmt.Errorf("invalid format: %s", val)
 | 
			
		||||
 | 
			
		||||
	for _, r := range split {
 | 
			
		||||
		if !strings.Contains(r, "-") {
 | 
			
		||||
			v, err := strconv.Atoi(r)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errInvalidFormat
 | 
			
		||||
			}
 | 
			
		||||
			availableInts[v] = true
 | 
			
		||||
		} else {
 | 
			
		||||
			split := strings.SplitN(r, "-", 2)
 | 
			
		||||
			min, err := strconv.Atoi(split[0])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errInvalidFormat
 | 
			
		||||
			}
 | 
			
		||||
			max, err := strconv.Atoi(split[1])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errInvalidFormat
 | 
			
		||||
			}
 | 
			
		||||
			if max < min {
 | 
			
		||||
				return nil, errInvalidFormat
 | 
			
		||||
			}
 | 
			
		||||
			for i := min; i <= max; i++ {
 | 
			
		||||
				availableInts[i] = true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return availableInts, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue