diff options
author | Filip Gawin <filip.gawin@collabora.com> | 2023-09-12 11:54:27 +0200 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-09-19 06:36:44 +0000 |
commit | 6e9bd8a0995982113e3a94280acdf4beb869b89d (patch) | |
tree | 7e52a1a836c2870d79dd6772fafba9f47ceb62a3 | |
parent | c4a53646c57aa94dc7b3e95c6b27367bad8a5b82 (diff) |
vrend/decode: refactor parameters check in create_vertex_elements
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1232>
-rw-r--r-- | src/vrend_decode.c | 3 | ||||
-rw-r--r-- | src/vrend_renderer.c | 3 | ||||
-rw-r--r-- | tests/test_virgl_cmd.c | 40 |
3 files changed, 43 insertions, 3 deletions
diff --git a/src/vrend_decode.c b/src/vrend_decode.c index 5d1a21e..5073d32 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -727,6 +727,9 @@ static int vrend_decode_create_ve(struct vrend_context *ctx, const uint32_t *buf num_elements = (length - 1) / 4; + if (num_elements > PIPE_MAX_ATTRIBS) + return EINVAL; + if (num_elements) { ve = calloc(num_elements, sizeof(struct pipe_vertex_element)); diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 8e325f0..3959394 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -3265,9 +3265,6 @@ int vrend_create_vertex_elements_state(struct vrend_context *ctx, uint i; uint32_t ret_handle; - if (num_elements > PIPE_MAX_ATTRIBS) - return EINVAL; - v = CALLOC_STRUCT(vrend_vertex_element_array); if (!v) return ENOMEM; diff --git a/tests/test_virgl_cmd.c b/tests/test_virgl_cmd.c index 88fdeea..8f152cf 100644 --- a/tests/test_virgl_cmd.c +++ b/tests/test_virgl_cmd.c @@ -1308,6 +1308,44 @@ START_TEST(virgl_test_create_surface_fail_format) } END_TEST +static void test_vertex_elements(int ve_num, int expected_error) +{ + struct virgl_context ctx; + struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS+1]; + + int ret; + + ret = testvirgl_init_ctx_cmdbuf(&ctx); + ck_assert_int_eq(ret, 0); + + /* create vertex elements */ + memset(ve, 0, sizeof(ve)); + + for (int i = 0; i < ve_num;i++) { + ve[i].src_offset = sizeof(float[4])* i; + ve[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; + } + + virgl_encoder_create_vertex_elements(&ctx, 2000, ve_num, ve); + + ret = testvirgl_ctx_send_cmdbuf(&ctx); + ck_assert_int_eq(ret, expected_error); + + testvirgl_fini_ctx_cmdbuf(&ctx); +} + +START_TEST(virgl_test_create_vertex_elements_pass) +{ + test_vertex_elements(PIPE_MAX_ATTRIBS, 0); +} +END_TEST + +START_TEST(virgl_test_create_vertex_elements_fail) +{ + test_vertex_elements(PIPE_MAX_ATTRIBS + 1, EINVAL); +} +END_TEST + static Suite *virgl_init_suite(void) { Suite *s; @@ -1329,6 +1367,8 @@ static Suite *virgl_init_suite(void) tcase_add_test(tc_core, virgl_test_encode_sampler_view); tcase_add_test(tc_core, virgl_test_create_surface_pass); tcase_add_test(tc_core, virgl_test_create_surface_fail_format); + tcase_add_test(tc_core, virgl_test_create_vertex_elements_pass); + tcase_add_test(tc_core, virgl_test_create_vertex_elements_fail); suite_add_tcase(s, tc_core); return s; |