forked from Imagelibrary/rtems
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:
committed by
Sebastian Huber
parent
1dbd1079a5
commit
355bc37ad3
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user