summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Kühndel <frank.kuehndel@embedded-brains.de>2020-10-15 11:33:13 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-10-15 19:15:50 +0200
commit355bc37ad35a7d67a7209130171febe805c67f62 (patch)
tree547bd98e5ef899d62a932cb8be446e38ef71fb87
parent1dbd1079a5344c3c67d6bf75b04319725b02ce62 (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.
-rw-r--r--cpukit/libmisc/rtems-fdt/rtems-fdt.c40
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;