On Mon, Aug 17, 2009 at 02:25:13PM +0200, Werner Fink wrote:
> On Sat, Aug 15, 2009 at 05:19:41PM +0200, Petter Reinholdtsen wrote:
> > [Raphael Geissert]
> > > As mentioned on IRC, when a virtual facility depends on itself
> > > insserv enters an infinite loop and starts leaking memory.
> >
> > Thank you. I've written this test case to reproduce the problem. CC
> > to upstream to let him know about the problem.
>
> OK, I've added a check to avoid such loops and also check to
> avoid that a scripts depends on a scripts which uses the
> system facility `$all' in its Required-Start.
>
> Does this work for you?
It hadn't worked for my on x86_64 due not initialized flags.
Please apply the following patch on top of the last patched
version to fix this.
Werner
--
"Having a smoking section in a restaurant is like having
a peeing section in a swimming pool." -- Edward Burr
--- insserv.c
+++ insserv.c 2009-08-18 11:36:07.000000000 +0200
@@ -222,8 +222,8 @@ typedef struct string {
typedef struct repl {
list_t r_list;
- ushort flags;
string_t r[1];
+ ushort flags;
} __align repl_t;
#define getrepl(arg) list_entry((arg), struct repl, r_list)
@@ -1880,6 +1880,7 @@ static void scan_conf_file(const char *r
if (posix_memalign((void*)&subst, sizeof(void*), alignof(repl_t)) != 0)
error("%s", strerror(errno));
insert(&subst->r_list, r_list->prev);
+ subst->flags = 0;
r = &subst->r[0];
if (posix_memalign((void*)&r->ref, sizeof(void*), alignof(typeof(r->ref))+strsize(token)) != 0)
error("%s", strerror(errno));
@@ -1909,6 +1910,7 @@ static void scan_conf_file(const char *r
error("%s", strerror(errno));
insert(&subst->r_list, r_list->prev);
r = &subst->r[0];
+ subst->flags = 0;
if (posix_memalign((void*)&r->ref, sizeof(void*), alignof(typeof(r->ref))+strsize(token)) != 0)
error("%s", strerror(errno));
*r->ref = 1;