background image: make sure to close the farbfeld file on error

This commit is contained in:
bakkeby 2022-03-11 09:38:09 +01:00
parent 1a8175a337
commit faac64e392

View File

@ -16,23 +16,20 @@ loadff(const char *filename)
FILE *f = fopen(filename, "rb"); FILE *f = fopen(filename, "rb");
if (f == NULL) { if (f == NULL) {
fprintf(stderr, "could not load background image.\n"); fprintf(stderr, "could not load background image.\n");
return NULL; return NULL;
} }
if (fread(hdr, sizeof(*hdr), LEN(hdr), f) != LEN(hdr)) if (fread(hdr, sizeof(*hdr), LEN(hdr), f) != LEN(hdr)) {
if (ferror(f)) { fprintf(stderr, "fread: %s\n", ferror(f) ? "" : "Unexpected end of file reading header");
fprintf(stderr, "fread:"); fclose(f);
return NULL; return NULL;
} }
else {
fprintf(stderr, "fread: Unexpected end of file\n");
return NULL;
}
if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) {
fprintf(stderr, "Invalid magic value"); fprintf(stderr, "Invalid magic value\n");
return NULL; fclose(f);
return NULL;
} }
w = ntohl(hdr[2]); w = ntohl(hdr[2]);
@ -40,15 +37,11 @@ loadff(const char *filename)
size = w * h; size = w * h;
data = malloc(size * sizeof(uint64_t)); data = malloc(size * sizeof(uint64_t));
if (fread(data, sizeof(uint64_t), size, f) != size) if (fread(data, sizeof(uint64_t), size, f) != size) {
if (ferror(f)) { fprintf(stderr, "fread: %s\n", ferror(f) ? "" : "Unexpected end of file reading data");
fprintf(stderr, "fread:"); fclose(f);
return NULL; return NULL;
} }
else {
fprintf(stderr, "fread: Unexpected end of file");
return NULL;
}
fclose(f); fclose(f);
@ -91,8 +84,7 @@ bginit()
bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height, bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height,
DefaultDepth(xw.dpy, xw.scr)); DefaultDepth(xw.dpy, xw.scr));
#endif // ALPHA_PATCH #endif // ALPHA_PATCH
XPutImage(xw.dpy, bgimg, dc.gc, bgxi, 0, 0, 0, 0, bgxi->width, XPutImage(xw.dpy, bgimg, dc.gc, bgxi, 0, 0, 0, 0, bgxi->width, bgxi->height);
bgxi->height);
XDestroyImage(bgxi); XDestroyImage(bgxi);
XSetTile(xw.dpy, xw.bggc, bgimg); XSetTile(xw.dpy, xw.bggc, bgimg);
XSetFillStyle(xw.dpy, xw.bggc, FillTiled); XSetFillStyle(xw.dpy, xw.bggc, FillTiled);
@ -101,4 +93,4 @@ bginit()
MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask);
XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
} }
} }