From patchwork Thu May 2 18:58:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 1094521 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 44w4Yw0p17z9s9G for ; Fri, 3 May 2019 05:09:07 +1000 (AEST) Received: from localhost ([127.0.0.1]:57480 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hMH4r-00037W-S3 for incoming@patchwork.ozlabs.org; Thu, 02 May 2019 15:09:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:36471) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hMGvv-0003uF-7V for qemu-devel@nongnu.org; Thu, 02 May 2019 14:59:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hMGvt-0003Ai-V4 for qemu-devel@nongnu.org; Thu, 02 May 2019 14:59:51 -0400 Received: from mout.kundenserver.de ([212.227.17.24]:48925) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hMGvr-00037l-RF; Thu, 02 May 2019 14:59:49 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MeTHG-1goJ5D2reG-00aWOX; Thu, 02 May 2019 20:59:07 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 2 May 2019 20:58:35 +0200 Message-Id: <20190502185835.15185-14-laurent@vivier.eu> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190502185835.15185-1-laurent@vivier.eu> References: <20190502185835.15185-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:johlun5VbqcFFeXrYbcsP3qULCYtVfsxhJ0z39MAyC1YkfTLvrZ 7zip1xJrieVu35UEQ+V5YlcsBmCskkF3JMsMbUEdTAJuzmepg0GifQn0+/c9WinCoLhoSSq EWCQLcv1zj+w+ZryTUSgTuJ1yBc4P36BZX3s086YICNmsv15IwxY99KI/kSNuCbNhluUJ3B sV+cw+Lq78WCz1dLoAk2A== X-UI-Out-Filterresults: notjunk:1; V03:K0:AyS5xkSKc/4=:dYbQfipr5uRL0uioQB0yuJ ZANmGH/T/igME9DASM/EyL+8+YxkZHBExlwzb04daIuzzF0D9aM26oqt1sTZKwZcga6ny84l8 Lbd4CkqQmc6whFK+XyKRyFUFSYv/ntw9Tx8NyZDuJMaJvefahYJmuBNFKZgegz2baZVhBlzY7 zrrjboUxwhP2DBYp0r27VGnCHGLKUw+hWs7w/tGJqsgSstMvzGuddaElmpKoa7skKAJBqpOF0 nnyCCTIk9kSCU4Fe3tXozFQqiKnBQcd4ADjbh6RS7DqG99bDyoXAvbgSmyh+B8TnJxGJU8DTr lYZDl1WSitSfwhJW8VGEG6SFzzyNlcfpaTD73/wXVqasI67xIop+8wnZA6ZW7fX7jehB7USbf 5tEMM+thJ/QohdVXOegleBXHLem15kFXbzVI4VcnUc8NbTw3OnUp3TTGMoxzEURd44A2kDd76 QalIz6PZW4qkL0EhioROIPeqUs1mgJZJE2GEJhGEmYWbUKmifTaFfE/W+Hzzo23ya/CaV9N1N ZQ3Ip5I0Vtv+jaQfX0ADfDEu72vnFc7WMUU93qoM/g1gzY9PknypJUlZVhWqmdk+c9vBbOAiW eY0RUjw1zXYedBwrUIlxX8rIJo9dd8lQU5VkPKpf9J05SE42xoSiiT4GR5TEnKEs1VYD/a2Ys moi1oxuXJP4kn/mCouAhDvULVNeilE/ZRja/dgdr+jAxawTMSp+elgFy3aa/ZYciRRMR2sDJH UrRgWhoN5wILjoT8xLveez9KfIZFZakRrOqjAk+0/0Z/LKcdcZ0Tjpdk8XQ= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.17.24 Subject: [Qemu-devel] [PULL 13/13] 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: Peter Maydell , Jason Wang , Michael Tokarev , Gerd Hoffmann , qemu-trivial@nongnu.org, Michael Roth , Artyom Tarasenko , Stefano Garzarella , Laurent Vivier , Thomas Huth , Eduardo Habkost , Mark Cave-Ayland , Fabien Chouteau , =?utf-8?q?Alex_Benn=C3=A9e?= , Richard Henderson , Viktor Prutyanov , Laurent Vivier , Paolo Bonzini , =?utf-8?q?Andreas_F=C3=A4rber?= , Aurelien Jarno 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 {