Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/memononen/nanosvg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikko Mononen <memononen@gmail.com>2020-09-28 10:49:46 +0300
committerMikko Mononen <memononen@gmail.com>2020-09-28 10:49:46 +0300
commitddd39e96691584fc15475c78346dff758b347767 (patch)
treebb1deb3b0713bf7afbe0718740f1eb49027523bd /src
parente7f5981b1efef8cb5db6f62915ca4e25482b1e5b (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.h13
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;