From 15c71f513550f4874a0bcbc9a9beb418ba861d6b Mon Sep 17 00:00:00 2001 From: Jamie Brandon Date: Wed, 8 Jun 2022 12:59:41 -0700 Subject: [PATCH] freetype: Avoid dereferencing null bitmap buffer. For some characters (eg \r) the returned glyph will have .{.rows = 0, .width=0, .pitch = 0, .buffer = null}. In zig null[0..0] causes a panic rather than returning an empty slice. --- freetype/examples/single-glyph.zig | 2 +- freetype/src/freetype/image.zig | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/freetype/examples/single-glyph.zig b/freetype/examples/single-glyph.zig index cd5340a7..5a581d5b 100644 --- a/freetype/examples/single-glyph.zig +++ b/freetype/examples/single-glyph.zig @@ -21,7 +21,7 @@ pub fn main() !void { while (i < bitmap.rows()) : (i += 1) { var j: usize = 0; while (j < bitmap.width()) : (j += 1) { - const char: u8 = switch (bitmap.buffer()[i * bitmap.width() + j]) { + const char: u8 = switch (bitmap.buffer().?[i * bitmap.width() + j]) { 0 => ' ', 1...128 => ';', else => '#', diff --git a/freetype/src/freetype/image.zig b/freetype/src/freetype/image.zig index 03a271c5..2a692147 100644 --- a/freetype/src/freetype/image.zig +++ b/freetype/src/freetype/image.zig @@ -45,8 +45,13 @@ pub const Bitmap = struct { return @intToEnum(PixelMode, self.handle.pixel_mode); } - pub fn buffer(self: Bitmap) []const u8 { + pub fn buffer(self: Bitmap) ?[]const u8 { const buffer_size = std.math.absCast(self.pitch()) * self.rows(); - return self.handle.buffer[0..buffer_size]; + return if (self.handle.buffer == null) + // freetype returns a null pointer for zero-length allocations + // https://github.com/hexops/freetype/blob/bbd80a52b7b749140ec87d24b6c767c5063be356/freetype/src/base/ftutil.c#L135 + null + else + self.handle.buffer[0..buffer_size]; } };