Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Aug 2009 12:51:16 +0000 (UTC)
From:      Stanislav Sedov <stas@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r196015 - projects/libprocstat/usr.bin/fstat
Message-ID:  <200908011251.n71CpGRZ081401@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: stas
Date: Sat Aug  1 12:51:16 2009
New Revision: 196015
URL: http://svn.freebsd.org/changeset/base/196015

Log:
  - Fix resource deallocation routines.

Modified:
  projects/libprocstat/usr.bin/fstat/fstat.c
  projects/libprocstat/usr.bin/fstat/fuser.c
  projects/libprocstat/usr.bin/fstat/libprocstat.c
  projects/libprocstat/usr.bin/fstat/libprocstat.h

Modified: projects/libprocstat/usr.bin/fstat/fstat.c
==============================================================================
--- projects/libprocstat/usr.bin/fstat/fstat.c	Sat Aug  1 12:50:07 2009	(r196014)
+++ projects/libprocstat/usr.bin/fstat/fstat.c	Sat Aug  1 12:51:16 2009	(r196015)
@@ -71,8 +71,8 @@ int	vflg;	/* be verbose */
 
 typedef struct devs {
 	struct devs	*next;
-	long		fsid;
-	long		ino;
+	uint32_t	fsid;
+	uint64_t	ino;
 	const char	*name;
 } DEVS;
 
@@ -194,7 +194,6 @@ do_fstat(int argc, char **argv)
 			continue;
 		dofiles(procstat, &p[i]);
 	}
-	free(p);
 	procstat_freeprocs(procstat, p);
 	procstat_close(procstat);
 	return (0);
@@ -452,7 +451,7 @@ print_vnode_info(struct procstat *procst
 	else {
 		strmode(vn.vn_mode, mode);
 	}
-	(void)printf(" %6ld %10s", vn.vn_fileid, mode);
+	(void)printf(" %6lld %10s", vn.vn_fileid, mode);
 
 	if (vn.vn_type == PS_FST_VTYPE_VBLK || vn.vn_type == PS_FST_VTYPE_VCHR) {
 		if (nflg || !*vn.vn_devname)
@@ -461,7 +460,7 @@ print_vnode_info(struct procstat *procst
 			printf(" %6s", vn.vn_devname);
 		}
 	} else
-		printf(" %6lu", vn.vn_size);
+		printf(" %6llu", vn.vn_size);
 	print_access_flags(fst->fs_fflags);
 }
 

Modified: projects/libprocstat/usr.bin/fstat/fuser.c
==============================================================================
--- projects/libprocstat/usr.bin/fstat/fuser.c	Sat Aug  1 12:50:07 2009	(r196014)
+++ projects/libprocstat/usr.bin/fstat/fuser.c	Sat Aug  1 12:51:16 2009	(r196015)
@@ -162,7 +162,7 @@ int
 do_fuser(int argc, char *argv[])
 {
 	struct consumer *consumer;
-	struct kinfo_proc *p;
+	struct kinfo_proc *p, *procs;
 	struct procstat *procstat;
 	struct reqfile *reqfiles;
 	char *ep, *nlistf, *memf;
@@ -242,13 +242,14 @@ do_fuser(int argc, char *argv[])
 	procstat = procstat_open(nlistf, memf);
 	if (procstat == NULL)
 		errx(1, "procstat_open()");
-	p = procstat_getprocs(procstat, KERN_PROC_PROC, 0, &cnt);
-	if (p == NULL)
+	procs = procstat_getprocs(procstat, KERN_PROC_PROC, 0, &cnt);
+	if (procs == NULL)
 		 errx(1, "procstat_getprocs()");
 
 	/*
 	 * Walk through process table and look for matching files.
 	 */
+	p = procs;
 	while(cnt--)
 		if (p->ki_stat != SZOMB)
 			dofiles(procstat, p++, reqfiles, nfiles);
@@ -271,7 +272,7 @@ do_fuser(int argc, char *argv[])
 		}
 		(void)fprintf(stderr, "\n");
 	}
-	procstat_freeprocs(procstat, p);
+	procstat_freeprocs(procstat, procs);
 	procstat_close(procstat);
 	free(reqfiles);
 	return (0);

Modified: projects/libprocstat/usr.bin/fstat/libprocstat.c
==============================================================================
--- projects/libprocstat/usr.bin/fstat/libprocstat.c	Sat Aug  1 12:50:07 2009	(r196014)
+++ projects/libprocstat/usr.bin/fstat/libprocstat.c	Sat Aug  1 12:51:16 2009	(r196015)
@@ -101,10 +101,10 @@ int     statfs(const char *, struct stat
 #define	PROCSTAT_SYSCTL	2
 
 static char	*getmnton(kvm_t *kd, struct mount *m);
-static struct filestat_list	*procstat_getfiles_kvm(kvm_t *kd,
-    struct kinfo_proc *kp, int mmapped);
+static struct filestat_list	*procstat_getfiles_kvm(
+    struct procstat *procstat, struct kinfo_proc *kp, int mmapped);
 static struct filestat_list	*procstat_getfiles_sysctl(
-    struct kinfo_proc *kp, int mmapped);
+    struct procstat *procstat, struct kinfo_proc *kp, int mmapped);
 static int	procstat_get_pipe_info_sysctl(struct filestat *fst,
     struct pipestat *pipe, char *errbuf);
 static int	procstat_get_pipe_info_kvm(kvm_t *kd, struct filestat *fst,
@@ -239,9 +239,9 @@ procstat_getfiles(struct procstat *procs
 {
 	
 	if (procstat->type == PROCSTAT_SYSCTL)
-		return (procstat_getfiles_sysctl(kp, mmapped));
+		return (procstat_getfiles_sysctl(procstat, kp, mmapped));
 	else if (procstat->type == PROCSTAT_KVM)
-		 return (procstat_getfiles_kvm(procstat->kd, kp, mmapped));
+		 return (procstat_getfiles_kvm(procstat, kp, mmapped));
 	else
 		return (NULL);
 }
@@ -251,13 +251,13 @@ procstat_freefiles(struct procstat *proc
 {
 	struct filestat *fst, *tmp;
 
-	STAILQ_FOREACH_SAFE(fst, head, next, tmp) {
-		if (procstat->type == PROCSTAT_SYSCTL &&
-		    fst->fs_typedep != NULL)
-			free(fst->fs_typedep);
+	STAILQ_FOREACH_SAFE(fst, head, next, tmp)
 		free(fst);
-	}
 	free(head);
+	if (procstat->vmentries != NULL)
+		free (procstat->vmentries);
+	if (procstat->files != NULL)
+		free (procstat->files);
 }
 
 static struct filestat *
@@ -314,26 +314,30 @@ getctty(kvm_t *kd, struct kinfo_proc *kp
 }
 
 static struct filestat_list *
-procstat_getfiles_kvm(kvm_t *kd, struct kinfo_proc *kp, int mmapped)
+procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmapped)
 {
 	struct file file;
 	struct filedesc filed;
 	struct vm_map_entry vmentry;
 	struct vm_object object;
 	struct vmspace vmspace;
-	struct vnode *vp;
 	vm_map_entry_t entryp;
 	vm_map_t map;
 	vm_object_t objp;
+	struct vnode *vp;
 	struct file **ofiles;
 	struct filestat *entry;
 	struct filestat_list *head;
+	kvm_t *kd;
 	void *data;
 	int i, fflags;
 	int prot, type;
 	unsigned int nfiles;
 
-	assert(kd);
+	assert(procstat);
+	kd = procstat->kd;
+	if (kd == NULL)
+		return (NULL);
 	if (kp->ki_fd == NULL)
 		return (NULL);
 	if (!kvm_read_all(kd, (unsigned long)kp->ki_fd, &filed,
@@ -601,7 +605,7 @@ kinfo_uflags2fst(int fd)
 }
 
 static struct filestat_list *
-procstat_getfiles_sysctl(struct kinfo_proc *kp, int mmapped)
+procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int mmapped)
 {
 	struct kinfo_file *kif, *files;
 	struct kinfo_vmentry *kve, *vmentries;
@@ -619,6 +623,7 @@ procstat_getfiles_sysctl(struct kinfo_pr
 		warn("kinfo_getfile()");
 		return (NULL);
 	}
+	procstat->files = files;
 
 	/*
 	 * Allocate list head.
@@ -644,6 +649,7 @@ procstat_getfiles_sysctl(struct kinfo_pr
 	}
 	if (mmapped != 0) {
 		vmentries = kinfo_getvmmap(kp->ki_pid, &cnt);
+		procstat->vmentries = vmentries;
 		if (vmentries == NULL || cnt == 0)
 			goto fail;
 		for (i = 0; i < cnt; i++) {

Modified: projects/libprocstat/usr.bin/fstat/libprocstat.h
==============================================================================
--- projects/libprocstat/usr.bin/fstat/libprocstat.h	Sat Aug  1 12:50:07 2009	(r196014)
+++ projects/libprocstat/usr.bin/fstat/libprocstat.h	Sat Aug  1 12:51:16 2009	(r196015)
@@ -90,8 +90,10 @@
 #define	PS_FST_FFLAG_HASLOCK	0x4000
 
 struct procstat {
-        int     type;
-        kvm_t   *kd;
+	int	type;
+	kvm_t	*kd;
+	void	*vmentries;
+	void	*files;
 };
 struct filestat {
 	int	fs_type;	/* Descriptor type. */



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