fix use_buffers checks

We can set 0 buffers even if there is no format.
Return -ENOSPC when too many buffers are set.
This commit is contained in:
Wim Taymans 2023-01-10 12:30:25 +01:00
parent 9f3237b74e
commit 97aafe2234
31 changed files with 146 additions and 88 deletions

View file

@ -46,6 +46,7 @@
#define M_PI_M2 ( M_PI + M_PI )
#define BUFFER_SAMPLES 128
#define MAX_BUFFERS 32
struct buffer {
uint32_t id;
@ -79,7 +80,7 @@ struct data {
struct spa_audio_info_raw format;
struct buffer buffers[32];
struct buffer buffers[MAX_BUFFERS];
uint32_t n_buffers;
struct spa_list empty;
@ -325,6 +326,9 @@ static int impl_port_use_buffers(void *object,
struct data *d = object;
uint32_t i;
if (n_buffers > MAX_BUFFERS)
return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &d->buffers[i];
struct spa_data *datas = buffers[i]->datas;

View file

@ -34,6 +34,7 @@
#define WIDTH 640
#define HEIGHT 480
#define BPP 3
#define MAX_BUFFERS 32
#include "sdl.h"
@ -68,7 +69,7 @@ struct data {
struct spa_video_info_raw format;
int32_t stride;
struct spa_buffer *buffers[32];
struct spa_buffer *buffers[MAX_BUFFERS];
int n_buffers;
struct pw_proxy *out, *in, *link;
@ -264,6 +265,9 @@ static int impl_port_use_buffers(void *object,
struct data *d = object;
uint32_t i;
if (n_buffers > MAX_BUFFERS)
return -ENOSPC;
for (i = 0; i < n_buffers; i++)
d->buffers[i] = buffers[i];
d->n_buffers = n_buffers;

View file

@ -754,7 +754,6 @@ do_port_use_buffers(struct impl *impl,
if (n_buffers > MAX_BUFFERS)
return -ENOSPC;
spa_log_debug(this->log, "%p: %s port %d.%d use buffers %p %u flags:%08x", this,
direction == SPA_DIRECTION_INPUT ? "input" : "output",
port_id, mix_id, buffers, n_buffers, flags);

View file

@ -885,16 +885,19 @@ static int impl_port_use_buffers(void *object,
pw_log_debug("%p: port:%d.%d buffers:%u disconnecting:%d", impl,
direction, port_id, n_buffers, impl->disconnecting);
if ((port = get_port(impl, direction, port_id)) == NULL)
return -EINVAL;
if (impl->disconnecting && n_buffers > 0)
return -EIO;
if ((port = get_port(impl, direction, port_id)) == NULL)
return -EINVAL;
clear_buffers(port);
impl_flags = port->flags;
prot = PROT_READ | (direction == SPA_DIRECTION_OUTPUT ? PROT_WRITE : 0);
clear_buffers(port);
if (n_buffers > MAX_BUFFERS)
return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
int buf_size = 0;

View file

@ -922,13 +922,13 @@ static int impl_port_use_buffers(void *object,
if (impl->disconnecting && n_buffers > 0)
return -EIO;
if (n_buffers > MAX_BUFFERS)
return -EINVAL;
prot = PROT_READ | (direction == SPA_DIRECTION_OUTPUT ? PROT_WRITE : 0);
clear_buffers(stream);
if (n_buffers > MAX_BUFFERS)
return -ENOSPC;
for (i = 0; i < n_buffers; i++) {
int buf_size = 0;
struct buffer *b = &impl->buffers[i];