Changeset e1c3dc09 in rtems


Ignore:
Timestamp:
Sep 6, 2017, 11:19:05 AM (23 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11
Children:
a76c31e1
Parents:
2ed53cb9
git-author:
Sebastian Huber <sebastian.huber@…> (09/06/17 11:19:05)
git-committer:
Sebastian Huber <sebastian.huber@…> (09/06/17 11:24:34)
Message:

dosfs: Fix msdos_dir_read()

Set a proper name buffer length for each converter invocation.

Close #2987.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libfs/src/dosfs/msdos_dir.c

    r2ed53cb9 re1c3dc09  
    7373    fat_file_fd_t     *tmp_fat_fd = NULL;
    7474    struct dirent      tmp_dirent;
    75     size_t             tmp_lfn_len = 0;
     75    size_t             lfn_len = 0;
    7676    uint16_t          *lfn_buf = converter->buffer.data;
    7777    char              *sfn_buf = converter->buffer.data;
     
    8686    uint8_t            lfn_checksum = 0;
    8787    int                lfn_entries = 0;
    88     size_t             string_size = sizeof(tmp_dirent.d_name);
    8988    bool               is_first_entry;
    9089
     
    186185                    lfn_entries = (*MSDOS_DIR_ENTRY_TYPE(entry) &
    187186                                   MSDOS_LAST_LONG_ENTRY_MASK);
    188                     tmp_lfn_len = 0;
     187                    lfn_len = 0;
    189188                    lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
    190189                    memset (tmp_dirent.d_name, 0, sizeof(tmp_dirent.d_name));
     
    221220                lfn_entries--;
    222221                offset_lfn = lfn_entries * MSDOS_LFN_LEN_PER_ENTRY;
    223                 tmp_lfn_len += msdos_get_utf16_string_from_long_entry (
     222                lfn_len += msdos_get_utf16_string_from_long_entry (
    224223                  entry,
    225224                  &lfn_buf[offset_lfn],
     
    282281                if (lfn_start != FAT_FILE_SHORT_NAME)
    283282                {
    284                     if (lfn_entries ||
    285                         lfn_checksum != msdos_lfn_checksum(entry))
    286                         lfn_start = FAT_FILE_SHORT_NAME;
    287 
    288                     eno = (*convert_handler->utf16_to_utf8) (
    289                         converter,
    290                         lfn_buf,
    291                         tmp_lfn_len,
    292                         (uint8_t*)(&tmp_dirent.d_name[0]),
    293                         &string_size);
    294                     if (eno == 0) {
    295                       tmp_dirent.d_namlen                    = string_size;
    296                       tmp_dirent.d_name[tmp_dirent.d_namlen] = '\0';
    297                     }
    298                     else {
     283                    if (lfn_entries == 0 &&
     284                        lfn_checksum == msdos_lfn_checksum(entry)) {
     285                        size_t len = sizeof(tmp_dirent.d_name) - 1;
     286
     287                        eno = (*convert_handler->utf16_to_utf8) (
     288                            converter,
     289                            lfn_buf,
     290                            lfn_len,
     291                            (uint8_t *) &tmp_dirent.d_name[0],
     292                            &len);
     293                        if (eno == 0) {
     294                            tmp_dirent.d_namlen = len;
     295                            tmp_dirent.d_name[len] = '\0';
     296                        } else {
     297                            lfn_start = FAT_FILE_SHORT_NAME;
     298                        }
     299                    } else {
    299300                        lfn_start = FAT_FILE_SHORT_NAME;
    300301                    }
    301302                }
    302303
    303                 if (lfn_start == FAT_FILE_SHORT_NAME)
    304                 {
     304                if (lfn_start == FAT_FILE_SHORT_NAME) {
     305                    size_t len = sizeof(tmp_dirent.d_name) - 1;
     306
    305307                    /*
    306308                     * convert dir entry from fixed 8+3 format (without dot)
     
    313315                        sfn_buf,
    314316                        tmp_dirent.d_namlen,
    315                         (uint8_t*)(&tmp_dirent.d_name[0]),
    316                         &string_size);
     317                        (uint8_t *) &tmp_dirent.d_name[0],
     318                        &len);
    317319                    if ( 0 == eno ) {
    318                       tmp_dirent.d_namlen                    = string_size;
    319                       tmp_dirent.d_name[tmp_dirent.d_namlen] = '\0';
    320                     }
    321                     else {
     320                      tmp_dirent.d_namlen = len;
     321                      tmp_dirent.d_name[len] = '\0';
     322                    } else {
    322323                        cmpltd = -1;
    323324                        errno  = eno;
Note: See TracChangeset for help on using the changeset viewer.