diff options
author | Mikko Mononen <memononen@gmail.com> | 2020-09-28 10:49:46 +0300 |
---|---|---|
committer | Mikko Mononen <memononen@gmail.com> | 2020-09-28 10:49:46 +0300 |
commit | ddd39e96691584fc15475c78346dff758b347767 (patch) | |
tree | bb1deb3b0713bf7afbe0718740f1eb49027523bd /src | |
parent | e7f5981b1efef8cb5db6f62915ca4e25482b1e5b (diff) |
Fix for #185
- prevent infinite loop when gradient ID is left to empty string
- prevent infinite loop when gradient references to self
- lookup up to 32 references back
Diffstat (limited to 'src')
-rw-r--r-- | src/nanosvg.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/nanosvg.h b/src/nanosvg.h index 576fc0c..a110a00 100644 --- a/src/nanosvg.h +++ b/src/nanosvg.h @@ -805,7 +805,9 @@ static float nsvg__convertToPixels(NSVGparser* p, NSVGcoordinate c, float orig, static NSVGgradientData* nsvg__findGradientData(NSVGparser* p, const char* id) { NSVGgradientData* grad = p->gradients; - while (grad) { + if (id == NULL || *id == '\0') + return NULL; + while (grad != NULL) { if (strcmp(grad->id, id) == 0) return grad; grad = grad->next; @@ -822,19 +824,26 @@ static NSVGgradient* nsvg__createGradient(NSVGparser* p, const char* id, const f NSVGgradient* grad; float ox, oy, sw, sh, sl; int nstops = 0; + int refIter; data = nsvg__findGradientData(p, id); if (data == NULL) return NULL; // TODO: use ref to fill in all unset values too. ref = data; + refIter = 0; while (ref != NULL) { + NSVGgradientData* nextRef = NULL; if (stops == NULL && ref->stops != NULL) { stops = ref->stops; nstops = ref->nstops; break; } - ref = nsvg__findGradientData(p, ref->ref); + nextRef = nsvg__findGradientData(p, ref->ref); + if (nextRef == ref) break; // prevent infite loops on malformed data + ref = nextRef; + refIter++; + if (refIter > 32) break; // prevent infite loops on malformed data } if (stops == NULL) return NULL; |