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:
Corentin Noël 2025-05-05 15:27:25 +02:00 committed by Marge Bot
parent 5bec582e30
commit 11a7b112cb
3 changed files with 62 additions and 61 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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