Commit: 32726a8459aa56da2a35b8f068784c6bf72f3697
Parent: 67371c4b2aa148bee09d7d2d62363b85b28d0444
Author: Randy Palamar
Date: Tue, 28 Jan 2025 20:37:45 -0700
core: avoid crashing when w32 fails to read file
this is not the longterm fix but that will be handled after the
asynchronous commit.
Diffstat:
M | os_unix.c | | | 28 | +++++++++++++--------------- |
M | os_win32.c | | | 34 | ++++++++++++++-------------------- |
M | static.c | | | 28 | +++++++++++++++------------- |
3 files changed, 42 insertions(+), 48 deletions(-)
diff --git a/os_unix.c b/os_unix.c
@@ -72,23 +72,21 @@ static PLATFORM_OPEN_FOR_WRITE_FN(os_open_for_write)
}
static s8
-os_read_file(Arena *a, char *fname, size fsize)
+os_read_file(Arena *a, char *file, size filesize)
{
- if (fsize < 0)
- return (s8){.len = -1};
-
- i32 fd = open(fname, O_RDONLY);
- if (fd < 0)
- return (s8){.len = -1};
-
- s8 ret = s8alloc(a, fsize);
- size rlen = read(fd, ret.data, ret.len);
- close(fd);
-
- if (rlen != ret.len)
- return (s8){.len = -1};
+ s8 result = {0};
+
+ i32 fd = open(file, O_RDONLY);
+ if (fd >= 0) {
+ result = s8alloc(a, filesize);
+ size rlen = read(fd, result.data, result.len);
+ if (rlen != result.len) {
+ result = (s8){0};
+ }
+ close(fd);
+ }
- return ret;
+ return result;
}
static PLATFORM_WRITE_NEW_FILE_FN(os_write_new_file)
diff --git a/os_win32.c b/os_win32.c
@@ -159,29 +159,23 @@ static PLATFORM_OPEN_FOR_WRITE_FN(os_open_for_write)
}
static s8
-os_read_file(Arena *a, char *fname, size fsize)
+os_read_file(Arena *a, char *file, size filesize)
{
- if (fsize < 0)
- return (s8){.len = -1};
-
- if (fsize > (size)U32_MAX) {
- os_write_err_msg(s8("os_read_file: files >4GB are not yet handled on win32\n"));
- return (s8){.len = -1};
+ s8 result = {0};
+
+ if (BETWEEN(filesize, 0, (size)U32_MAX)) {
+ s8 result = s8alloc(a, filesize);
+ iptr h = CreateFileA(fname, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
+ if (h >= 0) {
+ i32 rlen;
+ if (!ReadFile(h, result.data, result.len, &rlen, 0) || rlen != result.len) {
+ result = (s8){0};
+ }
+ CloseHandle(h);
+ }
}
- iptr h = CreateFileA(fname, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
- if (h == INVALID_FILE)
- return (s8){.len = -1};
-
- s8 ret = s8alloc(a, fsize);
-
- i32 rlen = 0;
- b32 error = !ReadFile(h, ret.data, ret.len, &rlen, 0) || rlen != ret.len;
- CloseHandle(h);
- if (error)
- return (s8){.len = -1};
-
- return ret;
+ return result;
}
static PLATFORM_WRITE_NEW_FILE_FN(os_write_new_file)
diff --git a/static.c b/static.c
@@ -213,25 +213,27 @@ static FILE_WATCH_CALLBACK_FN(reload_compute_shader)
s8 shader_text = os_read_file(&tmp, (c8 *)path.data, fs);
shader_text.data -= header_in_arena.len;
shader_text.len += header_in_arena.len;
- ASSERT(shader_text.data == header_in_arena.data);
- u32 shader_id = compile_shader(tmp, GL_COMPUTE_SHADER, shader_text);
- if (shader_id) {
- glDeleteProgram(cs->programs[ctx->shader]);
- cs->programs[ctx->shader] = rlLoadComputeShaderProgram(shader_id);
- glUseProgram(cs->programs[ctx->shader]);
- glBindBufferBase(GL_UNIFORM_BUFFER, 0, cs->shared_ubo);
- LABEL_GL_OBJECT(GL_PROGRAM, cs->programs[ctx->shader], ctx->label);
+ if (shader_text.data == header_in_arena.data) {
+ u32 shader_id = compile_shader(tmp, GL_COMPUTE_SHADER, shader_text);
+ if (shader_id) {
+ glDeleteProgram(cs->programs[ctx->shader]);
+ cs->programs[ctx->shader] = rlLoadComputeShaderProgram(shader_id);
+ glUseProgram(cs->programs[ctx->shader]);
+ glBindBufferBase(GL_UNIFORM_BUFFER, 0, cs->shared_ubo);
+ LABEL_GL_OBJECT(GL_PROGRAM, cs->programs[ctx->shader], ctx->label);
- TraceLog(LOG_INFO, "%s loaded", path.data);
+ TraceLog(LOG_INFO, "%s loaded", path.data);
- ctx->ctx->flags |= START_COMPUTE;
+ ctx->ctx->flags |= START_COMPUTE;
+ } else {
+ result = 0;
+ }
+ glDeleteShader(shader_id);
} else {
- result = 0;
+ TraceLog(LOG_INFO, "shader failed to load: %s", path.data);
}
- glDeleteShader(shader_id);
-
return result;
}