vvfat: Fix wrong checks for cluster mappings invariant
How this `abort` was intended to check for was: - if the `mapping->first_mapping_index` is not the same as `first_mapping_index`, which **should** happen only in one case, when we are handling the first mapping, in that case `mapping->first_mapping_index == -1`, in all other cases, the other mappings after the first should have the condition `true`. - From above, we know that this is the first mapping, so if the offset is not `0`, then abort, since this is an invalid state. The issue was that `first_mapping_index` is not set if we are checking from the middle, the variable `first_mapping_index` is only set if we passed through the check `cluster_was_modified` with the first mapping, and in the same function call we checked the other mappings. One approach is to go into the loop even if `cluster_was_modified` is not true so that we will be able to set `first_mapping_index` for the first mapping, but since `first_mapping_index` is only used here, another approach is to just check manually for the `mapping->first_mapping_index != -1` since we know that this is the value for the only entry where `offset == 0` (i.e. first mapping). Signed-off-by: Amjad Alsharafi <amjadsharafi10@gmail.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <b0fbca3ee208c565885838f6a7deeaeb23f4f9c2.1721470238.git.amjadsharafi10@gmail.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
21b25a0e46
commit
f60a6f7e17
@ -1880,7 +1880,6 @@ get_cluster_count_for_direntry(BDRVVVFATState* s, direntry_t* direntry, const ch
|
||||
|
||||
uint32_t cluster_num = begin_of_direntry(direntry);
|
||||
uint32_t offset = 0;
|
||||
int first_mapping_index = -1;
|
||||
mapping_t* mapping = NULL;
|
||||
const char* basename2 = NULL;
|
||||
|
||||
@ -1942,14 +1941,9 @@ get_cluster_count_for_direntry(BDRVVVFATState* s, direntry_t* direntry, const ch
|
||||
|
||||
if (strcmp(basename, basename2))
|
||||
copy_it = 1;
|
||||
first_mapping_index = array_index(&(s->mapping), mapping);
|
||||
}
|
||||
|
||||
if (mapping->first_mapping_index != first_mapping_index
|
||||
&& mapping->info.file.offset > 0) {
|
||||
abort();
|
||||
copy_it = 1;
|
||||
}
|
||||
assert(mapping->first_mapping_index == -1
|
||||
|| mapping->info.file.offset > 0);
|
||||
|
||||
/* need to write out? */
|
||||
if (!was_modified && is_file(direntry)) {
|
||||
|
Loading…
Reference in New Issue
Block a user