# HG changeset patch # User Mike Becker # Date 1750536654 -7200 # Node ID 4c8b9c6d241f88386d59f488f7cb0aea652c4507 # Parent 80700db530ffe27fa804079106bb2c29069998a0 fix segfault when a shader does not compile relates to #690 diff -r 80700db530ff -r 4c8b9c6d241f src/2d.c --- a/src/2d.c Thu Jun 19 19:22:07 2025 +0200 +++ b/src/2d.c Sat Jun 21 22:10:54 2025 +0200 @@ -50,7 +50,6 @@ static AscShaderProgram *asc_rectangle_shader_create(int flags) { AscShaderCodes codes; - // TODO: create a utility that rolls out those defines const char * const defines[] = { "#define FILL\n", "#define ROUNDED_CORNERS\n", @@ -62,7 +61,7 @@ .defines.frag_list = defines, .defines.frag_list_select = flags }, &codes)) { - asc_error("Loading sprite shader failed."); + asc_error("Loading rectangle shader failed."); return NULL; } AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader)); @@ -119,7 +118,7 @@ if (border) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_BORDER; if (round) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_ROUND; - // Compute shader ID + // Lookup table for the shader ID const int shader_ids[] = { -1, // unused ASC_SHADER_RECTANGLE_FILL, @@ -134,6 +133,7 @@ // Look up and activate shader const AscRectangleShader *shader = asc_shader_lookup_or_create( shader_ids[shader_flags], asc_rectangle_shader_create, shader_flags); + if (shader == NULL) return; asc_shader_use(&shader->program, camera); // Upload uniforms diff -r 80700db530ff -r 4c8b9c6d241f src/shader.c --- a/src/shader.c Thu Jun 19 19:22:07 2025 +0200 +++ b/src/shader.c Sat Jun 21 22:10:54 2025 +0200 @@ -235,6 +235,7 @@ } #endif AscShaderProgram *prog = create_func(create_flags); + if (prog == NULL) return NULL; prog->id = id; cxListAdd(glctx->shaders, prog); return prog; diff -r 80700db530ff -r 4c8b9c6d241f src/sprite.c --- a/src/sprite.c Thu Jun 19 19:22:07 2025 +0200 +++ b/src/sprite.c Sat Jun 21 22:10:54 2025 +0200 @@ -99,6 +99,7 @@ sprite->texture->target == GL_TEXTURE_RECTANGLE ? asc_shader_lookup_or_create(ASC_SHADER_SPRITE_RECT, asc_sprite_shader_create, 1) : asc_shader_lookup_or_create(ASC_SHADER_SPRITE_UV, asc_sprite_shader_create, 0); + if (shader == NULL) return; asc_shader_use(&shader->program, camera); // Upload model matrix