emote2ss

Animated webp to spritesheets converting tool
git clone git://bsandro.tech/emote2ss
Log | Files | Refs | README | LICENSE

commit 0dfb16426a0885bedaa1cddf91ab4d11e71f025a
parent 7d6a8cf0f39a2d874967055d893ce918ed7cb249
Author: bsandro <email@bsandro.tech>
Date:   Wed, 24 Dec 2025 00:23:50 +0200

Do not crash when opening non-existent files or directories

Diffstat:
Mgui/animation.c | 16++++++++++++----
Mgui/fileops.c | 23++++++++++++++++++-----
Mgui/ui.c | 9++++++---
3 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/gui/animation.c b/gui/animation.c @@ -8,6 +8,7 @@ #include <assert.h> #include <string.h> #include <strings.h> +#include <errno.h> #include "webp/decode.h" #include "webp/demux.h" @@ -29,14 +30,21 @@ #endif Animation * ImageLoad(const char *path) { + char *rp = realpath(path, NULL); + if (rp==NULL) { + fprintf(stderr, "error: %s\n", strerror(errno)); + return NULL; + } Animation *img = malloc(sizeof(Animation)); assert(img!=NULL); bzero(img, sizeof(Animation)); - img->path = realpath(path, NULL); - assert(img->path!=NULL); + img->path = rp; printf("img->path: %s\n", img->path); - int r = WebpRead(img->path, img); - assert(r==0); + if (WebpRead(img->path, img)!=0) { + free(img); + free(rp); + return NULL; + } char *name_copy = strndup(img->path, PATH_MAX); char *path_copy = strndup(img->path, PATH_MAX); diff --git a/gui/fileops.c b/gui/fileops.c @@ -1,3 +1,8 @@ +#define _POSIX_C_SOURCE 1 + +#include <errno.h> +#include <stdio.h> +#include <sys/stat.h> #include "webp/decode.h" #include "webp/encode.h" #include "webp/demux.h" @@ -7,16 +12,24 @@ int FileRead(const char *filename, const uint8_t **data, size_t *size) { assert(data != NULL); assert(size != NULL); - *data = NULL; *size = 0; FILE *infile = fopen(filename, "rb"); assert(infile != NULL); - fseek(infile, 0, SEEK_END); - size_t fsize = ftell(infile); - // printf("%s: %zu bytes\n", filename, fsize); - fseek(infile, 0, SEEK_SET); + struct stat sb; + if (fstat(fileno(infile), &sb)==-1) { + fprintf(stderr, "error: %s\n", strerror(errno)); + fclose(infile); + return -1; + } + if (!S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s is not a regular file\n", filename); + fclose(infile); + return -1; + } + size_t fsize = sb.st_size; + printf("%s: %zu bytes\n", filename, fsize); uint8_t *fdata = malloc(fsize+1); assert(fdata != NULL); fdata[fsize] = '\0'; diff --git a/gui/ui.c b/gui/ui.c @@ -119,6 +119,7 @@ int ButtonDialogSaveEvent(UIElement *element, UIMessage msg, int di, void *dp) { // get values of path and filename inputs UITextbox *path_input = (UITextbox *)element->parent->children[0]; UITextbox *filename_input = (UITextbox *)element->parent->children[1]; + if (path_input->bytes<=0 || filename_input->bytes<=0) return 1; // printf("path_input: %p\nfilename_input: %p\n", path_input, filename_input); // that printf might work incorrectly because path_input->string might not contain valid C string with \0 at the end // printf("path_input: %s(%d)\nfilename_input: %s(%d)\n", path_input->string, path_input->bytes, filename_input->string, filename_input->bytes); @@ -144,9 +145,11 @@ int ButtonDialogOpenEvent(UIElement *element, UIMessage msg, int di, void *dp) { // printf("open dialog window close\n"); UITextbox *path_input = (UITextbox *)element->parent->children[0]; UITextbox *filename_input = (UITextbox *)element->parent->children[1]; - // printf("path_input: %p\nfilename_input: %p\n", path_input, filename_input); + // printf("path_input: %p(%d)\nfilename_input: %p(%d)\n", path_input, path_input->bytes, filename_input, filename_input->bytes); // printf("path_input: %s(%d)\nfilename_input: %s(%d)\n", path_input->string, strlen(path_input->string), filename_input->string, strlen(filename_input->string)); + if (path_input->bytes<=0 || filename_input->bytes<=0) return 1; + UIElementDestroy(&element->window->e); int path_len = path_input->bytes + filename_input->bytes + 2; // DIR_SEPARATOR and '\0' @@ -161,7 +164,7 @@ int ButtonDialogOpenEvent(UIElement *element, UIMessage msg, int di, void *dp) { assert(img==NULL); } img = ImageLoad(filepath); - assert(img!=NULL); + if (img==NULL) return 1; UILabelSetContent(lbl_header, img->path, -1); PreviewUpdate(img, img_disp); } @@ -267,7 +270,7 @@ void ShowModalWindow(UIWindow *parent, char *def_dir, const char *def_file, Call UITextboxReplace(path_input, def_dir, -1, false); UITextbox *filename_input = UITextboxCreate(&panel_top->e, UI_ELEMENT_TAB_STOP|UI_ELEMENT_H_FILL); - printf("path_input: %p (%s)\nfilename_input: %p (%s)\n", path_input, def_dir, filename_input, def_file); + //printf("path_input: %p (%s)\nfilename_input: %p (%s)\n", path_input, def_dir, filename_input, def_file); if (def_file!=NULL) { UITextboxReplace(filename_input, def_file, -1, false); }