Skip to content

Commit

Permalink
Check for duplicated sysctl keys
Browse files Browse the repository at this point in the history
Signed-off-by: mmirecki <mmirecki@redhat.com>
  • Loading branch information
mmirecki committed Apr 21, 2022
1 parent 93604ec commit 7accdeb
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 0 deletions.
25 changes: 25 additions & 0 deletions plugins/meta/tuning/tuning.go
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,9 @@ func restoreBackup(ifName, containerID, backupPath string) error {
}

func cmdAdd(args *skel.CmdArgs) error {
if err := validateSysctlConflictingValues(args.StdinData); err != nil {
return err
}
tuningConf, err := parseConf(args.StdinData, args.Args)
if err != nil {
return err
Expand Down Expand Up @@ -542,3 +545,25 @@ func readAllowlist() (bool, []string, error) {
}
return true, allowList, nil
}

type sysctlKey string

type sysctlCheck struct {
SysCtl map[sysctlKey]string `json:"sysctl"`
}

var sysctlDuplicatesMap = map[sysctlKey]interface{}{}

func (d *sysctlKey) UnmarshalText(data []byte) error {
key := sysctlKey(string(data))
if _, exists := sysctlDuplicatesMap[key]; exists {
return errors.New("duplicated sysctl keys are not allowed")
}
sysctlDuplicatesMap[key] = ""
return nil
}

func validateSysctlConflictingValues(data []byte) error {
sysctlCheck := sysctlCheck{}
return json.Unmarshal(data, &sysctlCheck)
}
49 changes: 49 additions & 0 deletions plugins/meta/tuning/tuning_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ var _ = Describe("tuning plugin", func() {
return nil
})
Expect(err).NotTo(HaveOccurred())
sysctlDuplicatesMap = map[sysctlKey]interface{}{}
})

AfterEach(func() {
Expand Down Expand Up @@ -1122,5 +1123,53 @@ var _ = Describe("tuning plugin", func() {
})
Expect(err).NotTo(HaveOccurred())
})

It(fmt.Sprintf("[%s] does not allow duplicated sysctl values", ver), func() {
conf := []byte(fmt.Sprintf(`{
"name": "test",
"type": "tuning",
"cniVersion": "%s",
"sysctl": {
"net.ipv4.conf.all.log_martians": "1",
"net.ipv4.conf.all.log_martians": "0"
},
"prevResult": {
"interfaces": [
{"name": "dummy0", "sandbox":"netns"}
],
"ips": [
{
"version": "4",
"address": "10.0.0.2/24",
"gateway": "10.0.0.1",
"interface": 0
}
]
}
}`, ver))

args := &skel.CmdArgs{
ContainerID: "dummy",
Netns: targetNS.Path(),
IfName: IFNAME,
StdinData: conf,
}

beforeConf = configToRestore{}

err := originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover()

_, _, err := testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args)
})
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("duplicated"))

return nil
})
Expect(err).NotTo(HaveOccurred())
})

}
})

0 comments on commit 7accdeb

Please sign in to comment.