From patchwork Tue Nov 26 08:15:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 1200799 X-Patchwork-Delegate: matthias.bgg@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="kCpi9Gdb"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47McHM2RjLz9sP3 for ; Tue, 26 Nov 2019 19:18:39 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 0235CC21F60; Tue, 26 Nov 2019 08:17:15 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 533B7C21F47; Tue, 26 Nov 2019 08:15:50 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id AB20FC21E44; Tue, 26 Nov 2019 08:15:46 +0000 (UTC) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by lists.denx.de (Postfix) with ESMTPS id E05C0C21E44 for ; Tue, 26 Nov 2019 08:15:45 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20191126081544euoutp01f68978de1d2815ba6321bc54097b8ff0~aqF7VOSsE1143911439euoutp01b for ; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20191126081544euoutp01f68978de1d2815ba6321bc54097b8ff0~aqF7VOSsE1143911439euoutp01b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1574756145; bh=lj/TlBtbTUIfR+Stavin/wiUU+RR+E9ceKfSmTuexgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kCpi9GdbqCJ+9E/Qb1WylCrSyLvvEWSPe9OWh7r7xSMZ4oF2W6ND8Rqz+mOnzI6/2 DrUvRv29kUdE/dtvXPWG6TcFNol0tmSeGkDt24Q9WgnKikY6fnkXw/mo+l2/TxuivP FrjuzzyL+OO7LR67LmuAoPaSV/75MKCCGdO3Jag4= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20191126081544eucas1p2a6ac5636261663080f4f47d689158249~aqF7DfQ-Z2623426234eucas1p2W; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 0A.97.61286.03FDCDD5; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20191126081544eucas1p2b7fe92ce8a4a1269e08b5b1639185d0e~aqF6xjqH32623426234eucas1p2V; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20191126081544eusmtrp248aea13b10a61fb0f3db5467857551b2~aqF6xE6bS1942219422eusmtrp2b; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) X-AuditID: cbfec7f2-ef1ff7000001ef66-43-5ddcdf30691f Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 5D.E4.07950.03FDCDD5; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) Received: from AMDC2765.digital.local (unknown [106.120.51.73]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20191126081543eusmtip27d45936edf82c30b8fcb4a4e77b303d2~aqF6SeMwJ2360223602eusmtip2P; Tue, 26 Nov 2019 08:15:43 +0000 (GMT) From: Marek Szyprowski To: u-boot@lists.denx.de Date: Tue, 26 Nov 2019 09:15:08 +0100 Message-Id: <20191126081512.5138-3-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191126081512.5138-1-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpmleLIzCtJLcpLzFFi42LZduzneV2D+3diDU5dV7fYOGM9q8WNX22s Fs/fXWayWHvkLrvFgslPWC02zH/LYjFj8ks2i7d7O9kdODzmzTrB4nH2zg5Gj74tqxg91m+5 yuKx6ZVHAGsUl01Kak5mWWqRvl0CV8bdFX8YC3oFKm5/aWZrYGzk7WLk5JAQMJG48WAFWxcj F4eQwApGie45B5khnC+MEqeWXWWHcD4zSqydf5MVpuVa/3KoquWMEgf77jLBtZz5uo4RpIpN wFCi620XG4gtIiAh8av/KiNIEbPAdiaJ9tbrLCAJYQEfievdM8DGsgioSqxafIsZxOYVsJG4 Pv0MI8Q6eYnVGw6AxTkFbCV+zfsHdpOEwHc2iRl9j1ggilwk/nZvgbKFJV4d38IOYctI/N85 nwmioZlR4uG5tVDdPYwSl5tmQK2wljh8/CLQGRxA92lKrN+lDxF2lNg6t5cFJCwhwCdx460g SJgZyJy0bTozRJhXoqNNCKJaTWLW8XVwaw9euMQMYXtIPJyynAUSQhMYJWZ8PsQ+gVF+FsKy BYyMqxjFU0uLc9NTiw3zUsv1ihNzi0vz0vWS83M3MQKTxul/xz/tYPx6KekQowAHoxIP74+z t2OFWBPLiitzDzFKcDArifBqH74TK8SbklhZlVqUH19UmpNafIhRmoNFSZy3muFBtJBAemJJ anZqakFqEUyWiYNTqoGxTtrzZ7ZVzGrtS0JXlSoT7utMeZOkekXl455JKeUrumbbbYx8smhZ mBrXh/KcT938/8KXcy9Va73Aazjz1wPJzt9BXZMuXOheVCvsEt+4Y4V7dwHTQgcHe7VbG67F yQuZRM1cHPx3wtKl29V5NvNtzjPNqTZaf/fsuwfiZ5fcN69z2cbP/ahBiaU4I9FQi7moOBEA qXpvnRYDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrMLMWRmVeSWpSXmKPExsVy+t/xe7oG9+/EGhy8KmSxccZ6Vosbv9pY LZ6/u8xksfbIXXaLBZOfsFpsmP+WxWLG5JdsFm/3drI7cHjMm3WCxePsnR2MHn1bVjF6rN9y lcVj0yuPANYoPZui/NKSVIWM/OISW6VoQwsjPUNLCz0jE0s9Q2PzWCsjUyV9O5uU1JzMstQi fbsEvYy7K/4wFvQKVNz+0szWwNjI28XIySEhYCJxrX85cxcjF4eQwFJGiZ13ZjNCJGQkTk5r YIWwhSX+XOtigyj6xCgxY/URdpAEm4ChRNdbkAQnh4iAhMSv/quMIEXMAruZJK6vOgY2SVjA R+J69wywSSwCqhKrFt9iBrF5BWwkrk8/A7VNXmL1hgNgcU4BW4lf8/6BLRACqpl47B/zBEa+ BYwMqxhFUkuLc9Nzi430ihNzi0vz0vWS83M3MQIDeNuxn1t2MHa9Cz7EKMDBqMTD++Ps7Vgh 1sSy4srcQ4wSHMxKIrzah+/ECvGmJFZWpRblxxeV5qQWH2I0BTpqIrOUaHI+MLrySuINTQ3N LSwNzY3Njc0slMR5OwQOxggJpCeWpGanphakFsH0MXFwSjUwCt7y2Jb5TL2b8frq+q7AJ3EK oc4LtPdlVZq58k+8Ul4edvdgW2VZ8ec7oZd3VsVnsUezdpxsn3iS2Wjpjoy62601tmukRF9M 7ZrqOZfl0zsdG6Uf7wrj9tYo/n6gU8zYsURczJEv+8or2dvvjdPO9LkxZHxwPSrSY5mx6Vjo q/Y5VS5R5l1KLMUZiYZazEXFiQD/akPmdgIAAA== X-CMS-MailID: 20191126081544eucas1p2b7fe92ce8a4a1269e08b5b1639185d0e X-Msg-Generator: CA X-RootMTR: 20191126081544eucas1p2b7fe92ce8a4a1269e08b5b1639185d0e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20191126081544eucas1p2b7fe92ce8a4a1269e08b5b1639185d0e References: <20191126081512.5138-1-m.szyprowski@samsung.com> Cc: Matthias Brugger , Bartlomiej Zolnierkiewicz , Marek Szyprowski Subject: [U-Boot] [PATCH v3 2/6] fat: write: fix broken write at non-zero file offset X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 --- fs/fat/fat_write.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index 6cfa5b4565..7fb373589d 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -756,14 +756,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; @@ -772,8 +770,8 @@ set_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos, __u8 *buffer, cur_pos += bytesperclust; curclust = newclust; } - if (IS_LAST_CLUST(curclust, mydata->fatsize)) { - assert(pos == cur_pos); + if (pos == cur_pos && IS_LAST_CLUST(newclust, mydata->fatsize)) { + filesize -= pos; goto set_clusters; } @@ -814,6 +812,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos, __u8 *buffer, else offset = pos - cur_pos; wsize = min_t(unsigned long long, actsize, filesize - cur_pos); + wsize -= offset; if (get_set_cluster(mydata, curclust, offset, buffer, wsize, &actsize)) { printf("Error get-and-setting cluster\n");