On Tue, 8 Nov 2005, Nate Lawson wrote:

Craig Rodrigues wrote:
rodrigc     2005-11-09 02:26:38 UTC

  FreeBSD src repository

  Modified files:
    sys/kern             vfs_mount.c   Log:
  For nmount(), allow a text string error message to be propagated back
  to user-space if a parameter named "errmsg" is passed into the iovec.
  Used in conjunction with vfs_mount_error(), more useful error messages
  than errno can be passed back to userspace when mounting a filesystem
  fails.
    Discussed with:         phk, pjd
    Revision  Changes    Path
  1.199     +37 -2     src/sys/kern/vfs_mount.c

While I don't have ideas for a better general mechanism for this, I think it sets a bad precedent. We can't have every complex syscall transporting its own error message strings back to the user program. And we can't expand errno to be the union of every single API-specific error either.

I agree.

Other comments below.

You pointed out mounds of style bugs but missed a few.

Index: src/sys/kern/vfs_mount.c
diff -u src/sys/kern/vfs_mount.c:1.198 src/sys/kern/vfs_mount.c:1.199

Unnecessary cast, variable declared in fn body. Why not just use auio->uio_iov[i].iov_base in the strcmp directly?

+               if (!strcmp(name, "errmsg")) {
+                       copyout(auio->uio_iov[i+1].iov_base,
+                           uap->iovp[i+1].iov_base, uap->iovp[i+1].iov_len);
+

Extra empty line above.

!strcmp() is an especially obfuscated boolean operation on a non-boolean.

Missing spaces around binary operator `+'.

        char *fstype, *fspath;
        int error, fstypelen, fspathlen;
+       int i;

Different style for new declaration (not with the other 3 ints).

@@ -480,12 +499,18 @@
        error = vfs_getopt(optlist, "fstype", (void **)&fstype, &fstypelen);
        if (error || fstype[fstypelen - 1] != '\0') {
                error = EINVAL;
+               if (iov_errmsg)

Implicit comparison of pointer with NULL.

+ strncpy((char *)iov_errmsg->iov_base, "Invalid fstype",
+                           iov_errmsg->iov_len);

Is iov_len >= strlen(iov_errmsg->iov_base)? If not, it won't copy the terminating NUL. Also, if iov_len is big, strncpy wastes time zero-filling the tail. Perhaps use strlcpy instead.

Here the string is "Invalid fstype".  The user buffer should be large
enough to hold all possible messages, but might not be.  The error
handling for when it has a silly size is not very important.

I don't quite understand what iov_base points to.  I think it is malloced,
but without M_ZERO, and it is copied to userland in the copyout() above.
Since the latter uses iov_len and not strlen(), the residue must be filled
somehow to prevent leaking kernel context, and strncpy() is the easiest
way to do this.

 @@ -503,6 +528,17 @@
        error = vfs_domount(td, fstype, fspath, fsflags, optlist);
        mtx_unlock(&Giant);
 bail:
+       if (error && iov_errmsg != NULL) {
+               /* save the errmsg */
+               char *errmsg;
+               int len, ret;

Variables declared in fn body.

Implicit comparison of non-boolean integer with 0.

Comment not an English sentence.

Comment not attached to code.

+       }
+               if (error)
                vfs_freeopts(optlist);
        return (error);

Implicit comparison of non-boolean integer with 0.

Indentation makes no sense (are some lines missing?).

Bruce
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to