diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-04-30 17:07:00 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-04-30 17:08:04 +0200 |
| commit | 83aabf01858e733338fb72f96b28d955b459bbb3 (patch) | |
| tree | c1d499969e4a9c20759a44edb806725742a11814 /src/gfx | |
| parent | c3fbb34a69de97540aec8fe2ff3884666925f25e (diff) | |
| download | jancity-83aabf01858e733338fb72f96b28d955b459bbb3.tar.gz | |
Avoid memory leak on failed realloc(3)
Diffstat (limited to 'src/gfx')
| -rw-r--r-- | src/gfx/sdl-1.2/privinc/sdl-1.2/gfx_private.h | 2 | ||||
| -rw-r--r-- | src/gfx/sdl-1.2/src/env.c | 17 | ||||
| -rw-r--r-- | src/gfx/sdl-1.2/src/sprite.c | 6 |
3 files changed, 19 insertions, 6 deletions
diff --git a/src/gfx/sdl-1.2/privinc/sdl-1.2/gfx_private.h b/src/gfx/sdl-1.2/privinc/sdl-1.2/gfx_private.h index 9d952d1..339732d 100644 --- a/src/gfx/sdl-1.2/privinc/sdl-1.2/gfx_private.h +++ b/src/gfx/sdl-1.2/privinc/sdl-1.2/gfx_private.h @@ -16,7 +16,7 @@ enum }; int sprite_screen_resize_ev(struct sprite *s); -void gfx_register_sprite(struct sprite *s); +int gfx_register_sprite(struct sprite *s); SDL_Surface *gfx_screen(void); #ifdef __cplusplus diff --git a/src/gfx/sdl-1.2/src/env.c b/src/gfx/sdl-1.2/src/env.c index 4bd174a..734fe5b 100644 --- a/src/gfx/sdl-1.2/src/env.c +++ b/src/gfx/sdl-1.2/src/env.c @@ -2,10 +2,12 @@ #include <gfx_private.h> #include <sdl-1.2/gfx_private.h> #include <SDL.h> +#include <errno.h> #include <inttypes.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> int screen_w = SCREEN_W, screen_h = SCREEN_H; static bool fullscreen; @@ -25,12 +27,19 @@ static struct int w, h; } display, windowed; -void gfx_register_sprite(struct sprite *const s) +int gfx_register_sprite(struct sprite *const s) { - list = realloc(list, (list_len + 1) * sizeof *list); + struct sprite **const l = realloc(list, (list_len + 1) * sizeof *list); - if (list) - list[list_len++] = s; + if (!l) + { + fprintf(stderr, "%s: realloc(3): %s\n", __func__, strerror(errno)); + return -1; + } + + list = l; + list[list_len++] = s; + return 0; } static int resize_screen(int w, int h, const bool full_screen) diff --git a/src/gfx/sdl-1.2/src/sprite.c b/src/gfx/sdl-1.2/src/sprite.c index 011b2ec..d4921ca 100644 --- a/src/gfx/sdl-1.2/src/sprite.c +++ b/src/gfx/sdl-1.2/src/sprite.c @@ -99,8 +99,12 @@ static int load_bitmap(struct sprite *const s, FILE *const f) fprintf(stderr, "SDL_DisplayFormat: %s\n", SDL_GetError()); goto end; } + else if (gfx_register_sprite(s)) + { + fprintf(stderr, "gfx_register_sprite failed\n"); + goto end; + } - gfx_register_sprite(s); s->w = ts->w; s->h = ts->h; ret = 0; |
