summaryrefslogtreecommitdiff
path: root/src/svgtiny_gradient.c
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2018-07-29 10:20:38 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2018-07-29 10:20:38 +0100
commit8b42b87e23dd3bd6d3a3e5c8f7693852f33087be (patch)
tree847e48e97fbb904b215630db7b7a7d75637f998e /src/svgtiny_gradient.c
parentd62f8b2a13cf7e7bcc4963e541d27490dda77757 (diff)
downloadlibsvgtiny-8b42b87e23dd3bd6d3a3e5c8f7693852f33087be.tar.gz
libsvgtiny-8b42b87e23dd3bd6d3a3e5c8f7693852f33087be.tar.bz2
Fix various bugs which caused ASAN and UBSAN to be upset
Diffstat (limited to 'src/svgtiny_gradient.c')
-rw-r--r--src/svgtiny_gradient.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/svgtiny_gradient.c b/src/svgtiny_gradient.c
index b282f45..4b327dd 100644
--- a/src/svgtiny_gradient.c
+++ b/src/svgtiny_gradient.c
@@ -237,7 +237,7 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
(const uint8_t *) s,
strcspn(s, "; "),
&value);
- if (exc != DOM_NO_ERR &&
+ if (exc == DOM_NO_ERR &&
value != NULL) {
svgtiny_parse_color(value,
&color,
@@ -420,8 +420,10 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
gradient_norm_squared = gradient_dx * gradient_dx +
gradient_dy * gradient_dy;
pts = svgtiny_list_create(sizeof (struct grad_point));
- if (!pts)
+ if (!pts) {
+ free(p);
return svgtiny_OUT_OF_MEMORY;
+ }
for (j = 0; j != n; ) {
int segment_type = (int) p[j];
struct grad_point *point;
@@ -446,6 +448,7 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
gradient_norm_squared;
point = svgtiny_list_push(pts);
if (!point) {
+ free(p);
svgtiny_list_free(pts);
return svgtiny_OUT_OF_MEMORY;
}
@@ -524,6 +527,7 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
#endif
point = svgtiny_list_push(pts);
if (!point) {
+ free(p);
svgtiny_list_free(pts);
return svgtiny_OUT_OF_MEMORY;
}
@@ -551,6 +555,7 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
/* There must be at least a single point for the gradient */
if (svgtiny_list_size(pts) == 0) {
svgtiny_list_free(pts);
+ free(p);
return svgtiny_OK;
}