Module Name: src Committed By: mlelstv Date: Sat Aug 8 08:18:52 UTC 2015
Modified Files: src/sys/ufs/ffs: ffs_alloc.c Log Message: don't crash when printing error messages when there are no credentials. don't abuse the printed uid to log the inode number. The printing/logging of error messages should be simplified. To generate a diff of this commit: cvs rdiff -u -r1.149 -r1.150 src/sys/ufs/ffs/ffs_alloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/ffs/ffs_alloc.c diff -u src/sys/ufs/ffs/ffs_alloc.c:1.149 src/sys/ufs/ffs/ffs_alloc.c:1.150 --- src/sys/ufs/ffs/ffs_alloc.c:1.149 Sat Mar 28 19:24:04 2015 +++ src/sys/ufs/ffs/ffs_alloc.c Sat Aug 8 08:18:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_alloc.c,v 1.149 2015/03/28 19:24:04 maxv Exp $ */ +/* $NetBSD: ffs_alloc.c,v 1.150 2015/08/08 08:18:52 mlelstv Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.149 2015/03/28 19:24:04 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.150 2015/08/08 08:18:52 mlelstv Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -111,7 +111,7 @@ static daddr_t ffs_alloccg(struct inode static daddr_t ffs_alloccgblk(struct inode *, struct buf *, daddr_t, int); static ino_t ffs_dirpref(struct inode *); static daddr_t ffs_fragextend(struct inode *, int, daddr_t, int, int); -static void ffs_fserr(struct fs *, u_int, const char *); +static void ffs_fserr(struct fs *, kauth_cred_t, const char *); static daddr_t ffs_hashalloc(struct inode *, int, daddr_t, int, int, daddr_t (*)(struct inode *, int, daddr_t, int, int)); static daddr_t ffs_nodealloccg(struct inode *, int, daddr_t, int, int); @@ -145,7 +145,7 @@ ffs_check_bad_allocation(const char *fun if (bno >= fs->fs_size) { printf("bad block %" PRId64 ", ino %llu\n", bno, (unsigned long long)inum); - ffs_fserr(fs, inum, "bad block"); + ffs_fserr(fs, NOCRED, "bad block"); return EINVAL; } return 0; @@ -286,7 +286,7 @@ ffs_alloc(struct inode *ip, daddr_t lbn, } nospace: mutex_exit(&ump->um_lock); - ffs_fserr(fs, kauth_cred_geteuid(cred), "file system full"); + ffs_fserr(fs, cred, "file system full"); uprintf("\n%s: write failed, file system is full\n", fs->fs_fsmnt); return (ENOSPC); } @@ -532,7 +532,7 @@ nospace: /* * no space available */ - ffs_fserr(fs, kauth_cred_geteuid(cred), "file system full"); + ffs_fserr(fs, cred, "file system full"); uprintf("\n%s: write failed, file system is full\n", fs->fs_fsmnt); return (ENOSPC); } @@ -605,7 +605,7 @@ ffs_valloc(struct vnode *pvp, int mode, noinodes: mutex_exit(&ump->um_lock); UFS_WAPBL_END(pvp->v_mount); - ffs_fserr(fs, kauth_cred_geteuid(cred), "out of inodes"); + ffs_fserr(fs, cred, "out of inodes"); uprintf("\n%s: create/symlink failed, no inodes free\n", fs->fs_fsmnt); return ENOSPC; } @@ -2159,9 +2159,17 @@ ffs_mapsearch(struct fs *fs, struct cg * * fs: error message */ static void -ffs_fserr(struct fs *fs, u_int uid, const char *cp) +ffs_fserr(struct fs *fs, kauth_cred_t cred, const char *cp) { + KASSERT(cred != NULL); - log(LOG_ERR, "uid %d, pid %d, command %s, on %s: %s\n", - uid, curproc->p_pid, curproc->p_comm, fs->fs_fsmnt, cp); + if (cred == NOCRED || cred == FSCRED) { + log(LOG_ERR, "pid %d, command %s, on %s: %s\n", + curproc->p_pid, curproc->p_comm, + fs->fs_fsmnt, cp); + } else { + log(LOG_ERR, "uid %d, pid %d, command %s, on %s: %s\n", + kauth_cred_getuid(cred), curproc->p_pid, curproc->p_comm, + fs->fs_fsmnt, cp); + } }