diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index ac1a7f1d3..8b445f0db 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -60,7 +60,13 @@ func (scp *ShortcodeWithPage) Get(key interface{}) interface{} { if reflect.TypeOf(scp.Params).Kind() == reflect.Map { return "error: cannot access named params by position" } else if reflect.TypeOf(scp.Params).Kind() == reflect.Slice { - x = reflect.ValueOf(scp.Params).Index(int(reflect.ValueOf(key).Int())) + idx := int(reflect.ValueOf(key).Int()) + ln := reflect.ValueOf(scp.Params).Len() + if idx > ln-1 { + helpers.DistinctErrorLog.Printf("No shortcode param at .Get %d in page %s, have params: %v", idx, scp.Page.FullFilePath(), scp.Params) + return fmt.Sprintf("error: index out of range for positional param at position %d", idx) + } + x = reflect.ValueOf(scp.Params).Index(idx) } case string: if reflect.TypeOf(scp.Params).Kind() == reflect.Map { diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go index d7afbc14e..43c958aff 100644 --- a/hugolib/shortcode_test.go +++ b/hugolib/shortcode_test.go @@ -85,6 +85,12 @@ func TestPositionalParamSC(t *testing.T) { CheckShortCodeMatch(t, "{{< video 47238zzb >}}", "Playing Video 47238zzb", tem) } +func TestPositionalParamIndexOutOfBounds(t *testing.T) { + tem := tpl.New() + tem.AddInternalShortcode("video.html", `Playing Video {{ .Get 1 }}`) + CheckShortCodeMatch(t, "{{< video 47238zzb >}}", "Playing Video error: index out of range for positional param at position 1", tem) +} + func TestNamedParamSC(t *testing.T) { tem := tpl.New() tem.AddInternalShortcode("img.html", ``)