From 24b0c2a4a157b9d4ba538b12e4abb673c2971810 Mon Sep 17 00:00:00 2001 From: Jack Mordaunt Date: Mon, 20 May 2024 14:23:41 +0800 Subject: [PATCH] internal/gl: [Windows] allow GetProgramInfoLog to return nothing If GetProgrami returns 0 we will panic because a zero-sized buffer indexed at zero will OOB panic: "runtime error: index out of range [0] with length 0". This was observed and is not theoretical. Windows 8 9200 Hardware: { "board": { "name": "1963", "vendor": "Hewlett-Packard" }, "cpu": { "name": "Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz", "vendor": "GenuineIntel", "extra": { "cores": "4", "threads": "8" } }, "ram": "8.00GB" } panic({0x7f7222ff260?, 0xc004b960d8?}) runtime/panic.go:770 +0x132 gioui.org/internal/gl.(*Functions).GetProgramInfoLog(0xc004cd4000?, {0x7f720039345?}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/internal/gl/gl_windows.go:365 +0xc5 gioui.org/gpu/internal/opengl.(*Backend).newProgram(0xc004c8e008, {{0x7f7229d0b40, 0xc004e3a000}, {0x7f7229d0b60, 0xc004e3a120}, {{0xc002b04060, 0x2, 0x2}, 0x10}, {0x1, ...}, ...}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/internal/opengl/opengl.go:954 +0x26b gioui.org/gpu/internal/opengl.(*Backend).NewPipeline(0x2ec?, {{0x7f7229d0b40, 0xc004e3a000}, {0x7f7229d0b60, 0xc004e3a120}, {{0xc002b04060, 0x2, 0x2}, 0x10}, {0x1, ...}, ...}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/internal/opengl/opengl.go:918 +0x65 gioui.org/gpu.createColorPrograms({_, _}, {{0x7f72241fcbb, 0x9}, {0x0, 0x0}, {0x7f72259c680, 0x42a}, {0x0, 0x0}, ...}, ...) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:601 +0x332 gioui.org/gpu.newBlitter({0x7f7229fea48, 0xc004c8e008}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:559 +0x358 gioui.org/gpu.newRenderer({0x7f7229fea48, 0xc004c8e008}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:516 +0x25 gioui.org/gpu.(*gpu).init(...) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:373 gioui.org/gpu.newGPU({0x7f7229fea48, 0xc004c8e008}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:365 +0x14d gioui.org/gpu.NewWithDevice({0x7f7229fea48, 0xc004c8e008}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:355 +0x10c gioui.org/gpu.New({0x7f7229cbdc0?, 0xc004bd2000?}) gioui.org@v0.4.2-0.20231216201919-2128f7adea9b/gpu/gpu.go:342 +0x34 Signed-off-by: Jack Mordaunt --- internal/gl/gl_windows.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/gl/gl_windows.go b/internal/gl/gl_windows.go index edf688df..a30457fd 100644 --- a/internal/gl/gl_windows.go +++ b/internal/gl/gl_windows.go @@ -361,6 +361,9 @@ func (c *Functions) GetProgrami(p Program, pname Enum) int { } func (c *Functions) GetProgramInfoLog(p Program) string { n := c.GetProgrami(p, INFO_LOG_LENGTH) + if n == 0 { + return "" + } buf := make([]byte, n) syscall.Syscall6(_glGetProgramInfoLog.Addr(), 4, uintptr(p.V), uintptr(len(buf)), 0, uintptr(unsafe.Pointer(&buf[0])), 0, 0) return string(buf)