diff options
author | marcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059> | 2006-01-21 05:31:07 +0800 |
---|---|---|
committer | marcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059> | 2006-01-21 05:31:07 +0800 |
commit | e7c1b60d8c93a047e2c5669a57519e8096e9afff (patch) | |
tree | b31773d1a7ff5b29ff88fc8c2efa5a49b1fa2849 | |
parent | 89ef78ee50d4404c2868ea293a320c2efb7d1829 (diff) | |
download | marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.tar marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.tar.gz marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.tar.bz2 marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.tar.lz marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.tar.xz marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.tar.zst marcuscom-ports-e7c1b60d8c93a047e2c5669a57519e8096e9afff.zip |
jemalloc rules! Fix a long-standing memory corruption bug that caused
crashes in gnome-system-monitor.
git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@5473 df743ca5-7f9a-e211-a948-0013205c9059
-rw-r--r-- | devel/libgtop2/Makefile | 3 | ||||
-rw-r--r-- | devel/libgtop2/files/patch-systeps::freebsd::procmap.c | 152 |
2 files changed, 150 insertions, 5 deletions
diff --git a/devel/libgtop2/Makefile b/devel/libgtop2/Makefile index 0c114c00e..f32568d29 100644 --- a/devel/libgtop2/Makefile +++ b/devel/libgtop2/Makefile @@ -3,11 +3,12 @@ # Whom: Joe Marcus Clarke <marcus@FreeBSD.org> # # $FreeBSD: ports/devel/libgtop2/Makefile,v 1.96 2005/11/29 23:49:42 marcus Exp $ -# $MCom: ports/devel/libgtop2/Makefile,v 1.53 2005/12/15 20:05:47 marcus Exp $ +# $MCom: ports/devel/libgtop2/Makefile,v 1.54 2006/01/05 21:45:24 marcus Exp $ # PORTNAME= libgtop2 PORTVERSION= 2.13.2 +PORTREVISION= 1 CATEGORIES= devel gnome MASTER_SITES= ${MASTER_SITE_GNOME} MASTER_SITE_SUBDIR= sources/${PORTNAME:S/2$//}/2.13 diff --git a/devel/libgtop2/files/patch-systeps::freebsd::procmap.c b/devel/libgtop2/files/patch-systeps::freebsd::procmap.c index c8c701e46..a17e9595e 100644 --- a/devel/libgtop2/files/patch-systeps::freebsd::procmap.c +++ b/devel/libgtop2/files/patch-systeps::freebsd::procmap.c @@ -1,11 +1,155 @@ ---- sysdeps/freebsd/procmap.c Wed Feb 23 17:20:45 2005 -+++ sysdeps/freebsd/procmap.c.orig Sat Mar 19 02:46:57 2005 -@@ -129,7 +129,7 @@ +--- sysdeps/freebsd/procmap.c.orig Mon Dec 12 05:09:39 2005 ++++ sysdeps/freebsd/procmap.c Fri Jan 20 16:28:33 2006 +@@ -108,14 +108,16 @@ glibtop_get_proc_map_p (glibtop *server, + #else + struct vm_object object; + #endif +- glibtop_map_entry *maps; ++ GArray *maps = g_array_sized_new(FALSE, FALSE, ++ sizeof(glibtop_map_entry), ++ 100); + #if defined __FreeBSD__ + struct vnode vnode; + #if __FreeBSD_version < 500039 + struct inode inode; + #endif + #endif +- int count, i = 0; ++ int count; + int update = 0; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_PROC_MAP), 0); +@@ -123,15 +125,15 @@ glibtop_get_proc_map_p (glibtop *server, + memset (buf, 0, sizeof (glibtop_proc_map)); + + /* It does not work for the swapper task. */ +- if (pid == 0) return NULL; ++ if (pid == 0) return (glibtop_map_entry*) g_array_free(maps, TRUE); + + glibtop_suid_enter (server); + /* Get the process data */ pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count < 1)) { - glibtop_error_io_r (server, "kvm_getprocs (%d)", pid); +- return NULL; + glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); - return NULL; ++ return (glibtop_map_entry*) g_array_free(maps, TRUE); } + /* Now we get the memory maps. */ +@@ -159,8 +161,6 @@ glibtop_get_proc_map_p (glibtop *server, + + buf->total = buf->number * buf->size; + +- maps = g_malloc0(buf->total); +- + buf->flags = _glibtop_sysdeps_proc_map; + + /* Walk through the `vm_map_entry' list ... */ +@@ -170,6 +170,10 @@ glibtop_get_proc_map_p (glibtop *server, + * to OBJT_DEFAULT so if seems this really works. */ + + do { ++ glibtop_map_entry *mentry; ++ unsigned long inode, dev; ++ guint len; ++ + if (update) { + if (kvm_read (server->machine.kd, + (unsigned long) entry.next, +@@ -197,22 +201,6 @@ glibtop_get_proc_map_p (glibtop *server, + #endif + #endif + +- maps [i].flags = _glibtop_sysdeps_map_entry; +- +- maps [i].start = entry.start; +- maps [i].end = entry.end; +- maps [i].offset = entry.offset; +- +- maps [i].perm = 0; +- +- if (entry.protection & VM_PROT_READ) +- maps [i].perm |= GLIBTOP_MAP_PERM_READ; +- if (entry.protection & VM_PROT_WRITE) +- maps [i].perm |= GLIBTOP_MAP_PERM_WRITE; +- if (entry.protection & VM_PROT_EXECUTE) +- maps [i].perm |= GLIBTOP_MAP_PERM_EXECUTE; +- +- i++; + + #if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + if (!entry.object.uvm_obj) +@@ -224,7 +212,7 @@ glibtop_get_proc_map_p (glibtop *server, + (unsigned long) entry.object.uvm_obj, + &vnode, sizeof (vnode)) != sizeof (vnode)) { + glibtop_warn_io_r (server, "kvm_read (vnode)"); +- return NULL; ++ return (glibtop_map_entry*) g_array_free(maps, TRUE); + } + #else + if (!entry.object.vm_object) +@@ -251,8 +239,8 @@ glibtop_get_proc_map_p (glibtop *server, + &inode, sizeof (inode)) != sizeof (inode)) + glibtop_error_io_r (server, "kvm_read (inode)"); + +- maps [i-1].inode = inode.i_number; +- maps [i-1].device = inode.i_dev; ++ inode = inode.i_number; ++ dev = inode.i_dev; + #endif + + +@@ -274,8 +262,8 @@ glibtop_get_proc_map_p (glibtop *server, + switch (vnode.v_type) { + case VREG: + #if __FreeBSD_version < 600006 +- maps [i-1].inode = vnode.v_cachedid; +- maps [i-1].device = vnode.v_cachedfs; ++ inode = vnode.v_cachedid; ++ dev = vnode.v_cachedfs; + #endif + default: + continue; +@@ -289,11 +277,37 @@ glibtop_get_proc_map_p (glibtop *server, + &inode, sizeof (inode)) != sizeof (inode)) + glibtop_error_io_r (server, "kvm_read (inode)"); + +- maps [i-1].inode = inode.i_number; +- maps [i-1].device = inode.i_dev; ++ inode = inode.i_number; ++ dev = inode.i_dev; + #endif + #endif ++ len = maps->len; ++ g_array_set_size(maps, len + 1); ++ mentry = &g_array_index(maps, glibtop_map_entry, len); ++ ++ mentry->flags = _glibtop_sysdeps_map_entry; ++ ++ mentry->start = (guint64) entry.start; ++ mentry->end = (guint64) entry.end; ++ mentry->offset = (guint64) entry.offset; ++ mentry->device = (guint64) dev; ++ mentry->inode = (guint64) inode; ++ ++ mentry->perm = (guint64) 0; ++ ++ if (entry.protection & VM_PROT_READ) ++ mentry->perm |= GLIBTOP_MAP_PERM_READ; ++ if (entry.protection & VM_PROT_WRITE) ++ mentry->perm |= GLIBTOP_MAP_PERM_WRITE; ++ if (entry.protection & VM_PROT_EXECUTE) ++ mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE; + } while (entry.next != first); + +- return maps; ++ buf->flags = _glibtop_sysdeps_proc_map; ++ ++ buf->number = maps->len; ++ buf->size = sizeof (glibtop_map_entry); ++ buf->total = buf->number * buf->size; ++ ++ return (glibtop_map_entry*) g_array_free(maps, FALSE); + } |