Fix OOB write in matrix constructor
authorShahbaz Youssefi <shabbyx@gmail.com>
Thu, 3 Jun 2021 17:42:57 +0000 (13:42 -0400)
committerShahbaz Youssefi <shabbyx@gmail.com>
Thu, 3 Jun 2021 17:42:57 +0000 (13:42 -0400)
commitcfdeeb842d9a4df801587f5aaddc6f76c0d56ac7
tree013ae62d3a19f19ada2b7e17a23d3bea44c28a65
parent6bdcb4be344d7903bd92fd464e496c3199b91484
Fix OOB write in matrix constructor

In a matrix constructor that takes a number of components, as many
components as necessary must be taken, with the rest discarded, as GLSL
allows more components than necessary to be specified.  For example, the
following:

    mat4 m4 = mat4(v4, v4.yzwx, v4.zwx, v4.zwxy, v4.wxyz);

is equivalent to:

    mat4 m4 = mat4(v4, v4.yzwx, v4.zwx, v4.zwxy, v4.w);

glslang takes the components from the constructor and builds the single
components of the matrix in a 2D array before constructing the matrix
itself.  It however did not check for extra parameters and was thus
writing OOB to said 2D array.  This is fixed in this change

Signed-off-by: Shahbaz Youssefi <shabbyx@gmail.com>
SPIRV/SpvBuilder.cpp