From patchwork Sat May 30 10:07:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helge Deller X-Patchwork-Id: 11580203 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C93B514F6 for ; Sat, 30 May 2020 10:07:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id ABE2020776 for ; Sat, 30 May 2020 10:07:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=gmx.net header.i=@gmx.net header.b="hYUQkGmg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728071AbgE3KHM (ORCPT ); Sat, 30 May 2020 06:07:12 -0400 Received: from mout.gmx.net ([212.227.17.22]:49985 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725813AbgE3KHM (ORCPT ); Sat, 30 May 2020 06:07:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1590833230; bh=D2JrPHXwDEJuElh5m0kYfBwMDJGswMtPK54BKXIUpMg=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject; b=hYUQkGmgJ2CXvt/gFj6K1pX3UOHcONB6etBui/SAo/6Vh7Vd91L9rDnlsolTHLJdB 0xD4bGmXZTPtnIMTonEmA5z9vZLBAfPgqy6nnYIgltJ+6CgZaprwYJ2Cwvm9jLLp0k V1baakosYHvGj6t/1v74zIueOElTqy6k67X87W4I= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from ls3530.fritz.box ([92.116.167.47]) by mail.gmx.com (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MDQeU-1joIKh3LrK-00AYKx; Sat, 30 May 2020 12:07:09 +0200 Date: Sat, 30 May 2020 12:07:07 +0200 From: Helge Deller To: Alexander Viro , Andrew Morton , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Laurent Vivier Subject: [PATCH v2] fs/signalfd.c: Fix inconsistent return codes for signalfd4 Message-ID: <20200530100707.GA10159@ls3530.fritz.box> MIME-Version: 1.0 Content-Disposition: inline X-Provags-ID: V03:K1:8O2glHu0d01VKLhpLooltHX2Ri6pSGmEWHFdSzrSx+4xlXHns7S I0xeRdVUOHNMgoBeAd8BBGIYvDhZU+nXnEcBPKcUKDNsth0QP2T2Do6UztrW0Fj8oyLR+I3 4SCQLmWr1RWwTaE9tpnMLdW4GsxgEifDw9PagCJY1I3sDnKSZWrRvJjqmlYNnWkeQf5uruz cvAFAxZhgSjTD1jlxVZlA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:/VMxzfcx4hI=:jDPWzc+4UW73v8w8mAuGLf F2MVWYuRp5MKlqgoFMCpJQMXNzlcooEiyKk0+xyNjD1UjPaoZphNixNUeP5+lgXzP4UVNLTps LZ8IAPXCJSxkUJlNwN7swuHMvcSzMtScKKP9K27IC2sgSJCLqvPCQqsfztMZh1CyG0Ojgb1in Hu4f3Lu8HifWM2v/93zbMZul5t8V8JIejqezkzytWrNEVii+Hn8YGMoRwlLZCIrHKr6pjT2T+ UYYVv3B7Afx7N1KBRNOzZAq5Cq43B2WYxOMxD0j8B3Y/OBXb26KTJsvvsvuiiRls68k9JEbVS dzi3Y6aPJwfTKuECCxOrNxtQUOuS5RaRyJP9UDf2pnq8xh94AvxuP+/IXAUXzkh0wbUlC+Eaw QpPTGobDVCfGIcO9+MKwQbTRMl+0qtKmsM0qGoGxrVE0H+JBf2tRjxQxULZfj+AZNurDrZJUX s67pk44/JE7y7NdwlRTopbGIb82vyBluFaNytz2mnNyKWWM8kK101cuyYEzYtGDKobylt6AOz UoxpsQmeeB1R3l3ynLKp1CxmqFGyBNpn27HUSrT/LzyvmrGvWiu/D423bf8nAR/OII6QT7spJ xXPzZNqgSScnjmBJmxQA8wkSjJ9O8gIB0GmYYPxNBbKBIPgExHJPGBmJbpvRxbwPbBmlPipfX 8e4R7pXqbuOSGF6Ovc/GjVOIWpbTvvhJdvQ6qKo02YeEa4Irjp6/gt+v0TiIOXfPO3AwDya1Z /ZOkp3CmmT8IUhU/P3eaVeIX5qvVdyKDOPPVIW6z9uj2eBc6caAhVQa9pPTBY1e1Oxnhm4fSv mao1/rIEdK2gjXWI3IkjX3RyxkBrmHgvHzqDHgmn9jfFMfVTHow9CVcW0wjtm/blRj/JTogeA 6COLW7x2DvtUd5Lk1ScZfBi6/bKmYIaleOHEwfwuhYMlTunMnk1UrzteUC2XanuLnKTJcsxu7 muHH6uiNQRTnvEmJttEVKs75AaYllyT8vUfE17k9P+YnqZbMTMS0TkFZL8g4U6jiBrFR/GZs9 X6rsWJK4vVYCqcgWdQ8JoYubDZ9esTNJ/pZ88v4Qd6YVwJf2oIib8/9Yn7pr6XAQfVSD9l/rx CJKCci3vSI8t4Qxbha6HZcwaBKc6xbuUA6pP9BEkB4F8LZEpUp0szHH8s2WPU1yLemefyLM9i 2djr5urDrk6zjU6nIjshXTEWK7tA1v9Fn6pttEAVcIYi24jTMWkWYHpwYGNXfBBRtknfwX2j4 WAQGZ0jNVkEliDGNU Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org The kernel signalfd4() syscall returns different error codes when called either in compat or native mode. This behaviour makes correct emulation in qemu and testing programs like LTP more complicated. Fix the code to always return -in both modes- EFAULT for unaccessible user memory, and EINVAL when called with an invalid signal mask. Signed-off-by: Helge Deller --- Changelog v2: - Rephrased commit message. diff --git a/fs/signalfd.c b/fs/signalfd.c index 44b6845b071c..5b78719be445 100644 --- a/fs/signalfd.c +++ b/fs/signalfd.c @@ -314,9 +314,10 @@ SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask, { sigset_t mask; - if (sizemask != sizeof(sigset_t) || - copy_from_user(&mask, user_mask, sizeof(mask))) + if (sizemask != sizeof(sigset_t)) return -EINVAL; + if (copy_from_user(&mask, user_mask, sizeof(mask))) + return -EFAULT; return do_signalfd4(ufd, &mask, flags); } @@ -325,9 +326,10 @@ SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask, { sigset_t mask; - if (sizemask != sizeof(sigset_t) || - copy_from_user(&mask, user_mask, sizeof(mask))) + if (sizemask != sizeof(sigset_t)) return -EINVAL; + if (copy_from_user(&mask, user_mask, sizeof(mask))) + return -EFAULT; return do_signalfd4(ufd, &mask, 0); }