mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-31 01:10:16 +01:00
virgl: Fix a strict-aliasing violation in the encoder
As per the C spec, it is illegal to alias pointers to different types. This results in undefined behaviour after optimization passes, resulting in very subtle bugs that happen only on a full moon.. Use a memcpy() as a well defined coercion between the double to uint64_t interpretations of the memory. V.2: Use static_assert() instead of assert(). V.3: Use C99 compat STATIC_ASSERT() over C11 static_assert(). Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net> Acked-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
35c5a9a64d
commit
5e6b2b05a5
1 changed files with 7 additions and 1 deletions
|
|
@ -21,6 +21,8 @@
|
|||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_memory.h"
|
||||
|
|
@ -315,12 +317,16 @@ int virgl_encode_clear(struct virgl_context *ctx,
|
|||
double depth, unsigned stencil)
|
||||
{
|
||||
int i;
|
||||
uint64_t qword;
|
||||
|
||||
STATIC_ASSERT(sizeof(qword) == sizeof(depth));
|
||||
memcpy(&qword, &depth, sizeof(qword));
|
||||
|
||||
virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_CLEAR, 0, VIRGL_OBJ_CLEAR_SIZE));
|
||||
virgl_encoder_write_dword(ctx->cbuf, buffers);
|
||||
for (i = 0; i < 4; i++)
|
||||
virgl_encoder_write_dword(ctx->cbuf, color->ui[i]);
|
||||
virgl_encoder_write_qword(ctx->cbuf, *(uint64_t *)&depth);
|
||||
virgl_encoder_write_qword(ctx->cbuf, qword);
|
||||
virgl_encoder_write_dword(ctx->cbuf, stencil);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue