From patchwork Tue Sep 22 18:15:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuriy Kolerov X-Patchwork-Id: 521386 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by ozlabs.org (Postfix) with ESMTP id 1EA4F1401CD for ; Wed, 23 Sep 2015 04:16:18 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 3F522A43EA; Tue, 22 Sep 2015 18:16:16 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dPvyqxQ0w_pX; Tue, 22 Sep 2015 18:16:11 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by fraxinus.osuosl.org (Postfix) with ESMTP id D66AEA43F3; Tue, 22 Sep 2015 18:16:10 +0000 (UTC) X-Original-To: uclibc@lists.busybox.net Delivered-To: uclibc@osuosl.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by ash.osuosl.org (Postfix) with ESMTP id 2E7711BFC01 for ; Tue, 22 Sep 2015 18:16:09 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 2CD0FA43ED for ; Tue, 22 Sep 2015 18:16:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id XMUCgkiIBlQy for ; Tue, 22 Sep 2015 18:16:08 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from smtprelay.synopsys.com (us01smtprelay-2.synopsys.com [198.182.47.9]) by fraxinus.osuosl.org (Postfix) with ESMTPS id 8444CA43DD for ; Tue, 22 Sep 2015 18:16:08 +0000 (UTC) Received: from dc8secmta1.synopsys.com (dc8secmta1.synopsys.com [10.13.218.200]) by smtprelay.synopsys.com (Postfix) with ESMTP id 147F624E13D0 for ; Tue, 22 Sep 2015 11:16:08 -0700 (PDT) Received: from dc8secmta1.internal.synopsys.com (dc8secmta1.internal.synopsys.com [127.0.0.1]) by dc8secmta1.internal.synopsys.com (Service) with ESMTP id 0866727119 for ; Tue, 22 Sep 2015 11:16:08 -0700 (PDT) Received: from mailhost.synopsys.com (mailhost1.synopsys.com [10.12.238.239]) by dc8secmta1.internal.synopsys.com (Service) with ESMTP id DF59227118 for ; Tue, 22 Sep 2015 11:16:07 -0700 (PDT) Received: from mailhost.synopsys.com (localhost [127.0.0.1]) by mailhost.synopsys.com (Postfix) with ESMTP id CAB3532E; Tue, 22 Sep 2015 11:16:07 -0700 (PDT) Received: from ykolerov-lab.internal.synopsys.com (ykolerov-lab.internal.synopsys.com [10.121.8.82]) by mailhost.synopsys.com (Postfix) with ESMTP id 3007C30A; Tue, 22 Sep 2015 11:16:06 -0700 (PDT) From: Yuriy Kolerov To: uclibc@uclibc.org, Vineet.Gupta1@synopsys.com, Alexey.Brodkin@synopsys.com, Anton.Kolesov@synopsys.com Subject: [PATCH v2 2/3] libc: fix sign extension in fallocate() Date: Tue, 22 Sep 2015 21:15:59 +0300 Message-Id: <1442945760-30551-2-git-send-email-yuriy.kolerov@synopsys.com> X-Mailer: git-send-email 2.2.0 In-Reply-To: <1442945760-30551-1-git-send-email-yuriy.kolerov@synopsys.com> References: <1442945760-30551-1-git-send-email-yuriy.kolerov@synopsys.com> Cc: Francois.Bedard@synopsys.com X-BeenThere: uclibc@uclibc.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "Discussion and development of uClibc \(the embedded C library\)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: uclibc-bounces@uclibc.org Sender: "uClibc" Arguments offset and len in fallocate system call in Linux kernel have 64-bit types. However these arguments in fallocate wrapper in uClibc may have 32-bit types. In this case it's necessary to pass two 32-bit words to the systemc call for every argument - an actual argument and its sign extension. Thus high word of 64-bit value must be 0 or 0xFFFFFFFF depending on sign of the original 32-bit value (offset or len). It is how sign extansion works - all high bits of the negative value must be 1. fallocate does sign extension incorrectly when 32 bit values are passed (offset or len). It just fills the second word of 64-bit value by zeros. E.g. fallocate works incorrectly when offset or length is negative value - in this case kernel thinks that positive values are passed. Signed-off-by: Yuriy Kolerov --- libc/sysdeps/linux/common/fallocate.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libc/sysdeps/linux/common/fallocate.c b/libc/sysdeps/linux/common/fallocate.c index b2309e9..446d9ef 100644 --- a/libc/sysdeps/linux/common/fallocate.c +++ b/libc/sysdeps/linux/common/fallocate.c @@ -21,14 +21,12 @@ int attribute_hidden __libc_fallocate(int fd, int mode, __off_t offset, __off_t int ret; # if __WORDSIZE == 32 - uint32_t off_low = offset; - uint32_t len_low = len; - /* may assert that these >>31 are 0 */ - uint32_t zero = 0; + int32_t offset_sign_extension = (offset < 0) ? 0xFFFFFFFF : 0; + int32_t len_sign_extension = (len < 0) ? 0xFFFFFFFF : 0; INTERNAL_SYSCALL_DECL(err); ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode, - __LONG_LONG_PAIR (zero, off_low), - __LONG_LONG_PAIR (zero, len_low))); + __LONG_LONG_PAIR (offset_sign_extension, offset), + __LONG_LONG_PAIR (len_sign_extension, len))); # elif __WORDSIZE == 64 INTERNAL_SYSCALL_DECL(err); ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, mode, offset, len));