Messages in this thread | | | Subject | Re: [PATCH 1/2] exfat: add dir-entry set checksum validation | From | Tetsuhiro Kohada <> | Date | Thu, 13 Aug 2020 00:17:05 +0900 |
| |
Thnak you for your reply.
>> -void exfat_update_dir_chksum_with_entry_set(struct exfat_entry_set_cache *es) >> +static int exfat_calc_dir_chksum_with_entry_set(struct >> +exfat_entry_set_cache *es, u16 *chksum) >> { >> - int chksum_type = CS_DIR_ENTRY, i; >> - unsigned short chksum = 0; >> struct exfat_dentry *ep; >> + int i; >> >> - for (i = 0; i < es->num_entries; i++) { >> - ep = exfat_get_validated_dentry(es, i, TYPE_ALL); >> - chksum = exfat_calc_chksum16(ep, DENTRY_SIZE, chksum, >> - chksum_type); >> - chksum_type = CS_DEFAULT; >> + ep = container_of(es->de_file, struct exfat_dentry, dentry.file); >> + *chksum = exfat_calc_chksum16(ep, DENTRY_SIZE, 0, CS_DIR_ENTRY); >> + for (i = 0; i < es->de_file->num_ext; i++) { >> + ep = exfat_get_validated_dentry(es, 1 + i, TYPE_SECONDARY); >> + if (!ep) >> + return -EIO; >> + *chksum = exfat_calc_chksum16(ep, DENTRY_SIZE, *chksum, CS_DEFAULT); >> } >> + return 0; > We can return checksum after removing u16 *chksum argument.
I want to do that too! How should I return the error?
Right now, I found that the type of chksum is not 'u16'. I'll fix in v2.
>> +} >> + >> +void exfat_update_dir_chksum_with_entry_set(struct >> +exfat_entry_set_cache *es) { >> + u16 chksum; >> + >> + exfat_calc_dir_chksum_with_entry_set(es, &chksum); >> es->de_file->checksum = cpu_to_le16(chksum); >> es->modified = true; >> } >> @@ -775,6 +784,7 @@ struct exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, >> struct exfat_entry_set_cache *es; >> struct exfat_dentry *ep; >> struct buffer_head *bh; >> + u16 chksum; >> >> if (p_dir->dir == DIR_DELETED) { >> exfat_err(sb, "access to deleted dentry"); @@ -839,10 +849,10 @@ struct >> exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, >> goto free_es; >> es->de_stream = &ep->dentry.stream; >> >> - for (i = 2; i < es->num_entries; i++) { >> - if (!exfat_get_validated_dentry(es, i, TYPE_SECONDARY)) >> - goto free_es; >> - } >> + if (max_entries == ES_ALL_ENTRIES && >> + ((exfat_calc_dir_chksum_with_entry_set(es, &chksum) || >> + chksum != le16_to_cpu(es->de_file->checksum)))) > Please add error print log if checksum mismatch error happen.
OK. I'll add in v2.
BR --- Tetsuhiro Kohada <kohada.t2@gmail.com>
| |