From a8b2e910539402bd20dc47b153bf7853172a79b5 Mon Sep 17 00:00:00 2001 From: Nunuhara Cabbage Date: Thu, 30 Jul 2020 20:41:24 -0700 Subject: [PATCH] alice-ar: fix bug when extracting linked webp Need to pass the archive as an argument so that base CGs can be retrieved. --- include/system4/webp.h | 3 ++- src/cg.c | 2 +- src/webp.c | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/system4/webp.h b/include/system4/webp.h index dc50851..4729eb6 100644 --- a/include/system4/webp.h +++ b/include/system4/webp.h @@ -23,9 +23,10 @@ struct cg; struct cg_metrics; +struct archive; bool webp_checkfmt(const uint8_t *data); -void webp_extract(uint8_t *data, size_t size, struct cg *cg); +void webp_extract(uint8_t *data, size_t size, struct cg *cg, struct archive *ar); void webp_get_metrics(uint8_t *data, size_t size, struct cg_metrics *m); #endif /* SYSTEM4_WEBP_H */ diff --git a/src/cg.c b/src/cg.c index 8eb8611..7395f22 100644 --- a/src/cg.c +++ b/src/cg.c @@ -106,7 +106,7 @@ struct cg *cg_load_data(struct archive_data *dfile) WARNING("Unimplemented CG type: PNG"); break; case ALCG_WEBP: - webp_extract(dfile->data, dfile->size, cg); + webp_extract(dfile->data, dfile->size, cg, dfile->archive); break; case ALCG_DCF: dcf_extract(dfile->data, dfile->size, cg); diff --git a/src/webp.c b/src/webp.c index 50ec953..93b2483 100644 --- a/src/webp.c +++ b/src/webp.c @@ -64,7 +64,7 @@ static int get_base_cg(uint8_t *data, size_t size) return LittleEndian_getDW(data, size-4); } -void webp_extract(uint8_t *data, size_t size, struct cg *cg) +void webp_extract(uint8_t *data, size_t size, struct cg *cg, struct archive *ar) { cg->pixels = WebPDecodeRGBA(data, size, &cg->metrics.w, &cg->metrics.h); webp_init_metrics(&cg->metrics); @@ -75,7 +75,7 @@ void webp_extract(uint8_t *data, size_t size, struct cg *cg) return; // FIXME: possible infinite recursion on broken/malicious ALD - struct cg *base_cg = cg_load(ald[ALDFILE_CG], base-1); + struct cg *base_cg = cg_load(ar, base-1); if (base_cg->metrics.w != cg->metrics.w || base_cg->metrics.h != cg->metrics.h) { ERROR("webp base CG dimensions don't match: (%d,%d) / (%d,%d)", base_cg->metrics.w, base_cg->metrics.h, cg->metrics.w, cg->metrics.h);