Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site ut-sally.UUCP Path: utzoo!watmath!clyde!cbosgd!ucbvax!ucdavis!lll-crg!mordor!ut-sally!std-unix From: std-unix@ut-sally.UUCP (Moderator, John Quarterman) Newsgroups: mod.std.unix Subject: Re: Does EFAULT still make sense as an error return? Message-ID: <3454@ut-sally.UUCP> Date: Mon, 11-Nov-85 19:07:30 EST Article-I.D.: ut-sally.3454 Posted: Mon Nov 11 19:07:30 1985 Date-Received: Wed, 13-Nov-85 07:18:28 EST References: <3429@ut-sally.UUCP> Organization: IEEE/P1003 Portable Operating System Environment Committee Lines: 58 Approved: jsq@ut-sally.UUCP Date: Sun, 10 Nov 85 16:19:03 PST From: mordor!lll-crg!sun!guy (Guy Harris) > [ System V Release 2 claims to return EFAULT in most of these > cases, including time() and wait(). (I don't know if it really > does.) Clearly this is what one would want to have happen. > If a signal occurred instead, and the user signal catcher > returned normally, how would one then complete the system > call? Surely not by returning EINTR :-) -Gwyn ] Normally, one wouldn't *want* to complete the system call in this case; how do you complete a call to "time" where the pointer points into some nonexistent or non-writable location? The only case where this would be useful is in something like (aargh) the Bourne shell, where the signal catcher would grow the data space to make that pointer valid. This would only work with 4.xBSD-style restartable system calls; the system call should *not* be completed, but re-executed. > [ Isn't u.u_error available for the copyout() code? Setting it > to EFAULT instead of posting a signal seems a trivial change. -Gwyn ] "copyout" isn't being used here; the copying of the data from the registers it's usually returned in (for calls like "wait", "time", and "pipe") into the location pointed to by the argument to the system call is done by user-mode code, and it'd have to catch SIGSEGV in order to make the system call return EFAULT in that particular case (oh yes, and in the cases of "wait" and "pipe", you couldn't re-execute the call). > I would add the following sentence to the definition of EFAULT in > section 2.3 [ of Draft 4; Section 2.4 of Draft 5 -jsq ]: > This condition may generate a signal; the error is returned > if the signal is not generated, or is ignored. > [ I'm not sure this is the proper action. This may cause currently > working programs to break. -Kretsch ] 1) The P1003 standard *already* breaks currently working programs; no UNIX which is currently available returns -1 and sets "errno" to EAGAIN on no-delay reads or writes - either it returns 0 (S3, S5) or returns -1 and sets "errno" to EWOULDBLOCK. 2) It's not clear that *reasonable* existing programs would be broken - what can you do with an EFAULT except print an error message and exit? Getting a SIGSEGV would do both of the above, at least with a reasonable parent process (like a shell), and would have the added advantage of giving you a core dump so you can debug the problem more easily (if a system call gets EFAULT, there is buggy code somewhere). > I would actually prefer if new kernel implementations could dispense > with EFAULT entirely, and send a SIGSEGV instead (returning EFAULT > only if the signal is ignored). YES. V6 (!) did this; EFAULT was added subsequent to the release of V6, and appeared in PWB/UNIX 1.0, V7, and its successors (4.xBSD, S3, S5, ...). I am at a loss to figure out why this was done. Volume-Number: Volume 3, Number 15