mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
vtest: Be more resilient when a resource creation has failed
Do not override the handle number with 0 if we fail to create a new resource. Also make sure to store the handle consistently in an uint32_t. CID: 1644460 Overflowed constant Signed-off-by: Corentin Noël <corentin.noel@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34816>
This commit is contained in:
parent
5bec582e30
commit
11a7b112cb
3 changed files with 62 additions and 61 deletions
|
|
@ -285,19 +285,19 @@ int virgl_vtest_send_get_caps(struct virgl_vtest_winsys *vws,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int virgl_vtest_send_resource_create2(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
uint32_t bind,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t depth,
|
||||
uint32_t array_size,
|
||||
uint32_t last_level,
|
||||
uint32_t nr_samples,
|
||||
uint32_t size,
|
||||
int *out_fd)
|
||||
static uint32_t virgl_vtest_send_resource_create2(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
uint32_t bind,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t depth,
|
||||
uint32_t array_size,
|
||||
uint32_t last_level,
|
||||
uint32_t nr_samples,
|
||||
uint32_t size,
|
||||
int *out_fd)
|
||||
{
|
||||
uint32_t res_create_buf[VCMD_RES_CREATE2_SIZE], vtest_hdr[VTEST_HDR_SIZE];
|
||||
|
||||
|
|
@ -333,25 +333,25 @@ static int virgl_vtest_send_resource_create2(struct virgl_vtest_winsys *vws,
|
|||
*out_fd = virgl_vtest_receive_fd(vws->sock_fd);
|
||||
if (*out_fd < 0) {
|
||||
fprintf(stderr, "failed to get fd\n");
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
int virgl_vtest_send_resource_create(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
uint32_t bind,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t depth,
|
||||
uint32_t array_size,
|
||||
uint32_t last_level,
|
||||
uint32_t nr_samples,
|
||||
uint32_t size,
|
||||
int *out_fd)
|
||||
uint32_t virgl_vtest_send_resource_create(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
uint32_t bind,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t depth,
|
||||
uint32_t array_size,
|
||||
uint32_t last_level,
|
||||
uint32_t nr_samples,
|
||||
uint32_t size,
|
||||
int *out_fd)
|
||||
{
|
||||
uint32_t res_create_buf[VCMD_RES_CREATE_SIZE], vtest_hdr[VTEST_HDR_SIZE];
|
||||
|
||||
|
|
@ -561,10 +561,10 @@ int virgl_vtest_busy_wait(struct virgl_vtest_winsys *vws, int handle,
|
|||
return result[0];
|
||||
}
|
||||
|
||||
int
|
||||
uint32_t
|
||||
virgl_vtest_send_create_blob(struct virgl_vtest_winsys *vws,
|
||||
uint32_t size, uint32_t blob_id,
|
||||
int *out_fd)
|
||||
uint32_t size, uint32_t blob_id,
|
||||
int *out_fd)
|
||||
{
|
||||
uint32_t vtest_hdr[VTEST_HDR_SIZE];
|
||||
vtest_hdr[VTEST_CMD_LEN] = VCMD_RES_CREATE_BLOB_SIZE;
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ static void virgl_vtest_resource_reference(struct virgl_winsys *vws,
|
|||
*dres = sres;
|
||||
}
|
||||
|
||||
static int
|
||||
static uint32_t
|
||||
virgl_vtest_winsys_resource_create_blob(struct virgl_winsys *vws,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
|
|
@ -277,7 +277,8 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
|
|||
{
|
||||
struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
|
||||
struct virgl_hw_res *res;
|
||||
static int handle = 1;
|
||||
static uint32_t handle = 1;
|
||||
uint32_t new_handle = handle;
|
||||
int fd = -1;
|
||||
struct virgl_resource_params params = { .size = size,
|
||||
.bind = bind,
|
||||
|
|
@ -312,22 +313,22 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
|
|||
VIRGL_RESOURCE_FLAG_MAP_COHERENT))) {
|
||||
width = ALIGN(width, getpagesize());
|
||||
size = ALIGN(size, getpagesize());
|
||||
handle = virgl_vtest_winsys_resource_create_blob(vws, target, format, bind,
|
||||
width, height, depth,
|
||||
array_size, last_level, nr_samples,
|
||||
flags, size, &fd);
|
||||
|
||||
if (handle) {
|
||||
pipe_reference_init(&res->reference, 1);
|
||||
p_atomic_set(&res->num_cs_references, 0);
|
||||
}
|
||||
new_handle = virgl_vtest_winsys_resource_create_blob(vws, target, format, bind,
|
||||
width, height, depth,
|
||||
array_size, last_level, nr_samples,
|
||||
flags, size, &fd);
|
||||
} else {
|
||||
|
||||
handle = virgl_vtest_send_resource_create(vtws, handle, target, pipe_to_virgl_format(format), bind,
|
||||
width, height, depth, array_size,
|
||||
last_level, nr_samples, size, &fd);
|
||||
new_handle = virgl_vtest_send_resource_create(vtws, new_handle, target, pipe_to_virgl_format(format), bind,
|
||||
width, height, depth, array_size,
|
||||
last_level, nr_samples, size, &fd);
|
||||
}
|
||||
|
||||
if (new_handle == 0) {
|
||||
FREE(res);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
handle = new_handle;
|
||||
res->bind = bind;
|
||||
res->format = format;
|
||||
res->height = height;
|
||||
|
|
@ -337,7 +338,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
|
|||
if (vtws->protocol_version >= 2) {
|
||||
if (res->size == 0) {
|
||||
res->ptr = NULL;
|
||||
res->res_handle = handle;
|
||||
res->res_handle = new_handle;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -360,7 +361,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
|
|||
close(fd);
|
||||
}
|
||||
|
||||
res->res_handle = handle;
|
||||
res->res_handle = new_handle;
|
||||
if (map_front_private && res->ptr && res->dt) {
|
||||
void *dt_map = vtws->sws->displaytarget_map(vtws->sws, res->dt, PIPE_MAP_READ_WRITE);
|
||||
uint32_t shm_stride = util_format_get_stride(res->format, res->width);
|
||||
|
|
|
|||
|
|
@ -105,19 +105,19 @@ int virgl_vtest_connect(struct virgl_vtest_winsys *vws);
|
|||
int virgl_vtest_send_get_caps(struct virgl_vtest_winsys *vws,
|
||||
struct virgl_drm_caps *caps);
|
||||
|
||||
int virgl_vtest_send_resource_create(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
uint32_t bind,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t depth,
|
||||
uint32_t array_size,
|
||||
uint32_t last_level,
|
||||
uint32_t nr_samples,
|
||||
uint32_t size,
|
||||
int *out_fd);
|
||||
uint32_t virgl_vtest_send_resource_create(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle,
|
||||
enum pipe_texture_target target,
|
||||
uint32_t format,
|
||||
uint32_t bind,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t depth,
|
||||
uint32_t array_size,
|
||||
uint32_t last_level,
|
||||
uint32_t nr_samples,
|
||||
uint32_t size,
|
||||
int *out_fd);
|
||||
|
||||
int virgl_vtest_send_resource_unref(struct virgl_vtest_winsys *vws,
|
||||
uint32_t handle);
|
||||
|
|
@ -154,7 +154,7 @@ int virgl_vtest_recv_transfer_get_data(struct virgl_vtest_winsys *vws,
|
|||
int virgl_vtest_busy_wait(struct virgl_vtest_winsys *vws, int handle,
|
||||
int flags);
|
||||
|
||||
int
|
||||
uint32_t
|
||||
virgl_vtest_send_create_blob(struct virgl_vtest_winsys *vws,
|
||||
uint32_t size, uint32_t blob_id, int *fd);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue