From e071a4f8e2d231e339ba45a4449ae0c1dceabbdb Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sun, 14 Oct 2018 17:58:44 -0400 Subject: [PATCH] Better bounds checks for search Fixes #1217 --- cmd/micro/search.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/cmd/micro/search.go b/cmd/micro/search.go index 139bcb41..7139f844 100644 --- a/cmd/micro/search.go +++ b/cmd/micro/search.go @@ -98,11 +98,23 @@ func HandleSearchEvent(event tcell.Event, v *View) { } func searchDown(r *regexp.Regexp, v *View, start, end Loc) bool { + if start.Y >= v.Buf.NumLines { + start.Y = v.Buf.NumLines - 1 + } + if start.Y < 0 { + start.Y = 0 + } for i := start.Y; i <= end.Y; i++ { var l []byte var charPos int if i == start.Y { runes := []rune(string(v.Buf.lines[i].data)) + if start.X >= len(runes) { + start.X = len(runes) - 1 + } + if start.X < 0 { + start.X = 0 + } l = []byte(string(runes[start.X:])) charPos = start.X @@ -129,10 +141,22 @@ func searchDown(r *regexp.Regexp, v *View, start, end Loc) bool { } func searchUp(r *regexp.Regexp, v *View, start, end Loc) bool { + if start.Y >= v.Buf.NumLines { + start.Y = v.Buf.NumLines - 1 + } + if start.Y < 0 { + start.Y = 0 + } for i := start.Y; i >= end.Y; i-- { var l []byte if i == start.Y { runes := []rune(string(v.Buf.lines[i].data)) + if start.X >= len(runes) { + start.X = len(runes) - 1 + } + if start.X < 0 { + start.X = 0 + } l = []byte(string(runes[:start.X])) if strings.Contains(r.String(), "$") && start.X != Count(string(l)) {