|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] libxl__prepare_sockaddr_un
Olaf Hering writes ("[PATCH v2] libxl__prepare_sockaddr_un"):
> libxl: remove usage of strncpy from libxl__prepare_sockaddr_un
>
> The runtime check for the length of path already prevents malfunction.
> But gcc does not detect this runtime check and reports incorrect
> usage of strncpy. Remove the usage of strncpy and work directly with
> the calculated path length.
>
> In file included from /usr/include/string.h:495,
> from libxl_internal.h:38,
> from libxl_utils.c:20:
> In function 'strncpy',
> inlined from 'libxl__prepare_sockaddr_un' at libxl_utils.c:1262:5:
> /usr/include/bits/string_fortified.h:106:10: error: '__builtin_strncpy'
> specified bound 108 equals destination size [-Werror=stringop-truncation]
> 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos
> (__dest));
> |
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> cc1: all warnings being treated as errors
Thanks for working on this.
I found this code a bit confusing:
> - if (sizeof(un->sun_path) <= strlen(path)) {
> + size_t len = strlen(path);
> +
> + if (sizeof(un->sun_path) <= len) {
> LOG(ERROR, "UNIX socket path '%s' is too long for %s", path, what);
> - LOG(DEBUG, "Path must be less than %zu bytes", sizeof(un->sun_path));
> + LOG(DEBUG, "Path of len %zu must be less than %zu bytes", len,
> sizeof(un->sun_path));
> return ERROR_INVAL;
> }
> memset(un, 0, sizeof(struct sockaddr_un));
> un->sun_family = AF_UNIX;
> - strncpy(un->sun_path, path, sizeof(un->sun_path));
> + memcpy(un->sun_path, path, len);
This does not copy the trailing nul. The reader must read up to see
the call to memset. Why do you not use strcpy here ?
Nevertheless, as this is a minor point of style,
Reviewed-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Ian.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |