From patchwork Mon Feb 17 13:17:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1239222 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109851-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=yKc2C7ms; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Ll0v05l7z9sRG for ; Tue, 18 Feb 2020 00:18:22 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=t2gQJ24vWGgOjcTmgIBDixhqBfsBpxw6HudnNIXf5joAyN91ljW9u hEaiIWeEc7TTpT89pbrVO1W2w4b1BnL0ba3rprW9MBj4iPpMEaNQQ/a/qMHZlpC7 4GdeALgL4Pao8cL4XKRhiJYsrimWZkMXL3CYNmU7FvGHQfTjAaoGJQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=pf6xPTgB2rfIfcA2ZvpRZ3AkdF0=; b=yKc2C7ms4+btZm8lAJGHPX7+I/Tp kB/maZk+q+Rx10lUOlAVTrIDPbWo+5XsjgQAooXk8xcBIoaboYgluHuJ/9fM9as1 0ehoYLxAI4+xadGm9YM+gnyDh3C0HHuS9FvcHGHrWXQKXtMRrPPQ7nvO9/e0U29g 48sR/Zp74fLI/KE= Received: (qmail 15937 invoked by alias); 17 Feb 2020 13:18:05 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 15802 invoked by uid 89); 17 Feb 2020 13:18:04 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy=H*Ad:U*fw, qemu X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Andreas Schwab , Vineet Gupta , Lukasz Majewski Subject: [PATCH 1/3] y2038: linux: Provide __futimes64 implementation Date: Mon, 17 Feb 2020 14:17:33 +0100 Message-Id: <20200217131735.18180-2-lukma@denx.de> In-Reply-To: <20200217131735.18180-1-lukma@denx.de> References: <20200217131735.18180-1-lukma@denx.de> MIME-Version: 1.0 This patch provides new __futimes64 explicit 64 bit function for setting file's 64 bit attributes for access and modification time (by specifying file descriptor number). Internally, the __utimensat64_helper function is used. This patch is necessary for having architectures with __WORDSIZE == 32 Y2038 safe. Moreover, a 32 bit version - __futimes has been refactored to internally use __futimes64. The __futimes is now supposed to be used on systems still supporting 32 bit time (__TIMESIZE != 64) - hence the necessary conversion of struct timeval to 64 bit struct __timeval64. The check if struct timevals' usec fields are in the range between 0 and 1000000 has been removed as Linux kernel performs it internally in the implementation of utimensat (the conversion between struct __timeval64 and __timespec64 is not relevant for this particular check). Last but not least, checks for tvp{64} not being NULL have been preserved from the original code as some legacy user space programs may rely on it. Build tests: ./src/scripts/build-many-glibcs.py glibcs Run-time tests: - Run specific tests on ARM/x86 32bit systems (qemu): https://github.com/lmajewski/meta-y2038 and run tests: https://github.com/lmajewski/y2038-tests/commits/master Above tests were performed with Y2038 redirection applied as well as without to test the proper usage of both __futimes64 and __futimes. --- include/time.h | 3 +++ sysdeps/unix/sysv/linux/futimes.c | 42 +++++++++++++++++-------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/include/time.h b/include/time.h index b81ecd5e6e..c24066bf3a 100644 --- a/include/time.h +++ b/include/time.h @@ -210,8 +210,11 @@ extern int __utimensat64_helper (int fd, const char *file, libc_hidden_proto (__utimensat64_helper); #if __TIMESIZE == 64 +# define __futimes64 __futimes # define __futimens64 __futimens #else +extern int __futimes64 (int fd, const struct __timeval64 tvp64[2]); +libc_hidden_proto (__futimes64); extern int __futimens64 (int fd, const struct __timespec64 tsp[2]); libc_hidden_proto (__futimens64); #endif diff --git a/sysdeps/unix/sysv/linux/futimes.c b/sysdeps/unix/sysv/linux/futimes.c index 4bea864470..21b41e4138 100644 --- a/sysdeps/unix/sysv/linux/futimes.c +++ b/sysdeps/unix/sysv/linux/futimes.c @@ -17,35 +17,39 @@ . */ #include -#include -#include #include -#include -#include -#include <_itoa.h> -#include - /* Change the access time of the file associated with FD to TVP[0] and - the modification time of FILE to TVP[1]. + the modification time of FILE to TVP[1]. */ +int +__futimes64 (int fd, const struct __timeval64 tvp64[2]) +{ + /* The utimensat system call expects timespec not timeval. */ + struct __timespec64 ts64[2]; + if (tvp64 != NULL) + { + ts64[0] = timeval64_to_timespec64 (tvp64[0]); + ts64[1] = timeval64_to_timespec64 (tvp64[1]); + } + + return __utimensat64_helper (fd, NULL, tvp64 ? &ts64[0] : NULL, 0); +} + +#if __TIMESIZE != 64 +libc_hidden_def (__futimes64) - Starting with 2.6.22 the Linux kernel has the utimensat syscall which - can be used to implement futimes. */ int __futimes (int fd, const struct timeval tvp[2]) { - /* The utimensat system call expects timespec not timeval. */ - struct timespec ts[2]; + struct __timeval64 tv64[2]; + if (tvp != NULL) { - if (tvp[0].tv_usec < 0 || tvp[0].tv_usec >= 1000000 - || tvp[1].tv_usec < 0 || tvp[1].tv_usec >= 1000000) - return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); - - TIMEVAL_TO_TIMESPEC (&tvp[0], &ts[0]); - TIMEVAL_TO_TIMESPEC (&tvp[1], &ts[1]); + tv64[0] = valid_timeval_to_timeval64 (tvp[0]); + tv64[1] = valid_timeval_to_timeval64 (tvp[1]); } - return INLINE_SYSCALL (utimensat, 4, fd, NULL, tvp ? &ts : NULL, 0); + return __futimes64 (fd, tvp ? &tv64[0] : NULL); } +#endif weak_alias (__futimes, futimes) From patchwork Mon Feb 17 13:17:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1239223 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109852-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=bQb+krc4; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Ll144FQDz9sRG for ; Tue, 18 Feb 2020 00:18:32 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=oCGvZ7fteXHANofEjlkJZPs2wcEPBWYOv0MIF4nnsCHwRbohT/5uh W1yC0C679iB7ksR7qma4E3NsyGAKh73xtBUoKUzz7jDPc1E2BBNeN/XMFJeqaKv1 eJsHjFy06VDR7TrXdiCHVTD3SQd077VA/Ty5W5JQXQ4fCmjWn6tBA0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=cLH1r561UyGUsa8NDNBCUw2JucU=; b=bQb+krc4lrmUl/keAnaEWEGzzhup cVnxIA3eugH3MTxCV/Wco206LO9ZYJkNws2e9bJdQKR25/Ik2UrJC3E7hFcVVCTa q3yFgfkJoQvxG5deWzKwY9EZfEAhyvx06dBpnRXHt2I4ND8jIrJEhXVyI4jKbs+j 5YBCJ8ZPMqtWUkk= Received: (qmail 16483 invoked by alias); 17 Feb 2020 13:18:09 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 16391 invoked by uid 89); 17 Feb 2020 13:18:09 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy= X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Andreas Schwab , Vineet Gupta , Lukasz Majewski Subject: [PATCH 2/3] y2038: linux: Provide __lutimes64 implementation Date: Mon, 17 Feb 2020 14:17:34 +0100 Message-Id: <20200217131735.18180-3-lukma@denx.de> In-Reply-To: <20200217131735.18180-1-lukma@denx.de> References: <20200217131735.18180-1-lukma@denx.de> MIME-Version: 1.0 This conversion patch for supporting 64 bit time for lutimes mostly differs from the work performed for futimes (when providing __futimes64) with adding the AT_SYMLINK_NOFOLLOW flag to utimensat. It also supports passing file name instead of file descriptor number, but this is not relevant for utimensat used to implement it. All the design and conversion decisions are exactly the same as for futimens conversion. --- include/time.h | 3 +++ sysdeps/unix/sysv/linux/lutimes.c | 37 ++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/include/time.h b/include/time.h index c24066bf3a..685075f095 100644 --- a/include/time.h +++ b/include/time.h @@ -211,10 +211,13 @@ libc_hidden_proto (__utimensat64_helper); #if __TIMESIZE == 64 # define __futimes64 __futimes +# define __lutimes64 __lutimes # define __futimens64 __futimens #else extern int __futimes64 (int fd, const struct __timeval64 tvp64[2]); libc_hidden_proto (__futimes64); +extern int __lutimes64 (const char *file, const struct __timeval64 tvp64[2]); +libc_hidden_proto (__lutimes64); extern int __futimens64 (int fd, const struct __timespec64 tsp[2]); libc_hidden_proto (__futimens64); #endif diff --git a/sysdeps/unix/sysv/linux/lutimes.c b/sysdeps/unix/sysv/linux/lutimes.c index 59ab1f065a..778e4e61d8 100644 --- a/sysdeps/unix/sysv/linux/lutimes.c +++ b/sysdeps/unix/sysv/linux/lutimes.c @@ -20,25 +20,36 @@ #include #include #include -#include -#include +int +__lutimes64 (const char *file, const struct __timeval64 tvp64[2]) +{ + struct __timespec64 ts64[2]; + if (tvp64 != NULL) + { + ts64[0] = timeval64_to_timespec64 (tvp64[0]); + ts64[1] = timeval64_to_timespec64 (tvp64[1]); + } + + return __utimensat64_helper (AT_FDCWD, file, tvp64 ? &ts64[0] : NULL, + AT_SYMLINK_NOFOLLOW); +} + +#if __TIMESIZE != 64 +libc_hidden_def (__lutimes64) int -lutimes (const char *file, const struct timeval tvp[2]) +__lutimes (const char *file, const struct timeval tvp[2]) { - /* The system call espects timespec, not timeval. */ - struct timespec ts[2]; + struct __timeval64 tv64[2]; + if (tvp != NULL) { - if (tvp[0].tv_usec < 0 || tvp[0].tv_usec >= 1000000 - || tvp[1].tv_usec < 0 || tvp[1].tv_usec >= 1000000) - return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); - - TIMEVAL_TO_TIMESPEC (&tvp[0], &ts[0]); - TIMEVAL_TO_TIMESPEC (&tvp[1], &ts[1]); + tv64[0] = valid_timeval_to_timeval64 (tvp[0]); + tv64[1] = valid_timeval_to_timeval64 (tvp[1]); } - return INLINE_SYSCALL (utimensat, 4, AT_FDCWD, file, tvp ? ts : NULL, - AT_SYMLINK_NOFOLLOW); + return __lutimes64 (file, tvp ? &tv64[0] : NULL); } +#endif +weak_alias (__lutimes, lutimes) From patchwork Mon Feb 17 13:17:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 1239224 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109853-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=SQR6eCC9; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Ll1F1WcRz9sRG for ; Tue, 18 Feb 2020 00:18:40 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=IidNISl21gjRhXGeVwKeenjVb3q5CqZnE3Y350G+mlo6LqZQqSdeI 9ATfoI7nQw7jbvU7uUPzMsr9nGvCTbOPpbw/zPBe6avijnHYsVswq5gLIP6fVEYi qseG7GlfGOeC5Wt+uzyGn1wfdnnRvZRJrjzXI7fdHNyVM4PqERneOU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=9Ixs1kHG0Tn8xMRd1ozDCL73bDU=; b=SQR6eCC9XNGeq8Jzg+JiyA6CI2W6 2dTdB9IOWYmJQ/g9oEcTEAcpISG3LxSxBZFrJLeg1rxguUzb5WfKeZ4U3l1QLSas hkb8iH+fmvLG/OE+YWZmsdIn/w5rd2L3yxJzqBgdpJy/na6w9xLpGr43lTCyDqhb bN+WZ51MdCNjBdo= Received: (qmail 16744 invoked by alias); 17 Feb 2020 13:18:11 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 16488 invoked by uid 89); 17 Feb 2020 13:18:09 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy= X-HELO: mail-out.m-online.net From: Lukasz Majewski To: Joseph Myers , Paul Eggert , Adhemerval Zanella Cc: Alistair Francis , Alistair Francis , GNU C Library , Siddhesh Poyarekar , Florian Weimer , Florian Weimer , Zack Weinberg , Carlos O'Donell , Andreas Schwab , Vineet Gupta , Lukasz Majewski Subject: [PATCH 3/3] y2038: linux: Provide __futimesat64 implementation Date: Mon, 17 Feb 2020 14:17:35 +0100 Message-Id: <20200217131735.18180-4-lukma@denx.de> In-Reply-To: <20200217131735.18180-1-lukma@denx.de> References: <20200217131735.18180-1-lukma@denx.de> MIME-Version: 1.0 This conversion patch for supporting 64 bit time for futimesat only differs from the work performed for futimes (when providing __futimes64) with passing also the file name (and path) to utimensat. All the design and conversion decisions are exactly the same as for futimens conversion. --- include/time.h | 4 +++ sysdeps/unix/sysv/linux/futimesat.c | 41 ++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/time.h b/include/time.h index 685075f095..db296efaca 100644 --- a/include/time.h +++ b/include/time.h @@ -211,11 +211,15 @@ libc_hidden_proto (__utimensat64_helper); #if __TIMESIZE == 64 # define __futimes64 __futimes +# define __futimesat64 __futimesat # define __lutimes64 __lutimes # define __futimens64 __futimens #else extern int __futimes64 (int fd, const struct __timeval64 tvp64[2]); libc_hidden_proto (__futimes64); +extern int __futimesat64 (int fd, const char *file, + const struct __timeval64 tvp[2]); +libc_hidden_proto (__futimesat64); extern int __lutimes64 (const char *file, const struct __timeval64 tvp64[2]); libc_hidden_proto (__lutimes64); extern int __futimens64 (int fd, const struct __timespec64 tsp[2]); diff --git a/sysdeps/unix/sysv/linux/futimesat.c b/sysdeps/unix/sysv/linux/futimesat.c index 6388a269df..f686c58fa9 100644 --- a/sysdeps/unix/sysv/linux/futimesat.c +++ b/sysdeps/unix/sysv/linux/futimesat.c @@ -17,23 +17,38 @@ . */ #include -#include -#include -#include -#include -#include -#include -#include - +#include /* Change the access time of FILE relative to FD to TVP[0] and the modification time of FILE to TVP[1]. */ int -futimesat (int fd, const char *file, const struct timeval tvp[2]) +__futimesat64 (int fd, const char *file, const struct __timeval64 tvp64[2]) +{ + struct __timespec64 ts64[2]; + if (tvp64 != NULL) + { + ts64[0] = timeval64_to_timespec64 (tvp64[0]); + ts64[1] = timeval64_to_timespec64 (tvp64[1]); + } + + return __utimensat64_helper (fd, file, tvp64 ? &ts64[0] : NULL, 0); +} + +#if __TIMESIZE != 64 +libc_hidden_def (__futimesat64) + +int +__futimesat (int fd, const char *file, const struct timeval tvp[2]) { - if (file == NULL) - return __futimes (fd, tvp); + struct __timeval64 tv64[2]; + + if (tvp != NULL) + { + tv64[0] = valid_timeval_to_timeval64 (tvp[0]); + tv64[1] = valid_timeval_to_timeval64 (tvp[1]); + } - /* Avoid implicit array coercion in syscall macros. */ - return INLINE_SYSCALL (futimesat, 3, fd, file, &tvp[0]); + return __futimesat64 (fd, file, tvp ? &tv64[0] : NULL); } +#endif +weak_alias (__futimesat, futimesat)