[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PULL v2 01/16] qemu-io: add pattern file for write com
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [PULL v2 01/16] qemu-io: add pattern file for write command |
Date: |
Tue, 10 Sep 2019 09:19:57 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 |
On 09.09.19 19:26, Peter Maydell wrote:
> On Tue, 3 Sep 2019 at 14:35, Max Reitz <address@hidden> wrote:
>>
>> From: Denis Plotnikov <address@hidden>
>>
>> The patch allows to provide a pattern file for write
>> command. There was no similar ability before.
>>
>> Signed-off-by: Denis Plotnikov <address@hidden>
>> Message-id: address@hidden
>> Reviewed-by: Eric Blake <address@hidden>
>> [mreitz: Keep optstring in alphabetical order]
>> Signed-off-by: Max Reitz <address@hidden>
>
> Hi; Coverity finds a FILE* leak in this code (CID 1405303):
Thanks for the heads-up. Denis, do you want to write a patch?
Max
>> +/*
>> + * qemu_io_alloc_from_file()
>> + *
>> + * Allocates the buffer and populates it with the content of the given file
>> + * up to @len bytes. If the file length is less than @len, then the buffer
>> + * is populated with the file content cyclically.
>> + *
>> + * @blk - the block backend where the buffer content is going to be written
>> to
>> + * @len - the buffer length
>> + * @file_name - the file to read the content from
>> + *
>> + * Returns: the buffer pointer on success
>> + * NULL on error
>> + */
>> +static void *qemu_io_alloc_from_file(BlockBackend *blk, size_t len,
>> + const char *file_name)
>> +{
>> + char *buf, *buf_origin;
>> + FILE *f = fopen(file_name, "r");
>
> Here we allocate the FILE*...
>
>> + int pattern_len;
>> +
>> + if (!f) {
>> + perror(file_name);
>> + return NULL;
>> + }
>> +
>> + if (qemuio_misalign) {
>> + len += MISALIGN_OFFSET;
>> + }
>> +
>> + buf_origin = buf = blk_blockalign(blk, len);
>> +
>> + if (qemuio_misalign) {
>> + buf_origin += MISALIGN_OFFSET;
>> + buf += MISALIGN_OFFSET;
>> + len -= MISALIGN_OFFSET;
>> + }
>> +
>> + pattern_len = fread(buf_origin, 1, len, f);
>> +
>> + if (ferror(f)) {
>> + perror(file_name);
>> + goto error;
>
> ...but in this error-exit path...
>
>> + }
>> +
>> + if (pattern_len == 0) {
>> + fprintf(stderr, "%s: file is empty\n", file_name);
>> + goto error;
>
> ...and this one...
>
>> + }
>> +
>> + fclose(f);
>> +
>> + if (len > pattern_len) {
>> + len -= pattern_len;
>> + buf += pattern_len;
>> +
>> + while (len > 0) {
>> + size_t len_to_copy = MIN(pattern_len, len);
>> +
>> + memcpy(buf, buf_origin, len_to_copy);
>> +
>> + len -= len_to_copy;
>> + buf += len_to_copy;
>> + }
>> + }
>> +
>> + return buf_origin;
>> +
>> +error:
>> + qemu_io_free(buf_origin);
>> + return NULL;
>
> ...we go to the 'error' label and leave the function without
> ever calling fclose(f).
>
>> +}
>
> thanks
> -- PMM
>
signature.asc
Description: OpenPGP digital signature
[Qemu-block] [PULL v2 02/16] block: fix permission update in bdrv_replace_node, Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 03/16] block: posix: Always allocate the first block, Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 04/16] iotests: Test allocate_first_block() with O_DIRECT, Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 05/16] iotests: Fix _filter_img_create(), Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 07/16] iotests: Keep testing broken relative extent paths, Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 08/16] vmdk: Reject invalid compressed writes, Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 06/16] vmdk: Use bdrv_dirname() for relative extent paths, Max Reitz, 2019/09/03
[Qemu-block] [PULL v2 09/16] iotests: Disable broken streamOptimized tests, Max Reitz, 2019/09/03