]> gitweb.michael.orlitzky.com - libsvgtiny.git/blobdiff - src/svgtiny_gradient.c
Fix various bugs which caused ASAN and UBSAN to be upset
[libsvgtiny.git] / src / svgtiny_gradient.c
index b282f45cb35d61738fd63cc9e4ace784c986d03a..4b327ddbcc2045260bb35f2f590e0fcd99478be7 100644 (file)
@@ -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;
         }