From 107bfac9f44467aba39d3543ea2e57c7eecb995d Mon Sep 17 00:00:00 2001 From: Satoshi Fujimoto Date: Thu, 15 Mar 2018 15:01:19 +0900 Subject: [PATCH] cmd/common: Specify number of expected arguments In CLI operation, currently, unexpected argument names (such as 'aspath' for 'gobgp neighbor add') may pass the validations and return no errors. This commit prevents accepting those argument names by specifying the number of expected arguments for each argument names. Signed-off-by: Satoshi Fujimoto --- gobgp/cmd/common.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/gobgp/cmd/common.go b/gobgp/cmd/common.go index 9c3f1732..99229008 100644 --- a/gobgp/cmd/common.go +++ b/gobgp/cmd/common.go @@ -82,6 +82,12 @@ const ( CMD_VALIDATION = "validation" ) +const ( + PARAM_FLAG = iota + PARAM_SINGLE + PARAM_LIST +) + var subOpts struct { AddressFamily string `short:"a" long:"address-family" description:"specifying an address family"` } @@ -154,11 +160,11 @@ func cidr2prefix(cidr string) string { return buffer.String()[:ones] } -func extractReserved(args, keys []string) map[string][]string { +func extractReserved(args []string, keys map[string]int) (map[string][]string, error) { m := make(map[string][]string, len(keys)) var k string isReserved := func(s string) bool { - for _, r := range keys { + for r := range keys { if s == r { return true } @@ -173,7 +179,26 @@ func extractReserved(args, keys []string) map[string][]string { m[k] = append(m[k], arg) } } - return m + for k, v := range m { + if k == "" { + continue + } + switch keys[k] { + case PARAM_FLAG: + if len(v) != 0 { + return nil, fmt.Errorf("%s should not have arguments", k) + } + case PARAM_SINGLE: + if len(v) != 1 { + return nil, fmt.Errorf("%s should have one argument", k) + } + case PARAM_LIST: + if len(v) == 0 { + return nil, fmt.Errorf("%s should have one or more arguments", k) + } + } + } + return m, nil } type neighbors []*config.Neighbor