severity 133640 important thanks This bug would be 'grave' if hurd-i386 was a released architecture. Basically, it makes every init-script running S-S-D segfault when called as 'stop' or 'restart'. This completely breaks package updates of daemons.
I've tested the below patch now for a couple of weeks and it works well. The patch still applies cleanly, albeit with a bit of fuzz. See http://lists.debian.org/debian-hurd/2004/04/msg00037.html and http://lists.debian.org/debian-hurd/2004/05/index.html as well as their follow-ups for some feedback. I've also built dpkg on GNU/Linux with this patch and I did not experience a regression there. I've just talked to Neal again and he still thinks the patch is good. So, could you please apply it for your next upload? This is really a nasty showstopper for the Hurd port right now. Thanks, Michael On Sat, Feb 23, 2002 at 05:00:07PM -0500, Neal H Walfield wrote: > Here is a patch to fix the problem. I am not sure that it is the best > fix as I do not completely understand the internal interfaces. > > What I have gathered is that do_procinit is a misnomer. From > examining the other implementations (for OpenBSD, Linux and SunOS > based systems), I conclude that it is only used to verify that the > /proc filesystem is mounted and is not in fact an initialization > routine. I reach this later conclusion based on the fact that it is > not consistently called. > > My solution is to empty do_procinit (the Hurd implementation does not > depend on it) and introduce a new constructor (do_libpsinit) to > initialize some structures that we use for libps. This fixes the > reported segmentation fault. > > In fixing the segmentation fault, I ran across two other bugs in the > Hurd implementation: pid_is_user throws a fatal error if the pid does > not exist as does pid_is_cmd. Instead, they should just return > failure. The attached patch also fixes this. > > Thanks. > > --- start-stop-daemon.c.orig Sat Feb 23 16:18:02 2002 > +++ start-stop-daemon.c Sat Feb 23 16:45:46 2002 > @@ -628,9 +628,10 @@ pid_is_user(pid_t pid, uid_t uid) > return 0; > return (sb.st_uid == uid); > pstat = proc_stat_list_pid_proc_stat (procset, pid); > - if (pstat == NULL) > - fatal ("Error getting process information: NULL proc_stat > struct"); > - proc_stat_set_flags (pstat, PSTAT_PID | PSTAT_OWNER_UID); > + if (pstat) > + proc_stat_set_flags (pstat, PSTAT_PID | PSTAT_OWNER_UID); > + else > + return 1; > return (pstat->owner_uid == uid); > } > > @@ -639,9 +640,10 @@ pid_is_cmd(pid_t pid, const char *name) > { > struct proc_stat *pstat; > pstat = proc_stat_list_pid_proc_stat (procset, pid); > - if (pstat == NULL) > - fatal ("Error getting process information: NULL proc_stat > struct"); > - proc_stat_set_flags (pstat, PSTAT_PID | PSTAT_ARGS); > + if (pstat) > + proc_stat_set_flags (pstat, PSTAT_PID | PSTAT_ARGS); > + else > + return 1; > return (!strcmp (name, pstat->args)); > } > #endif /* OSHURD */ > @@ -722,6 +724,14 @@ check_all (void *ptr) > > static void > do_procinit(void) > +{ > + /* Nothing to do. */ > +} > + > +static void do_libpsinit(void) __attribute__ ((constructor)); > + > +static void > +do_libpsinit(void) > { > struct ps_context *context; > error_t err; > > >

