[bug report] fs: fat: create correct short names

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Jul 26 10:10:37 CEST 2023


On 26.07.23 09:02, Dan Carpenter wrote:
> Hello Heinrich Schuchardt,
>
> The patch 28cef9ca2e86: "fs: fat: create correct short names" from
> Nov 20, 2020, leads to the following Smatch static
> checker warning:
>
>      fs/fat/fat_write.c:61 str2fat()
>      warn: impossible condition '(c > 127) => ((-128)-127 > 127)'
>
>      fs/fat/fat_write.c:136 set_name()
>      warn: impossible condition '(*dirent.name == 229) => ((-128)-127 == 229)'
>
> fs/fat/fat_write.c
>      105 static int set_name(fat_itr *itr, const char *filename, char *shortname)
>      106 {
>      107         char *period;
>      108         char *pos;
>      109         int period_location;
>      110         char buf[13];
>      111         int i;
>      112         int ret;
>      113         struct nameext dirent;
>      114
>      115         if (!filename)
>      116                 return -EIO;
>      117
>      118         /* Initialize buffer */
>      119         memset(&dirent, ' ', sizeof(dirent));
>      120
>      121         /* Convert filename to upper case short name */
>      122         period = strrchr(filename, '.');
>      123         pos = (char *)filename;
>      124         if (*pos == '.') {
>      125                 pos = period + 1;
>      126                 period = 0;
>      127         }
>      128         if (period)
>      129                 str2fat(dirent.ext, period + 1, sizeof(dirent.ext));
>      130         period_location = str2fat(dirent.name, pos, sizeof(dirent.name));
>      131         if (period_location < 0)
>      132                 return period_location;
>      133         if (*dirent.name == ' ')
>      134                 *dirent.name = '_';
>      135         /* 0xe5 signals a deleted directory entry. Replace it by 0x05. */
> --> 136         if (*dirent.name == 0xe5)
>
> dirent.name is a char type.  Chars are signed on probably most people's
> systems.  The Linux kernel recently made char unsigned for everyone.
> Anyway in a char 0xe5 is negative but as a literal, it's positive so
> this condition cannot be true.
>
>      137                 *dirent.name = 0x05;

Thanks for reporting the issue. In the same file we have:

fs/fat/fat_write.c:1493:
         dent->nameext.name[0] = DELETED_FLAG;

include/fat.h:53:
#define DELETED_FLAG   ((char)0xe5)

I will send a patch.

Best regards

Heinrich

>      138
>      139         /* If filename and short name are the same, quit. */
>      140         sprintf(buf, "%.*s.%.3s", period_location, dirent.name, dirent.ext);
>      141         if (!strcmp(buf, filename)) {
>      142                 ret = 1;
>
> regards,
> dan carpenter



More information about the U-Boot mailing list