parse_arguments.go 1.8 KB

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