From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/13150 Path: news.gmane.org!.POSTED!not-for-mail From: Peter Hurley Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH] Preserve select() behavior on arm64 Date: Thu, 30 Aug 2018 07:30:28 -0700 Message-ID: References: <20180525205240.20319-1-peter@meraki.com> <20180829224247.GQ1878@brightrain.aerifal.cx> <20180829225639.GR1878@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Trace: blaine.gmane.org 1535639330 5412 195.159.176.226 (30 Aug 2018 14:28:50 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Thu, 30 Aug 2018 14:28:50 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-13166-gllmg-musl=m.gmane.org@lists.openwall.com Thu Aug 30 16:28:46 2018 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1fvNwD-0001G1-6V for gllmg-musl@m.gmane.org; Thu, 30 Aug 2018 16:28:45 +0200 Original-Received: (qmail 9877 invoked by uid 550); 30 Aug 2018 14:30:52 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 9859 invoked from network); 30 Aug 2018 14:30:51 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=meraki.com; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=az7a9kNtrDmri9cOI8tKxAbB2od1i9galy5IlM/hAfQ=; b=XgOZlFigFzWnvP9yNI9FfE6OxcSJGOdKe1Od5RD3/SFWp0Yvwm8hMdgYjE/tv324wN L1Jys5hOgCOEWfCw8u1yKqxPr6y17PkuKo95qcQFsCJzrYLAeY26Tl3x0NWUOooeEpAP mpOEEMe8Y4h4BO65W7zf2P001wVui+5rn39Eo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=az7a9kNtrDmri9cOI8tKxAbB2od1i9galy5IlM/hAfQ=; b=QsFAsdy7agSsCFehtCJ41ec7kEFhcr6OFeNco4lo6qCcV/pNjGO8nKRpexTlHnXhVh mYbIv8eH2Y9LW7cGuooB4cwpajCLZ0DkLG1BMv4EEFQygmX2CJ87deHDMEDRSK6yXD4g A4YiwKTs9SoekxQtn6/+cGTSgdkFxOSSUbrumARqENhzem22Ipn58CLBwxIcejg7oE9P /wrGlSq2fLf6VpCpyncgVv5atW6VmtI8yn6tjYHVm1xj2Y4GvNzfJ+u+yV+vXf7qLVEG LnytoYhkArgWVzMFbs8xd5z0gQCtm1zg/IHofPkFhLlchIkUGvyfsXKhVXKTWVCRzrli JcDg== X-Gm-Message-State: APzg51D5us37H8IU9fXjGRhRmesqKwPHYsIzRmJMCuJMoCDU0VqaCaFY mS+xxg5dD/Acvele+mYTpbJtccF2RhQ/+pImlCwVp2lG X-Google-Smtp-Source: ANB0VdbcAXAVZCOZE2JPut9sDa74sObF9sWvP40gseQrUUPO8cMaWwjMcvVSWRIlmK8KI7Hy7wbbuOh8tyvJmICRMS8= X-Received: by 2002:a24:c902:: with SMTP id h2-v6mr2308089itg.75.1535639429339; Thu, 30 Aug 2018 07:30:29 -0700 (PDT) In-Reply-To: <20180829225639.GR1878@brightrain.aerifal.cx> Xref: news.gmane.org gmane.linux.lib.musl.general:13150 Archived-At: On Wed, Aug 29, 2018 at 3:56 PM, Rich Felker wrote: > On Wed, Aug 29, 2018 at 06:42:47PM -0400, Rich Felker wrote: >> On Fri, May 25, 2018 at 01:52:40PM -0700, Peter Hurley wrote: >> > On Linux, all the select-related syscalls update the timeout value to >> > indicate how much elapsed time the syscall consumed, and many programs >> > expect this behavior when running on Linux. >> > >> > Newer archs like arm64 have deprecated the select syscall because the >> > pselect syscall is a superset implementation of the select syscall. >> > >> > A complication of implementing select() with the pselect syscall is >> > that the timeouts are specified in different units; select() accepts >> > a struct timeval ptr whereas the pselect syscall takes a struct >> > timespec ptr. These are trivial convertible; struct timeval is >> > specified in seconds + microseconds and struct timespec is in >> > seconds + nanoseconds. >> > >> > For kernel configurations without select syscall available, update the >> > caller's struct timeval argument after the pselect syscall. >> > --- >> > src/select/select.c | 17 +++++++++-------- >> > 1 file changed, 9 insertions(+), 8 deletions(-) >> > >> > diff --git a/src/select/select.c b/src/select/select.c >> > index 7b5f6dcf7a53..45d4cb7a3d0a 100644 >> > --- a/src/select/select.c >> > +++ b/src/select/select.c >> > @@ -12,15 +12,16 @@ int select(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict >> > #else >> > syscall_arg_t data[2] = { 0, _NSIG/8 }; >> > struct timespec ts; >> > + int result; >> > if (tv) { >> > - if (tv->tv_sec < 0 || tv->tv_usec < 0) >> > - return __syscall_ret(-EINVAL); >> > - time_t extra_secs = tv->tv_usec / 1000000; >> > - ts.tv_nsec = tv->tv_usec % 1000000 * 1000; >> > - const time_t max_time = (1ULL<<8*sizeof(time_t)-1)-1; >> > - ts.tv_sec = extra_secs > max_time - tv->tv_sec ? >> > - max_time : tv->tv_sec + extra_secs; >> > + ts->tv_sec = tv->tv_sec; >> > + ts->tv_nsec = tv->usec * 1000; >> > } >> > - return syscall_cp(SYS_pselect6, n, rfds, wfds, efds, tv ? &ts : 0, data); >> > + result = syscall_cp(SYS_pselect6, n, rfds, wfds, efds, tv ? &ts : 0, data); >> > + if (tv) { >> > + tv->tv_sec = ts->tv_sec; >> > + tv->tv_usec = ts->tv_nsec / 1000; >> > + } >> > + return result; >> > #endif >> > } >> > -- >> > 2.14.2 >> >> Sorry for not replying to this sooner. I was unsure what to say at >> first and then it just slipped my mind to go back to it. > > I think the patch is also incorrect as written. It removes the code > for handling timeval values which would be out of range if naively > converted to timespec (either<0 or usec>999999, and overflows). I'm > not sure how SYS_select handles updating the remaining time in the > overflow cases, so if you're trying to duplicate it, researching that > is probably called for. It may be right to just normalize it like > you're doing when converting back, but this will effectively report > the wrong amount of elapsed time if tv_sec+tv_usec/1000000 overflows. > > Rich Linux returns -EINVAL for not normalized timespec and timeval inputs. Regards, Peter Hurley