Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Jul 2002 23:23:48 +1000 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Johan Karlsson <johan@FreeBSD.ORG>
Cc:        freebsd-audit@FreeBSD.ORG, <sheldonh@FreeBSD.ORG>
Subject:   Re: accounting to appen only file
Message-ID:  <20020702224153.U12090-100000@gamplex.bde.org>
In-Reply-To: <20020701204140.A49191@numeri.campus.luth.se>

next in thread | previous in thread | raw e-mail | index | archive | help
> I have been running with the equivalent patch on stable
> for a while and it works as supposed for me. However, since
> I'm not that familiar with the vn code I would like to get
> feedback if this might be harmfull in any way.

> Index: src/sys/kern//kern_acct.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/kern_acct.c,v
> retrieving revision 1.44
> diff -u -r1.44 kern_acct.c
> --- src/sys/kern//kern_acct.c	16 May 2002 21:28:11 -0000	1.44
> +++ src/sys/kern//kern_acct.c	30 Jun 2002 19:39:55 -0000
> @@ -119,6 +119,9 @@
>  	struct nameidata nd;
>  	int error, flags;
>
> +	/* Open file for append writing only */
> +	flags = FWRITE | FAPPEND;
> +

This has some style bugs: excessive commenting, an unterminated sentence,
and some less than useful code restructuring (moving the initialization
of `flags'.  (This file is excessively commented in several places.  I
think the comments in acct_process() are just to show that it was
implemented in a clean room starting from documentation.)

>  	/* Make sure that the caller is root. */
>  	error = suser(td);

Excessive commenting in old code.

>  	if (error)
> @@ -126,20 +129,19 @@
>
>  	mtx_lock(&Giant);
>  	/*
> -	 * If accounting is to be started to a file, open that file for
> -	 * writing and make sure it's a 'normal'.
> +	 * If accounting is to be started to a file, open that file
> +	 * and make sure it's a 'normal'.
>  	 */
>  	if (SCARG(uap, path) != NULL) {
>  		NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path),
>  		       td);
> -		flags = FWRITE;

I would just change FWRITE globally to FWRITE | FAPPEND (and adjust
the comment to say "appending").  That would be a little chummy with
the implementation, but so is the existing and new code, and fixing
this is beyond the scope of the PR.

>  		error = vn_open(&nd, &flags, 0);

Note that the flags variable was only used to discard some changes made
by vn_open().  At least in the direct descendant of vn_open(), these changes
are limited to clearing O_CREAT and O_TRUNC, but we really shouldn't assume
this.  Strictly, we should record returned flags for use late like the `file'
layer would do.

>  		if (error)
>  			goto done2;
>  		NDFREE(&nd, NDF_ONLY_PNBUF);
>  		VOP_UNLOCK(nd.ni_vp, 0, td);
>  		if (nd.ni_vp->v_type != VREG) {
> -			vn_close(nd.ni_vp, FWRITE, td->td_ucred, td);
> +			vn_close(nd.ni_vp, flags, td->td_ucred, td);

This fixes an error case to use the returned flags.

>  			error = EACCES;
>  			goto done2;
>  		}
> @@ -151,7 +153,7 @@
>  	 */
>  	if (acctp != NULLVP || savacctp != NULLVP) {
>  		callout_stop(&acctwatch_callout);
> -		error = vn_close((acctp != NULLVP ? acctp : savacctp), FWRITE,
> +		error = vn_close((acctp != NULLVP ? acctp : savacctp), flags,

Here using the returned flags is (logically) worse than using hard-coded
flags, since we are closing a different file so we should strictly use the
flags that were returned when we opened that file, nit the flags for the
file that we just opened.

>  		    td->td_ucred, td);
>  		acctp = savacctp = NULLVP;
>  	}

I think FAPPEND should be spelled O_APPEND in the above.  The former
spelling is currently not used anywhere in *.c under /sys except in
alpha/osf1.  It should be only compatibility cruft for userland.

I doubt that vn_close() actually cares about the FAPPEND flag.

There are some more FWRITE's in acctwatch().  These are only for closes,
so the correctness of the above patches depends on vn_close() not caring.

Bruce


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020702224153.U12090-100000>