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:
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);
}