@@ -956,9 +956,11 @@ void quad2cubic(double x0, double y0,
956
956
char *__append_to_string (char *p, char *buffer, size_t buffersize,
957
957
const char *content)
958
958
{
959
+ int buffersize_int = (int )buffersize;
960
+
959
961
for (const char *i = content; *i; ++i) {
960
- if (p < buffer || p - buffer >= ( int )buffersize ) {
961
- return p ;
962
+ if (p < buffer || p - buffer >= buffersize_int ) {
963
+ return NULL ;
962
964
}
963
965
964
966
*p++ = *i;
@@ -968,12 +970,12 @@ char *__append_to_string(char *p, char *buffer, size_t buffersize,
968
970
}
969
971
970
972
template <class PathIterator >
971
- void __convert_to_string (PathIterator &path,
972
- int precision,
973
- char **codes,
974
- bool postfix,
975
- char *buffer,
976
- size_t *buffersize)
973
+ int __convert_to_string (PathIterator &path,
974
+ int precision,
975
+ char **codes,
976
+ bool postfix,
977
+ char *buffer,
978
+ size_t *buffersize)
977
979
{
978
980
#if PY_VERSION_HEX < 0x02070000
979
981
char format[64 ];
@@ -992,75 +994,86 @@ void __convert_to_string(PathIterator &path,
992
994
993
995
while ((code = path.vertex (&x[0 ], &y[0 ])) != agg::path_cmd_stop) {
994
996
if (code == 0x4f ) {
995
- p = __append_to_string (p, buffer, *buffersize, codes[4 ]);
997
+ if (( p = __append_to_string (p, buffer, *buffersize, codes[4 ])) == NULL ) return 1 ;
996
998
} else {
997
999
size = sizes[code - 1 ];
998
1000
999
1001
for (int i = 1 ; i < size; ++i) {
1000
- path.vertex (&x[i], &y[i]);
1002
+ unsigned subcode = path.vertex (&x[i], &y[i]);
1003
+ if (subcode != code) {
1004
+ return 2 ;
1005
+ }
1001
1006
}
1002
1007
1003
1008
/* For formats that don't support quad curves, convert to
1004
1009
cubic curves */
1005
- if (codes[code - 1 ][0 ] == ' \0 ' ) {
1010
+ if (code == CURVE3 && codes[code - 1 ][0 ] == ' \0 ' ) {
1006
1011
quad2cubic (last_x, last_y, x[0 ], y[0 ], x[1 ], y[1 ], x, y);
1007
1012
code++;
1008
1013
size = 3 ;
1009
1014
}
1010
1015
1011
1016
if (!postfix) {
1012
- p = __append_to_string (p, buffer, *buffersize, codes[code - 1 ]);
1013
- p = __append_to_string (p, buffer, *buffersize, " " );
1017
+ if (( p = __append_to_string (p, buffer, *buffersize, codes[code - 1 ])) == NULL ) return 1 ;
1018
+ if (( p = __append_to_string (p, buffer, *buffersize, " " )) == NULL ) return 1 ;
1014
1019
}
1015
1020
1016
1021
for (int i = 0 ; i < size; ++i) {
1017
1022
#if PY_VERSION_HEX >= 0x02070000
1018
1023
char *str;
1019
1024
str = PyOS_double_to_string (x[i], ' g' , precision, 0 , NULL );
1020
- p = __append_to_string (p, buffer, *buffersize, str);
1025
+ if ((p = __append_to_string (p, buffer, *buffersize, str)) == NULL ) {
1026
+ PyMem_Free (str);
1027
+ return 1 ;
1028
+ }
1021
1029
PyMem_Free (str);
1022
- p = __append_to_string (p, buffer, *buffersize, " " );
1030
+ if (( p = __append_to_string (p, buffer, *buffersize, " " )) == NULL ) return 1 ;
1023
1031
str = PyOS_double_to_string (y[i], ' g' , precision, 0 , NULL );
1024
- p = __append_to_string (p, buffer, *buffersize, str);
1032
+ if ((p = __append_to_string (p, buffer, *buffersize, str)) == NULL ) {
1033
+ PyMem_Free (str);
1034
+ return 1 ;
1035
+ }
1025
1036
PyMem_Free (str);
1026
- p = __append_to_string (p, buffer, *buffersize, " " );
1037
+ if (( p = __append_to_string (p, buffer, *buffersize, " " )) == NULL ) return 1 ;
1027
1038
#else
1028
1039
char str[64 ];
1029
1040
PyOS_ascii_formatd (str, 64 , format, x[i]);
1030
- p = __append_to_string (p, buffer, *buffersize, str);
1041
+ if (( p = __append_to_string (p, buffer, *buffersize, str)) == NULL ) return 1 ;
1031
1042
p = __append_to_string (p, buffer, *buffersize, " " );
1032
1043
PyOS_ascii_formatd (str, 64 , format, y[i]);
1033
- p = __append_to_string (p, buffer, *buffersize, str);
1034
- p = __append_to_string (p, buffer, *buffersize, " " );
1044
+ if (( p = __append_to_string (p, buffer, *buffersize, str)) == NULL ) return 1 ;
1045
+ if (( p = __append_to_string (p, buffer, *buffersize, " " )) == NULL ) return 1 ;
1035
1046
#endif
1036
1047
}
1037
1048
1038
1049
if (postfix) {
1039
- p = __append_to_string (p, buffer, *buffersize, codes[code - 1 ]);
1050
+ if (( p = __append_to_string (p, buffer, *buffersize, codes[code - 1 ])) == NULL ) return 1 ;
1040
1051
}
1041
1052
1042
1053
last_x = x[size - 1 ];
1043
1054
last_y = y[size - 1 ];
1044
1055
}
1045
1056
1046
- p = __append_to_string (p, buffer, *buffersize, " \n " );
1057
+ if (( p = __append_to_string (p, buffer, *buffersize, " \n " )) == NULL ) return 1 ;
1047
1058
}
1048
1059
1049
1060
*p = ' \0 ' ;
1050
1061
*buffersize = p - buffer;
1062
+
1063
+ return 0 ;
1051
1064
}
1052
1065
1053
1066
template <class PathIterator >
1054
- void convert_to_string (PathIterator &path,
1055
- agg::trans_affine &trans,
1056
- agg::rect_d &clip_rect,
1057
- bool simplify,
1058
- SketchParams sketch_params,
1059
- int precision,
1060
- char **codes,
1061
- bool postfix,
1062
- char *buffer,
1063
- size_t *buffersize)
1067
+ int convert_to_string (PathIterator &path,
1068
+ agg::trans_affine &trans,
1069
+ agg::rect_d &clip_rect,
1070
+ bool simplify,
1071
+ SketchParams sketch_params,
1072
+ int precision,
1073
+ char **codes,
1074
+ bool postfix,
1075
+ char *buffer,
1076
+ size_t *buffersize)
1064
1077
{
1065
1078
typedef agg::conv_transform<py::PathIterator> transformed_path_t ;
1066
1079
typedef PathNanRemover<transformed_path_t > nan_removal_t ;
@@ -1077,11 +1090,11 @@ void convert_to_string(PathIterator &path,
1077
1090
simplify_t simplified (clipped, simplify, path.simplify_threshold ());
1078
1091
1079
1092
if (sketch_params.scale == 0.0 ) {
1080
- __convert_to_string (simplified, precision, codes, postfix, buffer, buffersize);
1093
+ return __convert_to_string (simplified, precision, codes, postfix, buffer, buffersize);
1081
1094
} else {
1082
1095
curve_t curve (simplified);
1083
1096
sketch_t sketch (curve, sketch_params.scale , sketch_params.length , sketch_params.randomness );
1084
- __convert_to_string (sketch, precision, codes, postfix, buffer, buffersize);
1097
+ return __convert_to_string (sketch, precision, codes, postfix, buffer, buffersize);
1085
1098
}
1086
1099
1087
1100
}
0 commit comments