diff options
author | Frank Kühndel <frank.kuehndel@embedded-brains.de> | 2020-10-15 11:33:13 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-10-15 19:15:50 +0200 |
commit | 355bc37ad35a7d67a7209130171febe805c67f62 (patch) | |
tree | 547bd98e5ef899d62a932cb8be446e38ef71fb87 /cpukit/libmisc/rtems-fdt | |
parent | 1dbd1079a5344c3c67d6bf75b04319725b02ce62 (diff) |
rtems-fdt / shell - Fix string truncation warning
The compiler warning was:
../../../cpukit/libmisc/rtems-fdt/rtems-fdt.c:267:5: warning:
'strncpy' specified bound depends on the length of the source argument
267 | strncpy(path, name, namelen);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
It turns out that the `strncpy()` nor the buffer `path` is needed when
one uses `strncmp()` instead of `strcmp()`. This needs some change to
the algorithm but has the advantage that `name` is never truncated
to the size of the buffer `path`.
Note:
rtems-fdt.c, rtems-fdt-shell.c and cpukit/include/rtems/rtems-fdt.h
seem to be dead code. They implement a shell command `fdt` but that
command is not part of the shell nor of any macro in
cpukit/include/rtems/shellconfig.h.
Diffstat (limited to 'cpukit/libmisc/rtems-fdt')
-rw-r--r-- | cpukit/libmisc/rtems-fdt/rtems-fdt.c | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/cpukit/libmisc/rtems-fdt/rtems-fdt.c b/cpukit/libmisc/rtems-fdt/rtems-fdt.c index 39e70bffec..0ea365314f 100644 --- a/cpukit/libmisc/rtems-fdt/rtems-fdt.c +++ b/cpukit/libmisc/rtems-fdt/rtems-fdt.c @@ -248,48 +248,46 @@ rtems_fdt_index_find_by_name(rtems_fdt_index* index, { int min = 0; int max = index->num_entries; - char path[256]; - const char* cmp_name = name; - /* * Handle trailing slash case. */ - int namelen = strlen(name); + size_t namelen = strlen(name); if (namelen > 0 && name[namelen-1] == '/') { namelen--; - - if (namelen >= (int)sizeof(path) - 1) - { - namelen = sizeof(path) - 1; - } - - strncpy(path, name, namelen); - path[namelen] = 0; - cmp_name = path; } /* Binary search for the name. */ while (min < max) { int middle = (min + max) / 2; - int cmp = strcmp(cmp_name, index->entries[middle].name); + int cmp = strncmp(name, index->entries[middle].name, namelen); + if (cmp == 0) + { + /* 'namelen' characters are equal but 'index->entries[middle].name' */ + /* could have additional characters. */ + if (index->entries[middle].name[namelen] == '\0') + { + /* Found it. */ + return index->entries[middle].offset; + } + else + { + /* 'index->entries[middle].name' is longer than 'name'. */ + cmp = -1; + } + } if (cmp < 0) { /* Look lower than here. */ max = middle; } - else if (cmp > 0) + else { /* Look higher than here. */ min = middle + 1; } - else - { - /* Found it. */ - return index->entries[middle].offset; - } - } + } /* Didn't find it. */ return -FDT_ERR_NOTFOUND; |