aboutsummaryrefslogtreecommitdiff
path: root/servers/visual/visual_server_canvas.cpp
diff options
context:
space:
mode:
authorrobfram2018-03-19 19:22:38 +0100
committerHein-Pieter van Braam2018-04-28 17:45:25 +0200
commit3cc2eee4e80564cb802217ba4930ce5c24d6db9a (patch)
tree304f2dbb623980fa842f085238927d9c39de4eb6 /servers/visual/visual_server_canvas.cpp
parent56395b03e10a9f5afc4023f0c1c669d89e6a649f (diff)
downloadgodot-3cc2eee4e80564cb802217ba4930ce5c24d6db9a.tar.gz
godot-3cc2eee4e80564cb802217ba4930ce5c24d6db9a.tar.zst
godot-3cc2eee4e80564cb802217ba4930ce5c24d6db9a.zip
Fix crash in `canvas_item_add_polyline` when passing more points than colors
When `p_points.size() > p_colors.size()`, it crashed with invalid array access to `p_colors`. Also, when `p_colors` was an empty `Vector` it crashed due a missing `else` checking the `size` condition, as the code handling that special case exists. This PR fixes the missing `else` for `p_colors.size == 0` and, following the `canvas_item_add_multiline` spirit, it only uses the first color for the whole polyline if points and colors differ in size. Fix #17621. (cherry picked from commit 8eedb2afe2b7e00c6317a30e98a388f78be6ac56)
Diffstat (limited to '')
-rw-r--r--servers/visual/visual_server_canvas.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp
index d82d93a59..2f3746980 100644
--- a/servers/visual/visual_server_canvas.cpp
+++ b/servers/visual/visual_server_canvas.cpp
@@ -440,13 +440,17 @@ void VisualServerCanvas::canvas_item_add_polyline(RID p_item, const Vector<Point
if (p_antialiased) {
pline->line_colors.push_back(Color(1, 1, 1, 1));
}
- }
- if (p_colors.size() == 1) {
+ } else if (p_colors.size() == 1) {
pline->triangle_colors = p_colors;
pline->line_colors = p_colors;
} else {
- pline->triangle_colors.resize(pline->triangles.size());
- pline->line_colors.resize(pline->lines.size());
+ if (p_colors.size() != p_points.size()) {
+ pline->triangle_colors.push_back(p_colors[0]);
+ pline->line_colors.push_back(p_colors[0]);
+ } else {
+ pline->triangle_colors.resize(pline->triangles.size());
+ pline->line_colors.resize(pline->lines.size());
+ }
}
for (int i = 0; i < p_points.size(); i++) {