From patchwork Sat Sep 9 17:15:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 811972 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) 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; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Mmlp/jQx"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3xqLXx51cRz9t16 for ; Sun, 10 Sep 2017 03:20:01 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 0ECB7C21C58; Sat, 9 Sep 2017 17:19:09 +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=FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, 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 53097C21F2A; Sat, 9 Sep 2017 17:17:48 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 769C8C21E8C; Sat, 9 Sep 2017 17:17:02 +0000 (UTC) Received: from mail-qt0-f193.google.com (mail-qt0-f193.google.com [209.85.216.193]) by lists.denx.de (Postfix) with ESMTPS id B0316C21E55 for ; Sat, 9 Sep 2017 17:16:56 +0000 (UTC) Received: by mail-qt0-f193.google.com with SMTP id u48so401064qtc.4 for ; Sat, 09 Sep 2017 10:16:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Y9Zc0Nv79pXQfDgDO26uLmB5Oesm4aAENBswlPKEk6U=; b=Mmlp/jQxxLIXqAwGHi8GzVFUySn9GNfQPAtYov09aDH20T+5diaDlvEHKVQcsGbFLe gZqef8z3AhV15T+FcB0bjKdKmk4gB1p7uctSUkz9sF7Z341EgrG8f+Rww4rLzWZSSfUT TjdU2WGDXGqRg5tW1DFa3l2r/RIyF6eZb61Whj/Kab2HuoHLFW19dm6jYdQPfjJLzBns n9zp6hbEX2Id4Rgx2UuqQSm+N1L/FqD0TNj6mismH2RZlPVmnJ+XzaZs63AMw1f02LxG LiN4FCkjRoumwvPTLOQkh8Fv0Gtc9qNmAeyF77RkpyzX1D81HOVBs4OfxZB2j12hjk3H qOtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Y9Zc0Nv79pXQfDgDO26uLmB5Oesm4aAENBswlPKEk6U=; b=GmBocJMBBqfeeqbZz3poA6SvWH/vNJVfJpu1tDz3bUiViFoUR8aLZGAOXOvGk4D7yP 6ljnbG7QYZ0j4ktRJQ4hSAh950ZkrhhrDjiucAuYEpNgraCWs/JB4tRFyQPd2uFLRzOH Q1CWH809icAlVuK/B5BdtH1UwS1Ww/roU17tiyB9DWxRBlSiWBtFZRRsc8bCkwSTVrE7 GOZ8Oy48HfOMAcB96NnW4Br3BiNj0+UFsk4oaRpfJx6jIFPQ5ER4F2Ri7kTO9H/H0qCv LzexkQ2CJ0TH1KYqCKtHKzHlme0Nv+tTRQEKNYAysCi5DWBxJEgPQqkLd2qlqBnrLRRl Fksg== X-Gm-Message-State: AHPjjUizteH/l05UgQZD7taWexq46/YniU/4uMABrihrAJ3bu7oUpu7k jt2QI30QcrhoJn28TVc= X-Google-Smtp-Source: AOwi7QCH0/8DmhtypWQNmslTbKL37M6sl45KkbLDpDuAvKVwXsxLBvsNQ+HhLCGQ5URxVbVUG+5MLQ== X-Received: by 10.237.59.26 with SMTP id p26mr9707063qte.304.1504977415408; Sat, 09 Sep 2017 10:16:55 -0700 (PDT) Received: from localhost ([2601:184:4780:aac0:25f8:dd96:a084:785a]) by smtp.gmail.com with ESMTPSA id f4sm3310144qte.76.2017.09.09.10.16.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 09 Sep 2017 10:16:54 -0700 (PDT) From: Rob Clark To: U-Boot Mailing List Date: Sat, 9 Sep 2017 13:15:59 -0400 Message-Id: <20170909171606.20029-9-robdclark@gmail.com> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20170909171606.20029-1-robdclark@gmail.com> References: <20170909171606.20029-1-robdclark@gmail.com> MIME-Version: 1.0 Cc: Philipp Skadorov , Heinrich Schuchardt , Genevieve Chan , Tien Fong Chee Subject: [U-Boot] [PATCH v3 8/9] fs/fat: fix case for FAT shortnames 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: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Noticed when comparing our output to linux. There are some lcase bits which control whether filename and/or extension should be downcase'd. Signed-off-by: Rob Clark Reviewed-by: Ɓukasz Majewski Reviewed-by: Simon Glass --- fs/fat/fat.c | 16 ++++++++++------ fs/fat/fat_write.c | 4 ++-- include/fat.h | 6 +++++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index c951d84f57..65873a2c2a 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -29,11 +29,13 @@ static const int vfat_enabled = 0; #endif /* - * Convert a string to lowercase. + * Convert a string to lowercase. Converts at most 'len' characters, + * 'len' may be larger than the length of 'str' if 'str' is NULL + * terminated. */ -static void downcase(char *str) +static void downcase(char *str, size_t len) { - while (*str != '\0') { + while (*str != '\0' && len--) { *str = tolower(*str); str++; } @@ -131,10 +133,13 @@ static void get_name(dir_entry *dirent, char *s_name) ptr = s_name; while (*ptr && *ptr != ' ') ptr++; + if (dirent->lcase & CASE_LOWER_BASE) + downcase(s_name, (unsigned)(ptr - s_name)); if (dirent->ext[0] && dirent->ext[0] != ' ') { - *ptr = '.'; - ptr++; + *ptr++ = '.'; memcpy(ptr, dirent->ext, 3); + if (dirent->lcase & CASE_LOWER_EXT) + downcase(ptr, 3); ptr[3] = '\0'; while (*ptr && *ptr != ' ') ptr++; @@ -144,7 +149,6 @@ static void get_name(dir_entry *dirent, char *s_name) *s_name = '\0'; else if (*s_name == aRING) *s_name = DELETED_FLAG; - downcase(s_name); } static int flush_dirty_fat_buffer(fsdata *mydata); diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index 4ca024c208..d0468baf8f 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -345,7 +345,7 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, *l_name = '\0'; else if (*l_name == aRING) *l_name = DELETED_FLAG; - downcase(l_name); + downcase(l_name, INT_MAX); /* Return the real directory entry */ *retdent = realdent; @@ -981,7 +981,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size, memcpy(l_filename, filename, name_len); l_filename[name_len] = 0; /* terminate the string */ - downcase(l_filename); + downcase(l_filename, INT_MAX); startsect = mydata->rootdir_sect; retdent = find_directory_entry(mydata, startsect, diff --git a/include/fat.h b/include/fat.h index 83cd90017e..0f58939124 100644 --- a/include/fat.h +++ b/include/fat.h @@ -128,10 +128,14 @@ typedef struct volume_info /* Boot sign comes last, 2 bytes */ } volume_info; +/* see dir_entry::lcase: */ +#define CASE_LOWER_BASE 8 /* base (name) is lower case */ +#define CASE_LOWER_EXT 16 /* extension is lower case */ + typedef struct dir_entry { char name[8],ext[3]; /* Name and extension */ __u8 attr; /* Attribute bits */ - __u8 lcase; /* Case for base and extension */ + __u8 lcase; /* Case for name and ext (CASE_LOWER_x) */ __u8 ctime_ms; /* Creation time, milliseconds */ __u16 ctime; /* Creation time */ __u16 cdate; /* Creation date */