From: Marek Szyprowski Date: Tue, 24 Sep 2019 08:50:34 +0000 (+0200) Subject: fat: write: fix broken write at non-zero file offset X-Git-Tag: submit/tizen/20201110.005738~158 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc28636405524963a831df7f3c09945d19ef26a6;p=platform%2Fkernel%2Fu-boot.git fat: write: fix broken write at non-zero file offset Handling of the start file offset was broken in the current code. Although the code skipped the needed clusters, it then tried to continue write with current cluster set to EOF, what caused assertion. It also lacked adjusting filesize in case of writing at the end of file and adjusting in-cluster offset for partial overwrite. This patch fixes all those issues. Signed-off-by: Marek Szyprowski Change-Id: I24cf908407ef951920291e560db28e603799ae77 --- diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index d7fdc56c82..984fa32372 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -773,14 +773,12 @@ set_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos, __u8 *buffer, /* go to cluster at pos */ cur_pos = bytesperclust; while (1) { + newclust = get_fatent(mydata, curclust); if (pos <= cur_pos) break; - if (IS_LAST_CLUST(curclust, mydata->fatsize)) + if (IS_LAST_CLUST(newclust, mydata->fatsize)) break; - - newclust = get_fatent(mydata, curclust); - if (!IS_LAST_CLUST(newclust, mydata->fatsize) && - CHECK_CLUST(newclust, mydata->fatsize)) { + if (CHECK_CLUST(newclust, mydata->fatsize)) { debug("curclust: 0x%x\n", curclust); debug("Invalid FAT entry\n"); return -1; @@ -789,8 +787,9 @@ set_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos, __u8 *buffer, cur_pos += bytesperclust; curclust = newclust; } - if (IS_LAST_CLUST(curclust, mydata->fatsize)) { + if (IS_LAST_CLUST(newclust, mydata->fatsize)) { assert(pos == cur_pos); + filesize -= pos; goto set_clusters; }