github.com/opencontainers/runtime-tools@v0.9.0/generate/seccomp/parse_arguments.go (about)

     1  package seccomp
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  
     7  	rspec "github.com/opencontainers/runtime-spec/specs-go"
     8  )
     9  
    10  // parseArguments takes a list of arguments (delimArgs). It parses and fills out
    11  // the argument information and returns a slice of arg structs
    12  func parseArguments(delimArgs []string) ([]rspec.LinuxSeccompArg, error) {
    13  	nilArgSlice := []rspec.LinuxSeccompArg{}
    14  	numberOfArgs := len(delimArgs)
    15  
    16  	// No parameters passed with syscall
    17  	if numberOfArgs == 1 {
    18  		return nilArgSlice, nil
    19  	}
    20  
    21  	// Correct number of parameters passed with syscall
    22  	if numberOfArgs == 5 {
    23  		syscallIndex, err := strconv.ParseUint(delimArgs[1], 10, 0)
    24  		if err != nil {
    25  			return nilArgSlice, err
    26  		}
    27  
    28  		syscallValue, err := strconv.ParseUint(delimArgs[2], 10, 64)
    29  		if err != nil {
    30  			return nilArgSlice, err
    31  		}
    32  
    33  		syscallValueTwo, err := strconv.ParseUint(delimArgs[3], 10, 64)
    34  		if err != nil {
    35  			return nilArgSlice, err
    36  		}
    37  
    38  		syscallOp, err := parseOperator(delimArgs[4])
    39  		if err != nil {
    40  			return nilArgSlice, err
    41  		}
    42  
    43  		argStruct := rspec.LinuxSeccompArg{
    44  			Index:    uint(syscallIndex),
    45  			Value:    syscallValue,
    46  			ValueTwo: syscallValueTwo,
    47  			Op:       syscallOp,
    48  		}
    49  
    50  		argSlice := []rspec.LinuxSeccompArg{}
    51  		argSlice = append(argSlice, argStruct)
    52  		return argSlice, nil
    53  	}
    54  
    55  	return nilArgSlice, fmt.Errorf("incorrect number of arguments passed with syscall: %d", numberOfArgs)
    56  }
    57  
    58  func parseOperator(operator string) (rspec.LinuxSeccompOperator, error) {
    59  	operators := map[string]rspec.LinuxSeccompOperator{
    60  		"NE": rspec.OpNotEqual,
    61  		"LT": rspec.OpLessThan,
    62  		"LE": rspec.OpLessEqual,
    63  		"EQ": rspec.OpEqualTo,
    64  		"GE": rspec.OpGreaterEqual,
    65  		"GT": rspec.OpGreaterThan,
    66  		"ME": rspec.OpMaskedEqual,
    67  	}
    68  	o, ok := operators[operator]
    69  	if !ok {
    70  		return "", fmt.Errorf("unrecognized operator: %s", operator)
    71  	}
    72  	return o, nil
    73  }