[Spice-devel] [PATCH v3 3/8] replay: Detect errors from red_replay_data_chunks
Jonathon Jongsma
jjongsma at redhat.com
Tue Sep 20 15:56:09 UTC 2016
On Fri, 2016-09-16 at 12:32 +0100, Frediano Ziglio wrote:
> Change the return to ssize_t to be able to distinguish from
> empty buffer to error.
> Check result returned and avoid continuing potentially
> deferencing NULL pointers.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/red-replay-qxl.c | 37 ++++++++++++++++++++++++++-----------
> 1 file changed, 26 insertions(+), 11 deletions(-)
>
> diff --git a/server/red-replay-qxl.c b/server/red-replay-qxl.c
> index 968a605..a5b9553 100644
> --- a/server/red-replay-qxl.c
> +++ b/server/red-replay-qxl.c
> @@ -279,8 +279,8 @@ static replay_t read_binary(SpiceReplay *replay,
> const char *prefix, size_t *siz
> return replay_fscanf(replay, "\n");
> }
>
> -static size_t red_replay_data_chunks(SpiceReplay *replay, const char
> *prefix,
> - uint8_t **mem, size_t
> base_size)
> +static ssize_t red_replay_data_chunks(SpiceReplay *replay, const
> char *prefix,
> + uint8_t **mem, size_t
> base_size)
> {
> size_t data_size;
> int count_chunks;
> @@ -288,12 +288,15 @@ static size_t
> red_replay_data_chunks(SpiceReplay *replay, const char *prefix,
> QXLDataChunk *cur, *next;
>
> replay_fscanf(replay, "data_chunks %d %zu\n", &count_chunks,
> &data_size);
> + if (replay->error) {
> + return -1;
> + }
Same comment as last patch. I'd personally prefer to check the return
of replay_fscanf() here instead of replay->error.
Otherwise fine.
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
> if (base_size == 0) {
> base_size = sizeof(QXLDataChunk);
> }
>
> if (read_binary(replay, prefix, &next_data_size, mem, base_size)
> == REPLAY_ERROR) {
> - return 0;
> + return -1;
> }
> cur = (QXLDataChunk*)(*mem + base_size - sizeof(QXLDataChunk));
> cur->data_size = next_data_size;
> @@ -302,7 +305,7 @@ static size_t red_replay_data_chunks(SpiceReplay
> *replay, const char *prefix,
> while (count_chunks-- > 0) {
> if (read_binary(replay, prefix, &next_data_size,
> (uint8_t**)&cur->next_chunk,
> sizeof(QXLDataChunk)) == REPLAY_ERROR) {
> - return 0;
> + return -1;
> }
> data_size += next_data_size;
> next = QXLPHYSICAL_TO_PTR(cur->next_chunk);
> @@ -355,9 +358,12 @@ static void red_replay_rect_ptr(SpiceReplay
> *replay, const char *prefix, QXLRect
> static QXLPath *red_replay_path(SpiceReplay *replay)
> {
> QXLPath *qxl = NULL;
> - size_t data_size;
> + ssize_t data_size;
>
> data_size = red_replay_data_chunks(replay, "path",
> (uint8_t**)&qxl, sizeof(QXLPath));
> + if (data_size < 0) {
> + return NULL;
> + }
> qxl->data_size = data_size;
> return qxl;
> }
> @@ -378,7 +384,9 @@ static QXLClipRects
> *red_replay_clip_rects(SpiceReplay *replay)
> if (replay->error) {
> return NULL;
> }
> - red_replay_data_chunks(replay, "clip_rects", (uint8_t**)&qxl,
> sizeof(QXLClipRects));
> + if (red_replay_data_chunks(replay, "clip_rects",
> (uint8_t**)&qxl, sizeof(QXLClipRects)) < 0) {
> + return NULL;
> + }
> qxl->num_rects = num_rects;
> return qxl;
> }
> @@ -399,7 +407,8 @@ static uint8_t
> *red_replay_image_data_flat(SpiceReplay *replay, size_t *size)
> static QXLImage *red_replay_image(SpiceReplay *replay, uint32_t
> flags)
> {
> QXLImage* qxl = NULL;
> - size_t bitmap_size, size;
> + size_t bitmap_size;
> + ssize_t size;
> uint8_t qxl_flags;
> int temp;
> int has_palette;
> @@ -714,13 +723,16 @@ static QXLString *red_replay_string(SpiceReplay
> *replay)
> uint32_t data_size;
> uint16_t length;
> uint16_t flags;
> - size_t chunk_size;
> + ssize_t chunk_size;
> QXLString *qxl = NULL;
>
> replay_fscanf(replay, "data_size %d\n", &data_size);
> replay_fscanf(replay, "length %d\n", &temp); length = temp;
> replay_fscanf(replay, "flags %d\n", &temp); flags = temp;
> chunk_size = red_replay_data_chunks(replay, "string",
> (uint8_t**)&qxl, sizeof(QXLString));
> + if (chunk_size < 0) {
> + return NULL;
> + }
> qxl->data_size = data_size;
> qxl->length = length;
> qxl->flags = flags;
> @@ -1143,6 +1155,7 @@ static QXLCursor *red_replay_cursor(SpiceReplay
> *replay)
> {
> int temp;
> QXLCursor cursor, *qxl = NULL;
> + ssize_t data_size;
>
> replay_fscanf(replay, "header.unique %"SCNu64"\n",
> &cursor.header.unique);
> replay_fscanf(replay, "header.type %d\n", &temp);
> @@ -1160,10 +1173,12 @@ static QXLCursor
> *red_replay_cursor(SpiceReplay *replay)
> if (replay->error) {
> return NULL;
> }
> - cursor.data_size = temp;
> - cursor.data_size = red_replay_data_chunks(replay, "cursor",
> (uint8_t**)&qxl, sizeof(QXLCursor));
> + data_size = red_replay_data_chunks(replay, "cursor",
> (uint8_t**)&qxl, sizeof(QXLCursor));
> + if (data_size < 0) {
> + return NULL;
> + }
> qxl->header = cursor.header;
> - qxl->data_size = cursor.data_size;
> + qxl->data_size = data_size;
> return qxl;
> }
>
More information about the Spice-devel
mailing list