Subject: UBC turns EACCESS into EFAULT (e.g.: with NFS)
To: None <tech-kern@netbsd.org>
From: Ignatios Souvatzis <is@netbsd.org>
List: tech-kern
Date: 12/07/2003 16:33:07
--tKW2IUtsqtDRztdT
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Hello,
I've been debugging (at work) The Case of the Disappearing Crontab.=20
Long history at end, short history here:=20
errno is set to "Bad address" (EFAULT) when a suid-root program is trying
to read through an open file handle that the NFS server doesn't allow root
to read.
[I suspect the same would happen if you replace root by some other user.]
I suspect this happens because the original NFS EACCESS error is somehow
lost while being propagated through UBC ...
NFS / UBC experts: is it possible to propagate the original NFS error code
to the read system call exit? Actually - the same might happen if you read
a faulty (e.g. floppy) disk - reading EFAULT instead of EIO will be
confusing here, too. (I didn't test this.)
***
Long history, maybe interesting as background:
1. a paranoid user of mine has a script that reinstalls a couple
of files from a backup location, among them it executes
crontab ~/somepath/somefile
2. He reports that his installed crontab is empty at irregular intervals.
I told him to not throw away (>/dev/null 2>&1) the crontab output, but he
got no messages in the e-mail. I looked closer at the source code in
question, fixed error reporting for writing the intermediate file (on /var)
[see usr.sbin/cron/crontab.c 1.20], installed, and told him to recheck.
3. He reports no change and no error message.
4. I looked closer at the code, and found that -reading- errors wouldn't
be reported.
5. Also, my attention was drawn to his paranoid system admistrator who
only allows workstation root id to access fileserver NFS as nobody.
I added read error reporting code to crontab, did some tests, and found
that I get Bad address. (The fopen() succeeds because it is done with
swapped ids).
6. I told my user to use "/bin/cat hisfile | crontab - " as a workaround.
I'm build-testing my error reporting patch right now - we should at least
try to report a read error - but with our current (1.6) kernel behaviour,
this error message won't be helpful to the unsuspecting user.
Regards,
-is
--=20
seal your e-mail: http://www.gnupg.org/
--tKW2IUtsqtDRztdT
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (NetBSD)
iD8DBQE/00gzPCRcZ/VMtk4RArVBAJ44WvcPX5+zgSu5+BgiHXY1nIEWdwCffYmg
U13gdWtY7xBDPAVaRk3iokM=
=9oCm
-----END PGP SIGNATURE-----
--tKW2IUtsqtDRztdT--