Date: Mon, 12 Jan 2004 20:55:04 -0800 (PST) From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 45246 for review Message-ID: <200401130455.i0D4t4ug097659@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=45246 Change 45246 by rwatson@rwatson_paprika on 2004/01/12 20:54:08 Modify vn_fullpath() memory ownership model: the caller now allocates the memory, rather than vn_fullpath() allocating it. This brings us closer to Apple's vn_getpath(), and permits the storage for a path in the audit system to be owned by the audit system. Also prevents a lot of extra mallocs in procfs... Affected files ... .. //depot/projects/trustedbsd/audit2/sys/compat/linprocfs/linprocfs.c#4 edit .. //depot/projects/trustedbsd/audit2/sys/fs/procfs/procfs.c#3 edit .. //depot/projects/trustedbsd/audit2/sys/fs/procfs/procfs_map.c#3 edit .. //depot/projects/trustedbsd/audit2/sys/kern/vfs_cache.c#3 edit .. //depot/projects/trustedbsd/audit2/sys/sys/vnode.h#3 edit Differences ... ==== //depot/projects/trustedbsd/audit2/sys/compat/linprocfs/linprocfs.c#4 (text+ko) ==== @@ -349,17 +349,19 @@ struct mount *mp; const char *lep; char *dlep, *flep, *mntto, *mntfrom, *fstype; + char *fullpath, *lep; size_t lep_len; int error; /* resolve symlinks etc. in the emulation tree prefix */ + fullpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, linux_emul_path, td); flep = NULL; - if (namei(&nd) != 0 || vn_fullpath_thread(td, nd.ni_vp, &dlep, &flep) - != 0) + if (namei(&nd) != 0 || vn_fullpath_proc(td, nd.ni_vp, fullpath, + MAXPATHLEN) != 0) lep = linux_emul_path; else - lep = dlep; + lep = fullpath; lep_len = strlen(lep); mtx_lock(&mountlist_mtx); @@ -403,8 +405,7 @@ sbuf_printf(sb, " 0 0\n"); } mtx_unlock(&mountlist_mtx); - if (flep != NULL) - free(flep, M_TEMP); + free(fullpath); return (error); } @@ -737,13 +738,14 @@ static int linprocfs_doproccwd(PFS_FILL_ARGS) { - char *fullpath = "unknown"; - char *freepath = NULL; + char *fullpath; - vn_fullpath_thread(td, p->p_fd->fd_cdir, &fullpath, &freepath); - sbuf_printf(sb, "%s", fullpath); - if (freepath) - free(freepath, M_TEMP); + fullpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); + if (vn_fullpath_proc(td, p->p_fd->fd_cdir, fullpath, MAXPATHLEN) == 0) + sbuf_printf(sb, "%s", fullpath); + else + sbuf_printf(sb, "unknown"); + free(fullpath, M_TEMP); return (0); } @@ -754,14 +756,15 @@ linprocfs_doprocroot(PFS_FILL_ARGS) { struct vnode *rvp; - char *fullpath = "unknown"; - char *freepath = NULL; + char *fullpath; + fullpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); rvp = jailed(p->p_ucred) ? p->p_fd->fd_jdir : p->p_fd->fd_rdir; - vn_fullpath_thread(td, rvp, &fullpath, &freepath); - sbuf_printf(sb, "%s", fullpath); - if (freepath) - free(freepath, M_TEMP); + if (vn_fullpath_proc(td, rvp, fullpath, MAXPATHLEN) == 0) + sbuf_printf(sb, "%s", fullpath); + else + sbuf_printf(sb, "unknown"); + free(fullpath); return (0); } @@ -828,12 +831,12 @@ vm_map_entry_t entry; vm_object_t obj, tobj, lobj; vm_ooffset_t off = 0; - char *name = "", *freename = NULL; + char *name = "", *fullpath; size_t len; ino_t ino; int ref_count, shadow_count, flags; int error; - + PROC_LOCK(p); error = p_candebug(td, p); PROC_UNLOCK(p); @@ -846,6 +849,7 @@ if (uio->uio_offset != 0) return (0); + fullpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); error = 0; if (map != &curthread->td_proc->p_vmspace->vm_map) vm_map_lock_read(map); @@ -864,9 +868,12 @@ VM_OBJECT_LOCK(lobj); off = IDX_TO_OFF(lobj->size); if (lobj->type == OBJT_VNODE && lobj->handle) { - vn_fullpath_thread(td, - (struct vnode *)lobj->handle, &name, - &freename); + if (vn_fullpath_proc(td, + (struct vnode *)lobj->handle, fullpath, + MAXPATHLEN) == 0) + name = fullpath; + else + name = ""; ino = ((struct vnode *) lobj->handle)->v_cachedid; } @@ -898,8 +905,6 @@ *name ? " " : "", name ); - if (freename) - free(freename, M_TEMP); len = strlen(mebuffer); if (len > uio->uio_resid) len = uio->uio_resid; /* @@ -912,7 +917,7 @@ } if (map != &curthread->td_proc->p_vmspace->vm_map) vm_map_unlock_read(map); - + free(fullpath); return (error); } ==== //depot/projects/trustedbsd/audit2/sys/fs/procfs/procfs.c#3 (text+ko) ==== @@ -67,13 +67,14 @@ int procfs_doprocfile(PFS_FILL_ARGS) { - char *fullpath = "unknown"; - char *freepath = NULL; + char *path; - vn_fullpath_thread(td, p->p_textvp, &fullpath, &freepath); - sbuf_printf(sb, "%s", fullpath); - if (freepath) - free(freepath, M_TEMP); + path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); + if (vn_fullpath_proc(td, p->p_textvp, path, MAXPATHLEN) == 0) + sbuf_printf(sb, "%s", path); + else + sbuf_printf(sb, "unknown"); + free(path, M_TEMP); return (0); } ==== //depot/projects/trustedbsd/audit2/sys/fs/procfs/procfs_map.c#3 (text+ko) ==== @@ -80,7 +80,7 @@ pmap_t pmap = vmspace_pmap(p->p_vmspace); vm_map_entry_t entry; char mebuffer[MEBUFFERSIZE]; - char *fullpath, *freepath; + char *path, *thepath; GIANT_REQUIRED; @@ -95,7 +95,8 @@ if (uio->uio_offset != 0) return (0); - + + path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); error = 0; if (map != &curthread->td_proc->p_vmspace->vm_map) vm_map_lock_read(map); @@ -128,26 +129,30 @@ for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) lobj = tobj; - freepath = NULL; - fullpath = "-"; + path = NULL; if (lobj) { switch(lobj->type) { default: case OBJT_DEFAULT: + thepath = "-"; type = "default"; break; case OBJT_VNODE: type = "vnode"; - vn_fullpath_thread(td, - (struct vnode *)lobj->handle, - &fullpath, - &freepath); + if (vn_fullpath_proc(td, + (struct vnode *)lobj->handle, path, + MAXPATHLEN) == 0) + thepath = path; + else + thepath = "unknown"; break; case OBJT_SWAP: type = "swap"; + thepath = "-"; break; case OBJT_DEVICE: type = "device"; + thepath = "-"; break; } @@ -156,6 +161,7 @@ shadow_count = obj->shadow_count; } else { type = "none"; + thepath = "-"; flags = 0; ref_count = 0; shadow_count = 0; @@ -175,11 +181,8 @@ ref_count, shadow_count, flags, (entry->eflags & MAP_ENTRY_COW)?"COW":"NCOW", (entry->eflags & MAP_ENTRY_NEEDS_COPY)?"NC":"NNC", - type, fullpath); + type, thepath); - if (freepath != NULL) - free(freepath, M_TEMP); - len = strlen(mebuffer); if (len > uio->uio_resid) { error = EFBIG; @@ -191,6 +194,7 @@ } if (map != &curthread->td_proc->p_vmspace->vm_map) vm_map_unlock_read(map); + free(path, M_TEMP); return (error); } ==== //depot/projects/trustedbsd/audit2/sys/kern/vfs_cache.c#3 (text+ko) ==== @@ -927,10 +927,10 @@ * cache (if available) */ int -vn_fullpath(struct vnode *optional_root, struct vnode *vn, char **retbuf, - char **freebuf) +vn_fullpath(struct vnode *optional_root, struct vnode *vn, char *buf, + u_int buflen) { - char *bp, *buf; + char *bp; int i, slash_prefixed; struct namecache *ncp; struct vnode *vp; @@ -941,8 +941,7 @@ return (ENODEV); if (vn == NULL) return (EINVAL); - buf = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); - bp = buf + MAXPATHLEN - 1; + bp = buf + buflen - 1; *bp = '\0'; slash_prefixed = 0; error = 0; @@ -1000,25 +999,21 @@ *--bp = '/'; } numfullpathfound++; - *retbuf = bp; - *freebuf = buf; out2: CACHE_UNLOCK(); out1: - if (error) - free(buf, M_TEMP); - return (0); + return (error); } /* * Perform a vn_fullpath() operation relative to a specific process's * root. The process is specified using a thread, which for locking - * reasons, should be curthread. A better API might pass in a reference - * to struct filedesc * to specify what root to use. + * reasons, (must) should be curthread. A better API might pass in a + * reference to struct filedesc * to specify what root to use. */ int -vn_fullpath_thread(struct thread *td, struct vnode *vn, char **retbuf, - char **freebuf) +vn_fullpath_proc(struct thread *td, struct vnode *vn, char *buf, + u_int buflen) { struct filedesc *fdp; int error; @@ -1031,7 +1026,7 @@ */ fdp = td->td_proc->p_fd; FILEDESC_LOCK(fdp); - error = vn_fullpath(fdp->fd_rdir, vn, retbuf, freebuf); + error = vn_fullpath(fdp->fd_rdir, vn, buf, buflen); FILEDESC_UNLOCK(fdp); return (error); } ==== //depot/projects/trustedbsd/audit2/sys/sys/vnode.h#3 (text+ko) ==== @@ -609,12 +609,12 @@ int lease_check(struct vop_lease_args *ap); int spec_vnoperate(struct vop_generic_args *); int speedup_syncer(void); -#define textvp_fullpath(p, rb, rfb) \ - vn_fullpath_thread(FIRST_THREAD_IN_PROC(p), (p)->p_textvp, rb, rfb) +#define textvp_fullpath(p, rb, rbl) \ + vn_fullpath_proc(FIRST_THREAD_IN_PROC(p), (p)->p_textvp, rb, rbl) int vn_fullpath(struct vnode *optional_root, struct vnode *vn, - char **retbuf, char **freebuf); -int vn_fullpath_thread(struct thread *td, struct vnode *vn, - char **retbuf, char **freebuf); + char *buf, u_int buflen); +int vn_fullpath_proc(struct thread *td, struct vnode *vn, + char *buf, u_int buflen); int vaccess(enum vtype type, mode_t file_mode, uid_t uid, gid_t gid, mode_t acc_mode, struct ucred *cred, int *privused); int vaccess_acl_posix1e(enum vtype type, uid_t file_uid,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200401130455.i0D4t4ug097659>