Fix null pointer dereference in status.ByIndex (#628)

`git_status_byindex` can return a null pointer if there is no statuses.
This commit is contained in:
michael boulton 2020-08-14 19:19:21 +01:00 committed by GitHub
parent 462ebd83e0
commit fc6eaf3638
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 0 deletions

View File

@ -6,6 +6,7 @@ package git
import "C"
import (
"errors"
"runtime"
"unsafe"
)
@ -86,6 +87,9 @@ func (statusList *StatusList) ByIndex(index int) (StatusEntry, error) {
return StatusEntry{}, ErrInvalid
}
ptr := C.git_status_byindex(statusList.ptr, C.size_t(index))
if ptr == nil {
return StatusEntry{}, errors.New("index out of Bounds")
}
entry := statusEntryFromC(ptr)
runtime.KeepAlive(statusList)

View File

@ -61,3 +61,31 @@ func TestStatusList(t *testing.T) {
t.Fatal("Incorrect entry path: ", entry.IndexToWorkdir.NewFile.Path)
}
}
func TestStatusNothing(t *testing.T) {
t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
seedTestRepo(t, repo)
opts := &StatusOptions{
Show: StatusShowIndexAndWorkdir,
Flags: StatusOptIncludeUntracked | StatusOptRenamesHeadToIndex | StatusOptSortCaseSensitively,
}
statusList, err := repo.StatusList(opts)
checkFatal(t, err)
entryCount, err := statusList.EntryCount()
checkFatal(t, err)
if entryCount != 0 {
t.Fatal("expected no statuses in empty repo")
}
_, err = statusList.ByIndex(0)
if err == nil {
t.Error("expected error getting status by index")
}
}