|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1] tools: fix usage of strncpy
In case of truncation no trailing zero will be added to the target
string. Reduce the amount of bytes to copy by one to make sure a
trailing zero always exists.
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
Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
---
gcc may not detect the off-by-one error in libxl__prepare_sockaddr_un, fix the
strncpy usage anyway.
tools/libvchan/vchan-socket-proxy.c | 8 ++++----
tools/libxl/libxl_utils.c | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tools/libvchan/vchan-socket-proxy.c
b/tools/libvchan/vchan-socket-proxy.c
index 13700c5d67..b312f05ca7 100644
--- a/tools/libvchan/vchan-socket-proxy.c
+++ b/tools/libvchan/vchan-socket-proxy.c
@@ -140,7 +140,7 @@ static int set_nonblocking(int fd, int nonblocking) {
static int connect_socket(const char *path_or_fd) {
int fd;
char *endptr;
- struct sockaddr_un addr;
+ struct sockaddr_un addr = {};
fd = strtoll(path_or_fd, &endptr, 0);
if (*endptr == '\0') {
@@ -153,7 +153,7 @@ static int connect_socket(const char *path_or_fd) {
return -1;
addr.sun_family = AF_UNIX;
- strncpy(addr.sun_path, path_or_fd, sizeof(addr.sun_path));
+ strncpy(addr.sun_path, path_or_fd, sizeof(addr.sun_path) - 1);
if (connect(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
close(fd);
return -1;
@@ -167,7 +167,7 @@ static int connect_socket(const char *path_or_fd) {
static int listen_socket(const char *path_or_fd) {
int fd;
char *endptr;
- struct sockaddr_un addr;
+ struct sockaddr_un addr = {};
fd = strtoll(path_or_fd, &endptr, 0);
if (*endptr == '\0') {
@@ -180,7 +180,7 @@ static int listen_socket(const char *path_or_fd) {
return -1;
addr.sun_family = AF_UNIX;
- strncpy(addr.sun_path, path_or_fd, sizeof(addr.sun_path));
+ strncpy(addr.sun_path, path_or_fd, sizeof(addr.sun_path) - 1);
if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
close(fd);
return -1;
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index f360f5e228..83592e829d 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -1259,7 +1259,7 @@ int libxl__prepare_sockaddr_un(libxl__gc *gc,
}
memset(un, 0, sizeof(struct sockaddr_un));
un->sun_family = AF_UNIX;
- strncpy(un->sun_path, path, sizeof(un->sun_path));
+ strncpy(un->sun_path, path, sizeof(un->sun_path) - 1);
return 0;
}
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |