summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059>2006-01-21 05:31:07 +0800
committermarcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059>2006-01-21 05:31:07 +0800
commite7c1b60d8c93a047e2c5669a57519e8096e9afff (patch)
treeb31773d1a7ff5b29ff88fc8c2efa5a49b1fa2849
parent89ef78ee50d4404c2868ea293a320c2efb7d1829 (diff)
downloadmarcuscom-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/Makefile3
-rw-r--r--devel/libgtop2/files/patch-systeps::freebsd::procmap.c152
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);
+ }