From patchwork Wed Apr 25 14:21:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Richardson X-Patchwork-Id: 904254 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bMvCZXjH"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40WMpN4j2dz9ryk for ; Thu, 26 Apr 2018 00:22:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754634AbeDYOWC (ORCPT ); Wed, 25 Apr 2018 10:22:02 -0400 Received: from mail-qt0-f195.google.com ([209.85.216.195]:46117 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754630AbeDYOV5 (ORCPT ); Wed, 25 Apr 2018 10:21:57 -0400 Received: by mail-qt0-f195.google.com with SMTP id m16-v6so3578030qtg.13 for ; Wed, 25 Apr 2018 07:21:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=vNlH5sUkYzaENbEkKS9ywn3yIzD4ra71SSjohbOTJ6k=; b=bMvCZXjHYfhAcX3QescASDrqfOXYlvJo7NECi9ipUBe3bk0uS8bXLpB2DyL71yghV3 I8F4Iu0ast2P62e9FV6zcoiYhKp3RhXaht4Fe/giYHvAKhU5boS8ecsgPHM4Z9pN4R2P oYuzV4i5/hgc8Vr6DlqPi078b7OI+ms7tzrNxfeJs80K9qEUu8AOo+zIlHpDwFzM4xkS WDy7ce5aEw0pqy0WpVgp8FQ0YSWgSRm/nQo9VXD8xmh7L5aJGKRoMlbEgg41ab/BKb43 a5QVT6KqS2vpijnoSP4jqo3n4+ttfZeJZByCbbP851zFZPm/QcJg/UXpJgMzalG28l8U Le7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=vNlH5sUkYzaENbEkKS9ywn3yIzD4ra71SSjohbOTJ6k=; b=kDe3rKmmVUHp3QsZTLWY0i3wX8+U/Br9Nahtf/PBMmmNf+hCUkNtBFUedJ+TnEdjiV /3GKOXvNwqNiy+LvlT4JKQpH4qUrKKn8H3E+pVGbVnMVkuWUkzCGX4odzqG2WEiBQLAx qgN9o5/venvdZk0nCkWovjI8gX7Aluxjp/A7Wvx6HmMq3FW/9TVMBxKpTuMKkHcoN8wr KndX6+YIiRpLerra4YxRNBbYKXEGgP7jSco7RZknXbp4/MJhrs3i/wCofquIYu4dFECA L0kWfwp3910UFacymvy7sdbn+/ygo+pzJqdVGHlh3/qow6mg65WzoV2TeaDd+FPgY2h2 hf/g== X-Gm-Message-State: ALQs6tB+1ZNeZ+eAMZf15hG2dY2LooLwz1QRnPeVPkUxsjfM12Pl98t4 LLbjQ+izKPk7DcGx0qOd02TTmg== X-Google-Smtp-Source: AB8JxZq8brhVnYndstxlb+XRHlDrDI9FusoEE7uuplNVWvS7CEI9oQyT0KRU5dz2qSF8joy2KzXWMQ== X-Received: by 2002:aed:2c43:: with SMTP id f61-v6mr31639186qtd.105.1524666115779; Wed, 25 Apr 2018 07:21:55 -0700 (PDT) Received: from Corsair.corp.extremenetworks.com (cpe-2606-A000-112A-C184-5D93-476A-CB2E-D469.dyn6.twc.com. [2606:a000:112a:c184:5d93:476a:cb2e:d469]) by smtp.gmail.com with ESMTPSA id e188sm13080839qkf.16.2018.04.25.07.21.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 25 Apr 2018 07:21:55 -0700 (PDT) From: Lance Richardson To: netdev@vger.kernel.org Cc: gopalsr83@gmail.com, vapier@chromium.org, hjl.tools@gmail.com Subject: [PATCH] net: support compat 64-bit time in {s,g}etsockopt Date: Wed, 25 Apr 2018 10:21:54 -0400 Message-Id: <20180425142154.28891-1-lance.richardson.net@gmail.com> X-Mailer: git-send-email 2.14.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org For the x32 ABI, struct timeval has two 64-bit fields. However the kernel currently interprets the user-space values used for the SO_RCVTIMEO and SO_SNDTIMEO socket options as having a pair of 32-bit fields. When the seconds portion of the requested timeout is less than 2**32, the seconds portion of the effective timeout is correct but the microseconds portion is zero. When the seconds portion of the requested timeout is zero and the microseconds portion is non-zero, the kernel interprets the timeout as zero (never timeout). Fix by using 64-bit time for SO_RCVTIMEO/SO_SNDTIMEO as required for the ABI. The code included below demonstrates the problem. Results before patch: $ gcc -m64 -Wall -O2 -o socktmo socktmo.c && ./socktmo recv time: 2.008181 seconds send time: 2.015985 seconds $ gcc -m32 -Wall -O2 -o socktmo socktmo.c && ./socktmo recv time: 2.016763 seconds send time: 2.016062 seconds $ gcc -mx32 -Wall -O2 -o socktmo socktmo.c && ./socktmo recv time: 1.007239 seconds send time: 1.023890 seconds Results after patch: $ gcc -m64 -O2 -Wall -o socktmo socktmo.c && ./socktmo recv time: 2.010062 seconds send time: 2.015836 seconds $ gcc -m32 -O2 -Wall -o socktmo socktmo.c && ./socktmo recv time: 2.013974 seconds send time: 2.015981 seconds $ gcc -mx32 -O2 -Wall -o socktmo socktmo.c && ./socktmo recv time: 2.030257 seconds send time: 2.013383 seconds #include #include #include #include #include void checkrc(char *str, int rc) { if (rc >= 0) return; perror(str); exit(1); } static char buf[1024]; int main(int argc, char **argv) { int rc; int socks[2]; struct timeval tv; struct timeval start, end, delta; rc = socketpair(AF_UNIX, SOCK_STREAM, 0, socks); checkrc("socketpair", rc); /* set timeout to 1.999999 seconds */ tv.tv_sec = 1; tv.tv_usec = 999999; rc = setsockopt(socks[0], SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof tv); rc = setsockopt(socks[0], SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof tv); checkrc("setsockopt", rc); /* measure actual receive timeout */ gettimeofday(&start, NULL); rc = recv(socks[0], buf, sizeof buf, 0); gettimeofday(&end, NULL); timersub(&end, &start, &delta); printf("recv time: %ld.%06ld seconds\n", (long)delta.tv_sec, (long)delta.tv_usec); /* fill send buffer */ do { rc = send(socks[0], buf, sizeof buf, 0); } while (rc > 0); /* measure actual send timeout */ gettimeofday(&start, NULL); rc = send(socks[0], buf, sizeof buf, 0); gettimeofday(&end, NULL); timersub(&end, &start, &delta); printf("send time: %ld.%06ld seconds\n", (long)delta.tv_sec, (long)delta.tv_usec); exit(0); } Fixes: 515c7af85ed9 ("x32: Use compat shims for {g,s}etsockopt") Reported-by: Gopal RajagopalSai Signed-off-by: Lance Richardson --- net/compat.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/compat.c b/net/compat.c index 5ae7437d3853..7242cce5631b 100644 --- a/net/compat.c +++ b/net/compat.c @@ -377,7 +377,8 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname, optname == SO_ATTACH_REUSEPORT_CBPF) return do_set_attach_filter(sock, level, optname, optval, optlen); - if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) + if (!COMPAT_USE_64BIT_TIME && + (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) return do_set_sock_timeout(sock, level, optname, optval, optlen); return sock_setsockopt(sock, level, optname, optval, optlen); @@ -448,7 +449,8 @@ static int do_get_sock_timeout(struct socket *sock, int level, int optname, static int compat_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { - if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) + if (!COMPAT_USE_64BIT_TIME && + (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) return do_get_sock_timeout(sock, level, optname, optval, optlen); return sock_getsockopt(sock, level, optname, optval, optlen); }