From patchwork Fri May 3 11:26:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 1094847 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=vivier.eu Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44wVXy3Cyyz9s9N for ; Fri, 3 May 2019 21:39:46 +1000 (AEST) Received: from localhost ([127.0.0.1]:38655 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hMWXY-0001SM-Bz for incoming@patchwork.ozlabs.org; Fri, 03 May 2019 07:39:44 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34108) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hMWLt-0007yo-FS for qemu-devel@nongnu.org; Fri, 03 May 2019 07:27:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hMWLs-0003aI-5I for qemu-devel@nongnu.org; Fri, 03 May 2019 07:27:41 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:58167) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hMWLp-0003X8-FM; Fri, 03 May 2019 07:27:37 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue012 [212.227.15.167]) with ESMTPSA (Nemesis) id 1Movrq-1gxtmB3xWg-00qTby; Fri, 03 May 2019 13:27:14 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 3 May 2019 13:26:54 +0200 Message-Id: <20190503112654.4393-13-laurent@vivier.eu> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190503112654.4393-1-laurent@vivier.eu> References: <20190503112654.4393-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:ttwLbHfjFvzQwfNO9cPzyHDWHibyiGxX3ChUL76EYHycmw6EnmQ kx4FPyw+19atBvv9rTvmGMzWtnRB2Nw8LpG3BT7UsJRdIGZppMUoPxmfCku0TYi4WxRrpc2 gcC4yxJY5WaFH2jsPA0++zT7nbzpXMsAr25W1rV5bf4PAkkPXiFCAytwX+5eeT1n+pRGQ46 iBYBR40gUDShIbw4z18QQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:8DdFuGzYnG0=:Cz+Bl1L/hYJ+YNd2i6eG0t 37PibROpijR6jsht4R6cKPt2uQ1t8+Ak3RII7DCZy/fUpyN/LDaEbukfbq4p3FzAdyaHyAjUH YJwWT23oTMom+/552ujZEHEv6LO8KO7qM2eQ2sghrEuJFCMPIVYdK5Df4ntxWhWTYtWX8gKfF 7pScW0UZxYQikQSVUskv62EmbLTTJGWhXXPrvOuzKGtWXM+HxEQcmFPM6JZemz/kBX0gRZuM9 ztrHpLzJ2Y44iX2A6YxzgxeHNvmH6OkLfdTIuTkfWhFDlNReG29GIQvsnswBZj9OvcvuwvtWp H3/+XJZGO3/EzJ1QTTPFyeJCnAB3972CUTfswf6s+uH5MTAW9xdLUZEHkgfb6SAiATGvhGdtZ zaD3utatdFMyB4Z6LLDaPUP0aptg2Ou/dXSQ3DbRTURc0UvGHV90NkDQOOku6FzNAFGHRRN1Y BqhCeinaag4avNPCqqdpI3WkuZRp+WEqVZspx/h+Hx3EwuKO9EEO2VnF0NbQgbwJjZkeXTrl0 qJGZUMzW598nOk6InZVcSpxAwM7OZWhKnn8h5MAPcVch0p3rBS6oyIErsl/9teeBdmKWWsnuk suOCoLu5K/I8IDVyoLDITF8dTHmhl65A7CMWLYRfTI8lsKGjnYRGmrHU+oY2XpHN2Hz3M6YMd ppLr+1DnBbL2vNimNVp/rjtvpSvWC5H0wyDbBjOskjg2Z7UDLXZa3d7W3fILc3du3UQRmZC5r jtXI7EBExZulsJsnEUV/wgnupFfnvMIn1yq7kuJ9+GTqH3cxcgL398syCVM= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.126.187 Subject: [Qemu-devel] [PULL v2 12/12] sockets: avoid string truncation warnings when copying UNIX path X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-trivial@nongnu.org, Mark Cave-Ayland , Jason Wang , Michael Tokarev , Laurent Vivier , Fabien Chouteau , Michael Roth , Gerd Hoffmann , Paolo Bonzini , Stefano Garzarella , =?utf-8?q?Andreas_F=C3=A4rber?= , Artyom Tarasenko , Richard Henderson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Daniel P. Berrangé In file included from /usr/include/string.h:494, from include/qemu/osdep.h:101, from util/qemu-sockets.c:18: In function ‘strncpy’, inlined from ‘unix_connect_saddr.isra.0’ at util/qemu-sockets.c:925:5: /usr/include/bits/string_fortified.h:106:10: warning: ‘__builtin_strncpy’ specified bound 108 equals destination size [-Wstringop-truncation] 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function ‘strncpy’, inlined from ‘unix_listen_saddr.isra.0’ at util/qemu-sockets.c:880:5: /usr/include/bits/string_fortified.h:106:10: warning: ‘__builtin_strncpy’ specified bound 108 equals destination size [-Wstringop-truncation] 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We are already validating the UNIX socket path length earlier in the functions. If we save this string length when we first check it, then we can simply use memcpy instead of strcpy later, avoiding the gcc truncation warnings. Signed-off-by: Daniel P. Berrangé Reviewed-by: Eric Blake Reviewed-by: Stefano Garzarella Message-Id: <20190501145052.12579-1-berrange@redhat.com> Signed-off-by: Laurent Vivier --- util/qemu-sockets.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 970505169000..ba6335e71a95 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -830,6 +830,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr, int sock, fd; char *pathbuf = NULL; const char *path; + size_t pathlen; sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0); if (sock < 0) { @@ -845,7 +846,8 @@ static int unix_listen_saddr(UnixSocketAddress *saddr, path = pathbuf = g_strdup_printf("%s/qemu-socket-XXXXXX", tmpdir); } - if (strlen(path) > sizeof(un.sun_path)) { + pathlen = strlen(path); + if (pathlen > sizeof(un.sun_path)) { error_setg(errp, "UNIX socket path '%s' is too long", path); error_append_hint(errp, "Path must be less than %zu bytes\n", sizeof(un.sun_path)); @@ -877,7 +879,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr, memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; - strncpy(un.sun_path, path, sizeof(un.sun_path)); + memcpy(un.sun_path, path, pathlen); if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) { error_setg_errno(errp, errno, "Failed to bind socket to %s", path); @@ -901,6 +903,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp) { struct sockaddr_un un; int sock, rc; + size_t pathlen; if (saddr->path == NULL) { error_setg(errp, "unix connect: no path specified"); @@ -913,7 +916,8 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp) return -1; } - if (strlen(saddr->path) > sizeof(un.sun_path)) { + pathlen = strlen(saddr->path); + if (pathlen > sizeof(un.sun_path)) { error_setg(errp, "UNIX socket path '%s' is too long", saddr->path); error_append_hint(errp, "Path must be less than %zu bytes\n", sizeof(un.sun_path)); @@ -922,7 +926,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp) memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; - strncpy(un.sun_path, saddr->path, sizeof(un.sun_path)); + memcpy(un.sun_path, saddr->path, pathlen); /* connect to peer */ do {