From nobody Sun Feb 8 06:05:18 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495487871169602.4307304620237; Mon, 22 May 2017 14:17:51 -0700 (PDT) Received: from localhost ([::1]:44942 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dCui5-0003bI-PZ for importer@patchew.org; Mon, 22 May 2017 17:17:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37322) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dCucp-0007dk-7B for qemu-devel@nongnu.org; Mon, 22 May 2017 17:12:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dCucn-00007t-PP for qemu-devel@nongnu.org; Mon, 22 May 2017 17:12:23 -0400 Received: from smtp2-g21.free.fr ([2a01:e0c:1:1599::11]:2209) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dCuck-0008WK-7Y; Mon, 22 May 2017 17:12:18 -0400 Received: from localhost.localdomain (unknown [82.227.227.196]) by smtp2-g21.free.fr (Postfix) with ESMTP id 6E5742003BE; Mon, 22 May 2017 23:12:16 +0200 (CEST) From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= To: qemu-devel@nongnu.org Date: Mon, 22 May 2017 23:11:59 +0200 Message-Id: <20170522211205.14265-8-hpoussin@reactos.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170522211205.14265-1-hpoussin@reactos.org> References: <20170522211205.14265-1-hpoussin@reactos.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Windows NT kernel [generic] [fuzzy] X-Received-From: 2a01:e0c:1:1599::11 Subject: [Qemu-devel] [PATCH v2 07/13] vvfat: always create . and .. entries at first and in that order X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , qemu-block@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" readdir() doesn't always return . and .. entries at first and in that order. This leads to not creating them at first in the directory, which raises some errors on file system checking utilities like MS-DOS Scandisk. Specification: "FAT: General overview of on-disk format" v1.03, page 25 Fixes: https://bugs.launchpad.net/qemu/+bug/1599539 Signed-off-by: Herv=C3=A9 Poussineau --- block/vvfat.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/block/vvfat.c b/block/vvfat.c index c1034cdd1f..d4664c531b 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -728,6 +728,12 @@ static int read_directory(BDRVVVFATState* s, int mappi= ng_index) i =3D mapping->info.dir.first_dir_index =3D first_cluster =3D=3D 0 ? 0 : s->directory.next; =20 + if (first_cluster !=3D 0) { + /* create the top entries of a subdirectory */ + (void)create_short_and_long_name(s, i, ".", 1); + (void)create_short_and_long_name(s, i, "..", 1); + } + /* actually read the directory, and allocate the mappings */ while((entry=3Dreaddir(dir))) { unsigned int length=3Dstrlen(dirname)+2+strlen(entry->d_name); @@ -749,8 +755,11 @@ static int read_directory(BDRVVVFATState* s, int mappi= ng_index) } =20 /* create directory entry for this file */ - direntry=3Dcreate_short_and_long_name(s, i, entry->d_name, - is_dot || is_dotdot); + if (!is_dot && !is_dotdot) { + direntry =3D create_short_and_long_name(s, i, entry->d_name, 0= ); + } else { + direntry =3D array_get(&(s->directory), is_dot ? i : i + 1); + } direntry->attributes=3D(S_ISDIR(st.st_mode)?0x10:0x20); direntry->reserved[0]=3Ddirentry->reserved[1]=3D0; direntry->ctime=3Dfat_datetime(st.st_ctime,1); --=20 2.11.0