From: Kevin Wolf <kwolf@redhat.com>
To: Amjad Alsharafi <amjadsharafi10@gmail.com>
Cc: qemu-devel@nongnu.org, Hanna Reitz <hreitz@redhat.com>,
"open list:vvfat" <qemu-block@nongnu.org>
Subject: Re: [PATCH v6 4/5] vvfat: Fix reading files with non-continuous clusters
Date: Mon, 5 Aug 2024 12:22:13 +0200 [thread overview]
Message-ID: <ZrCn1Sn64slzK4-m@redhat.com> (raw)
In-Reply-To: <1f3ea115779abab62ba32c788073cdc99f9ad5dd.1721470238.git.amjadsharafi10@gmail.com>
Am 20.07.2024 um 12:13 hat Amjad Alsharafi geschrieben:
> When reading with `read_cluster` we get the `mapping` with
> `find_mapping_for_cluster` and then we call `open_file` for this
> mapping.
> The issue appear when its the same file, but a second cluster that is
> not immediately after it, imagine clusters `500 -> 503`, this will give
> us 2 mappings one has the range `500..501` and another `503..504`, both
> point to the same file, but different offsets.
>
> When we don't open the file since the path is the same, we won't assign
> `s->current_mapping` and thus accessing way out of bound of the file.
>
> From our example above, after `open_file` (that didn't open anything) we
> will get the offset into the file with
> `s->cluster_size*(cluster_num-s->current_mapping->begin)`, which will
> give us `0x2000 * (504-500)`, which is out of bound for this mapping and
> will produce some issues.
>
> Signed-off-by: Amjad Alsharafi <amjadsharafi10@gmail.com>
> ---
> block/vvfat.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/block/vvfat.c b/block/vvfat.c
> index b63ac5d045..d2b879705e 100644
> --- a/block/vvfat.c
> +++ b/block/vvfat.c
> @@ -1360,15 +1360,17 @@ static int open_file(BDRVVVFATState* s,mapping_t* mapping)
> {
> if(!mapping)
> return -1;
> - if(!s->current_mapping ||
> - strcmp(s->current_mapping->path,mapping->path)) {
> + if (s->current_mapping != mapping) {
> /* open file */
> int fd = qemu_open_old(mapping->path,
> - O_RDONLY | O_BINARY | O_LARGEFILE);
> - if(fd<0)
> + O_RDONLY | O_BINARY | O_LARGEFILE);
> + if (fd < 0) {
> return -1;
> + }
> vvfat_close_current_file(s);
> +
> s->current_fd = fd;
> + assert(s->current_fd);
> s->current_mapping = mapping;
> }
> return 0;
Now we're reopening the file even if the mapping is actually referring
to the same file that was already open. So the result should be correct,
but wasteful in what is probably a common case.
However, this version of the patch simplified things enough that I think
I finally see what we really want:
diff --git a/block/vvfat.c b/block/vvfat.c
index e3a83fbc88..8ffe8b3b9b 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -1369,8 +1369,9 @@ static int open_file(BDRVVVFATState* s,mapping_t* mapping)
return -1;
vvfat_close_current_file(s);
s->current_fd = fd;
- s->current_mapping = mapping;
}
+
+ s->current_mapping = mapping;
return 0;
}
That should be all that is needed, and it passes your test case.
I don't usually do this, but since time is running out for QEMU 9.1,
I'll just replace the code of this patch with the above and go ahead
with that. If you think it's wrong, let me know and we'll fix it on top
of this series.
Kevin
next prev parent reply other threads:[~2024-08-05 10:22 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-20 10:13 [PATCH v6 0/5] vvfat: Fix write bugs for large files and add iotests Amjad Alsharafi
2024-07-20 10:13 ` [PATCH v6 1/5] vvfat: Fix bug in writing to middle of file Amjad Alsharafi
2024-07-20 10:13 ` [PATCH v6 2/5] vvfat: Fix usage of `info.file.offset` Amjad Alsharafi
2024-07-20 10:13 ` [PATCH v6 3/5] vvfat: Fix wrong checks for cluster mappings invariant Amjad Alsharafi
2024-07-20 10:13 ` [PATCH v6 4/5] vvfat: Fix reading files with non-continuous clusters Amjad Alsharafi
2024-08-05 10:22 ` Kevin Wolf [this message]
2024-08-09 4:35 ` Amjad Alsharafi
2024-07-20 10:13 ` [PATCH v6 5/5] iotests: Add `vvfat` tests Amjad Alsharafi
2024-08-05 10:24 ` [PATCH v6 0/5] vvfat: Fix write bugs for large files and add iotests Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZrCn1Sn64slzK4-m@redhat.com \
--to=kwolf@redhat.com \
--cc=amjadsharafi10@gmail.com \
--cc=hreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).