On 06/02/2021 06:02, Niteesh G. S. wrote:
Hello Christian,

On Sat, Feb 6, 2021 at 2:33 AM Christian Mauderer <o...@c-mauderer.de <mailto:o...@c-mauderer.de>> wrote:

    On 05/02/2021 19:22, Gedare Bloom wrote:
     >
     >
     > On Fri, Feb 5, 2021 at 10:41 AM G S Niteesh Babu
    <niteesh...@gmail.com <mailto:niteesh...@gmail.com>
     > <mailto:niteesh...@gmail.com <mailto:niteesh...@gmail.com>>> wrote:
     >
     >     Changed rtems_ofw_get_prop to use memcpy instead of strncpy
     >     ---
     >       bsps/shared/ofw/ofw.c | 10 +++++++++-
     >       1 file changed, 9 insertions(+), 1 deletion(-)
     >
     >     diff --git a/bsps/shared/ofw/ofw.c b/bsps/shared/ofw/ofw.c
     >     index fa94bfbf05..9dec310247 100644
     >     --- a/bsps/shared/ofw/ofw.c
     >     +++ b/bsps/shared/ofw/ofw.c
     >     @@ -198,7 +198,15 @@ ssize_t rtems_ofw_get_prop(
     >
     >         if (prop == NULL && strcmp(propname, "name") == 0) {
     >           prop = fdt_get_name(fdtp, offset, &len);
     >     -    strncpy(buf, prop, bufsize);
     >     +
     >     +    bufsize = MIN(len, bufsize - 1);
     >
     > ok, reserving 1 byte for the \0. It could be worth adding a
    comment here
     > to that effect

    Is the content of that property really _allways_ a string? Isn't it
    possible to read some references or similar with it?

Yes in this case it is always a string since we check if the propname == "name" In other cases we use bcopy. I wanted to get this to your attention but then I
confused myself with endianness and thought it will still be an issue.

Sorry, I think that confusion has been caused by me. If the spec tells that "name" is always a string and can never be something else, keeping str*cpy is OK from my point of view. What do you think Gedare?


And as per the device tree spec, the node name is 1-31 chars length, consists
only of ASCII chars(Device tree spec table 2.1) and is null-terminated.

In that case enforcing null-termination might still be a good idea in case the buffer passed to this function is smaller or in case someone passes an invalid device tree.


    If it is always a string, I might have made a useless suggestion. In
    that case it might is more efficient and readable to just keep the
    strncpy. Depending on the use case, maybe using strlcpy instead of
    strncpy could be a good idea to guarantee the \0 termination.

As per docs, strlcpy  is  not  present  in glibc and is not standardized by POSIX,
so is it okay to use that?

As far as I know, newlib (the C library we use) has a strlcpy. It is already used in some rtems code (for example cpukit/score/src/threadname.c) so I don't see a problem using it.

If not I can use strncpy with a check like this

    strncpy(buf, str, buflen - 1);

            if (buflen > 0)
                buf[buflen - 1]= '\0';
This ensures the buffer is always null terminated.

     >
     >     +    memcpy(buf, prop, bufsize);
     >     +
     >     +    /* Null terminate the buffer */
     >     +    *((char *)buf + bufsize) = 0;
     >
     > that gets written here. looks fine to me.
     >
     >     +
     >     +    /* Return the length of the name including the null byte */
     >     +    /* This is the behaviour in libBSD ofw_fdt_getprop */
     >           return len + 1;
     >
     > shouldn't it be bufsize+1? if it got truncated by the MIN?
     >
     >         }
     >
     >     --
     >     2.17.1
     >
     >
     > _______________________________________________
     > devel mailing list
     > devel@rtems.org <mailto:devel@rtems.org>
     > http://lists.rtems.org/mailman/listinfo/devel
    <http://lists.rtems.org/mailman/listinfo/devel>
     >

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to