Validate short flags are a single rune.

Fixes #175.
This commit is contained in:
Alec Thomas
2021-06-09 13:10:29 +10:00
parent ff93d67a8d
commit 8cbf5a6c03
2 changed files with 23 additions and 7 deletions
+15 -7
View File
@@ -1,6 +1,7 @@
package kong
import (
"errors"
"fmt"
"reflect"
"strconv"
@@ -130,9 +131,12 @@ func parseTag(fv reflect.Value, ft reflect.StructField) *Tag {
t.Ignored = true
return t
}
t := &Tag{
items: parseTagItems(getTagInfo(ft)),
}
var (
err error
t = &Tag{
items: parseTagItems(getTagInfo(ft)),
}
)
t.Cmd = t.Has("cmd")
t.Arg = t.Has("arg")
required := t.Has("required")
@@ -151,7 +155,10 @@ func parseTag(fv reflect.Value, ft reflect.StructField) *Tag {
t.Help = t.Get("help")
t.Type = t.Get("type")
t.Env = t.Get("env")
t.Short, _ = t.GetRune("short")
t.Short, err = t.GetRune("short")
if err != nil && t.Get("short") != "" {
fail("invalid short flag name %q: %s", t.Get("short"), err)
}
t.Hidden = t.Has("hidden")
t.Format = t.Get("format")
t.Sep, _ = t.GetSep("sep", ',')
@@ -232,9 +239,10 @@ func (t *Tag) GetInt(k string) (int64, error) {
// GetRune parses the given tag as a rune.
func (t *Tag) GetRune(k string) (rune, error) {
r, _ := utf8.DecodeRuneInString(t.Get(k))
if r == utf8.RuneError {
return 0, fmt.Errorf("%v has a rune error", t.Get(k))
value := t.Get(k)
r, size := utf8.DecodeRuneInString(value)
if r == utf8.RuneError || size < len(value) {
return 0, errors.New("invalid rune")
}
return r, nil
}
+8
View File
@@ -192,3 +192,11 @@ func TestTagAliasesSub(t *testing.T) {
require.NoError(t, err)
require.Equal(t, "arg", cli.Cmd.SubCmd.Arg)
}
func TestInvalidRuneErrors(t *testing.T) {
cli := struct {
Flag bool `short:"invalid"`
}{}
_, err := kong.New(&cli)
require.EqualError(t, err, "invalid short flag name \"invalid\": invalid rune")
}