From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Philipp Stephani
--001a113e54cae660870553e9d40c--The following dynamic module takes unbounded memory:=/* gcc -I . -g -ggdb -fPIC foo.c -shared -o foo.s= o && echo running && emacs -Q -L . -batch -l foo */<= br>#include <emacs-module.h>int plugin_= is_GPL_compatible;= int emacs_module_init(struct em= acs_runtime *ert) {=C2=A0 emacs_env *env =3D ert->get_environ= ment(ert);=C2=A0 while (1) {=C2=A0 =C2=A0 int i;=C2=A0 =C2=A0 for (i =3D 0; i < 10000; i++) {=C2=A0 =C2= =A0 =C2=A0 emacs_value v =3D env->make_string(env, "asdads", 3= );=C2=A0 =C2=A0 =C2=A0 env->free_global_ref(env, env->make= _global_ref(env, v));=C2=A0 =C2=A0 }=C2=A0 =C2=A0 e= nv->funcall(env, env->intern(env, "garbage-collect"), 0, NU= LL);=C2=A0 }}
<= /div>This is because env->make_global_ref/env->free_global_ref leak mem= ory.env->free_global_ref fails to remove values from the hash= table ofrefcounts. The following patch makes the program above = run in constantspace.<= font face=3D"arial, helvetica, sans-serif">=--= - src/emacs-module.c 2017-06-30= 16:00:36.776301646 -0400+++ src/emacs-module.c 2017-06-30 16:05:01.660120043 -0400@= @ -308,7 +308,7 @@=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0set_h= ash_value_slot (h, i, value);=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}= =C2=A0 =C2=A0 =C2=A0 =C2=A0else- hash_remove_from_table (h, value);+ hash_remove_from_table (h, obj);=C2=A0 =C2=A0 =C2=A0}=C2=A0} =Good catch, installed as 22af6= 9906cca871fdb893e06d6f10dbbab4518e6.=C2=A0