ports/93215: [PATCH] make evolution not OOM on amd64
Eric Anholt
anholt at FreeBSD.org
Sun Feb 12 01:00:14 UTC 2006
>Number: 93215
>Category: ports
>Synopsis: [PATCH] make evolution not OOM on amd64
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sun Feb 12 01:00:13 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Eric Anholt
>Release: FreeBSD 7.0-CURRENT amd64
>Organization:
>Environment:
System: FreeBSD leguin.anholt.net 7.0-CURRENT FreeBSD 7.0-CURRENT #26: Mon Dec 26 02:08:57 PST 2005 anholt at leguin.anholt.net:/usr/obj/usr/src/current/sys/MYKERNEL amd64
>Description:
On my amd64 desktop for the last month or so, evolution has been
triggering the OOM killer at startup. It would allocate and page in as
much of ~64GB as it could, and the backtrace while it was busy doing
this was (trimmed):
#0 0x000000080579c4f4 in memset () from /lib/libc.so.6
#1 0x000000080573a7d6 in reallocf () from /lib/libc.so.6
#2 0x000000080573bc17 in malloc () from /lib/libc.so.6
#3 0x00000008069d6ecf in cobject_state_read (obj=0x20f2bb0, fp=0x8058d5b00)
at camel-object.c:457
#4 0x00000008069d9a84 in camel_object_state_read (vo=0x20f2bb0)
at camel-object.c:1814
#5 0x000000080a6439ad in camel_local_folder_construct (lf=0x20f2bb0,
parent_store=0x20ef470, full_name=0x8091c0369 "Inbox", flags=1,
ex=0x1000000030) at camel-local-folder.c:245
#6 0x000000080a646d35 in camel_mbox_folder_new (parent_store=0x20ef470,
full_name=0x8091c0369 "Inbox", flags=1, ex=0x7fffffffe140)
at camel-mbox-folder.c:126
#7 0x000000080a647c49 in get_folder (store=0x20ef470,
folder_name=0x8091c0369 "Inbox", flags=1, ex=0x7fffffffe140)
at camel-mbox-store.c:206
#8 0x0000000808568985 in camel_store_get_folder (store=0x20ef470,
folder_name=0x8091c0369 "Inbox", flags=1, ex=0x7fffffffe140)
at camel-store.c:261
#9 0x00000008091940b9 in mc_setup_local_store ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
#10 0x00000008091954e2 in mail_component_get_folder ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
#11 0x000000080919f786 in setup_send_data ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
#12 0x00000008091a0f28 in mail_receive_uri ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
#13 0x00000008091a1151 in auto_timeout ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
#14 0x00000008091a13cf in auto_online ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
li#15 0x00000008069d8edb in camel_object_trigger_event (vo=0x857f52000,
name=0x214fc10 "PM\035\002", event_data=0x1) at camel-object.c:1502
q
#16 0x0000000808564144 in camel_session_set_online (session=0x857f52000,
online=165) at camel-session.c:443
#17 0x0000000809195b03 in impl_setLineStatus ()
from /usr/X11R6/lib/evolution/2.4/components/libevolution-mail.so
#18 0x00000008029ed76e in ORBit_c_stub_invoke ()
from /usr/local/lib/libORBit-2.so.0
#19 0x0000000800654ad8 in GNOME_Evolution_Component_setLineStatus ()
from /usr/X11R6/lib/evolution/2.4/libeshell.so.0
#20 0x00000000004138b9 in e_shell_attempt_upgrade ()
#21 0x0000000000414e50 in e_shell_construct ()
#22 0x0000000000414edb in e_shell_new ()
#23 0x000000000041674b in es_menu_hook_get_type ()
#24 0x000000080524c6cd in g_main_context_dispatch ()
from /usr/local/lib/libglib-2.0.so.0
#25 0x000000080524e3a1 in g_main_context_acquire ()
from /usr/local/lib/libglib-2.0.so.0
#26 0x000000080524e745 in g_main_loop_run ()
from /usr/local/lib/libglib-2.0.so.0
#27 0x000000080261a9ab in bonobo_main () from /usr/local/lib/libbonobo-2.so.0
#28 0x0000000000416c67 in main ()
Line 457 of camel-object.c is:
if (!(argv = g_try_malloc (sizeof (*argv) + (count - CAMEL_ARGV_MAX) * sizeof (argv->argv[0]))))
In my only sample, "count" was 1 (CAMEL_ARGV_MAX is a define of 20).
I'm thinking there was some issue with type promotion that made it
try to allocate a negative (i.e. huge) number of bytes, but I haven't
justified to myself that it was. Removing the
"(count - CAMEL_ARGV_MAX) * sizeof (argv->argv[0])" got it to start up.
>How-To-Repeat:
>Fix:
--- evoltion-no-oom.diff begins here ---
Index: Makefile
===================================================================
RCS file: /home/ncvs/ports/databases/evolution-data-server/Makefile,v
retrieving revision 1.20
diff -u -r1.20 Makefile
--- Makefile 4 Dec 2005 23:15:05 -0000 1.20
+++ Makefile 12 Feb 2006 00:44:01 -0000
@@ -8,7 +8,7 @@
PORTNAME= evolution-data-server
PORTVERSION= 1.4.2.1
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= databases gnome
MASTER_SITES= ${MASTER_SITE_GNOME}
MASTER_SITE_SUBDIR= sources/${PORTNAME}/1.4
Index: files/patch-camel-object.c
===================================================================
RCS file: files/patch-camel-object.c
diff -N files/patch-camel-object.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/patch-camel-object.c 12 Feb 2006 00:43:36 -0000
@@ -0,0 +1,11 @@
+--- camel/camel-object.c.orig Sat Feb 11 16:43:24 2006
++++ camel/camel-object.c Sat Feb 11 16:43:27 2006
+@@ -454,7 +454,7 @@
+ }
+
+ /* we batch up the properties and set them in one go */
+- if (!(argv = g_try_malloc (sizeof (*argv) + (count - CAMEL_ARGV_MAX) * sizeof (argv->argv[0]))))
++ if (!(argv = g_try_malloc (sizeof (*argv))))
+ return -1;
+
+ argv->argc = 0;
--- evoltion-no-oom.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list