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.
This commit is contained in:
Frank Kühndel
2020-10-15 11:33:13 +02:00
committed by Sebastian Huber
parent 1dbd1079a5
commit 355bc37ad3

View File

@@ -248,48 +248,46 @@ rtems_fdt_index_find_by_name(rtems_fdt_index* index,
{ {
int min = 0; int min = 0;
int max = index->num_entries; int max = index->num_entries;
char path[256];
const char* cmp_name = name;
/* /*
* Handle trailing slash case. * Handle trailing slash case.
*/ */
int namelen = strlen(name); size_t namelen = strlen(name);
if (namelen > 0 && name[namelen-1] == '/') if (namelen > 0 && name[namelen-1] == '/')
{ {
namelen--; 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. */ /* Binary search for the name. */
while (min < max) while (min < max)
{ {
int middle = (min + max) / 2; 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) if (cmp < 0)
{ {
/* Look lower than here. */ /* Look lower than here. */
max = middle; max = middle;
} }
else if (cmp > 0) else
{ {
/* Look higher than here. */ /* Look higher than here. */
min = middle + 1; min = middle + 1;
} }
else }
{
/* Found it. */
return index->entries[middle].offset;
}
}
/* Didn't find it. */ /* Didn't find it. */
return -FDT_ERR_NOTFOUND; return -FDT_ERR_NOTFOUND;