OBS User unknown 2009-01-29 00:08:29 +00:00 committed by Git OBS Bridge
parent 5c042ce76b
commit dffb94a35a
5 changed files with 167 additions and 46 deletions

View File

@ -114,8 +114,8 @@
+.SH AUTHOR +.SH AUTHOR
+Werner Fink <werner@suse.de> +Werner Fink <werner@suse.de>
--- mkill.c --- mkill.c
+++ mkill.c 2008-12-12 14:30:48.817075022 +0100 +++ mkill.c 2009-01-28 16:36:35.524201270 +0100
@@ -0,0 +1,684 @@ @@ -0,0 +1,728 @@
+/* +/*
+ * mkill.c Send a signal to all processes accessing a mount point + * mkill.c Send a signal to all processes accessing a mount point
+ * + *
@ -186,6 +186,7 @@
+ proc_t * this, *ptr, * last; + proc_t * this, *ptr, * last;
+ struct dirent * dent; + struct dirent * dent;
+ int num, nsig = SIGTERM; + int num, nsig = SIGTERM;
+ struct stat st;
+ boolean found; + boolean found;
+ DIR * proc; + DIR * proc;
+ +
@ -261,7 +262,7 @@
+ name[len] = '\0'; + name[len] = '\0';
+ if (check(name)) { + if (check(name)) {
+ add_proc((pid_t)atol(dent->d_name)); + add_proc((pid_t)atol(dent->d_name));
+ continue; + goto fuse;
+ } + }
+ +
+ *slash = '\0'; + *slash = '\0';
@ -274,7 +275,7 @@
+ name[len] = '\0'; + name[len] = '\0';
+ if (check(name)) { + if (check(name)) {
+ add_proc((pid_t)atol(dent->d_name)); + add_proc((pid_t)atol(dent->d_name));
+ continue; + goto fuse;
+ } + }
+ +
+ *slash = '\0'; + *slash = '\0';
@ -285,9 +286,11 @@
+ if ((len = readlink(path, name, PATH_MAX)) < 0) + if ((len = readlink(path, name, PATH_MAX)) < 0)
+ continue; + continue;
+ name[len] = '\0'; + name[len] = '\0';
+ if (strncmp(name, "/sbin/udevd", 11) == 0)
+ continue;
+ if (check(name)) { + if (check(name)) {
+ add_proc((pid_t)atol(dent->d_name)); + add_proc((pid_t)atol(dent->d_name));
+ continue; + goto fuse;
+ } + }
+ +
+ *slash = '\0'; + *slash = '\0';
@ -313,9 +316,10 @@
+ +
+ if (found) { + if (found) {
+ add_proc((pid_t)atol(dent->d_name)); + add_proc((pid_t)atol(dent->d_name));
+ continue; + goto fuse;
+ } + }
+ +
+ fuse:
+ *(slash+strlen(dent->d_name)) = '\0'; + *(slash+strlen(dent->d_name)) = '\0';
+ strcat(slash, "/fd"); + strcat(slash, "/fd");
+ +
@ -324,6 +328,7 @@
+ strcat(slash, "/"); + strcat(slash, "/");
+ flen = strlen(path); + flen = strlen(path);
+ while ((dfd = readdir(fdir)) != (struct dirent*)0) { + while ((dfd = readdir(fdir)) != (struct dirent*)0) {
+ boolean isfuse = false;
+ +
+ if (*dfd->d_name == '.') + if (*dfd->d_name == '.')
+ continue; + continue;
@ -337,15 +342,39 @@
+ continue; + continue;
+ name[len] = '\0'; + name[len] = '\0';
+ +
+ if (check(name)) { + if (strcmp("/dev/fuse", name) == 0)
+ found = true; + isfuse = true;
+
+ if (found) {
+ if (isfuse) {
+ this = procs;
+ last = (proc_t*)0;
+
+ for (ptr = procs; this; ptr = this) {
+ last = ptr->prev;
+ this = ptr->next;
+ if (ptr == procs) {
+ if (this) this->prev = (proc_t*)0;
+ procs = this;
+ } else if (last) {
+ if (this) this->prev = last;
+ last->next = this;
+ }
+ free(ptr);
+ }
+ break; + break;
+ } + }
+ continue;
+ }
+
+ if ((*name == '/') && check(name)) {
+ if (isfuse)
+ break;
+ found = true;
+ add_proc((pid_t)atol(dent->d_name));
+ }
+ } + }
+ (void)closedir(fdir); + (void)closedir(fdir);
+
+ if (found)
+ add_proc((pid_t)atol(dent->d_name));
+ } + }
+ (void)closedir(proc); + (void)closedir(proc);
+ clear_mnt(); + clear_mnt();
@ -370,7 +399,11 @@
+ if (num > 0) + if (num > 0)
+ putc('\n', stdout); + putc('\n', stdout);
+ +
+ num = 3000000; + if (stat("/fastboot", &st) < 0)
+ num = 2000000;
+ else
+ num = 6000000;
+
+ if (nsig == SIGTERM) while (found) { + if (nsig == SIGTERM) while (found) {
+ +
+ if ((num <= 0) || !found) + if ((num <= 0) || !found)
@ -401,6 +434,17 @@
+ } + }
+ } + }
+ +
+ if ((nsig == SIGTERM) && found) {
+ this = procs;
+ last = (proc_t*)0;
+ for (ptr = procs; this; ptr = this) {
+ last = ptr->prev;
+ this = ptr->next;
+
+ kill(ptr->pid, SIGKILL);
+ }
+ }
+
+ return 0; + return 0;
+} +}
+ +

View File

@ -1,5 +1,5 @@
--- makeboot.c --- makeboot.c
+++ makeboot.c 2008-08-13 16:34:52.985916688 +0200 +++ makeboot.c 2009-01-27 16:56:43.184201291 +0100
@@ -13,6 +13,12 @@ @@ -13,6 +13,12 @@
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
@ -13,7 +13,30 @@
int tree_entries = 0; int tree_entries = 0;
@@ -158,11 +164,28 @@ void parse_makefile(const char *path) @@ -103,6 +109,8 @@ static int check_loop(struct makenode *d
fprintf(stderr, "loop exists %s in %s!\n", dep->name, src->name);
return 1;
}
+ if (loop++ > 999)
+ return 1;
if (check_loop(s->node, src))
return 1;
}
@@ -112,11 +120,13 @@ static int check_loop(struct makenode *d
/*
* add to the dependecy and selection lists
*/
+static int loop;
static void add_depend(struct makenode *node, const char *dst)
{
struct makenode *dep;
dep = add_target(dst);
+ loop = 0;
if (check_loop(dep, node))
return;
dep->select = new_list(node, dep->select);
@@ -158,11 +168,28 @@ void parse_makefile(const char *path)
char *s, *strp, *p; char *s, *strp, *p;
struct makenode *node; struct makenode *node;
@ -24,9 +47,10 @@
+ if (getuid() == (uid_t)0) + if (getuid() == (uid_t)0)
+ o_flags |= O_NOATIME; + o_flags |= O_NOATIME;
+ if ((fd = open(path, o_flags)) < 0) { + if ((fd = open(path, o_flags)) < 0) {
+ fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno)); fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
+ exit(1); exit(1);
+ } }
-
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_WILLNEED);
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);
+ (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE); + (void)posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE);
@ -36,15 +60,14 @@
+ if ((fp = fopen(path, "r")) == NULL) + if ((fp = fopen(path, "r")) == NULL)
+#endif +#endif
+ { + {
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno)); + fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
exit(1); + exit(1);
} + }
-
+ +
while (fgets(buf, sizeof(buf), fp)) { while (fgets(buf, sizeof(buf), fp)) {
for (s = buf; *s && isspace(*s); s++) for (s = buf; *s && isspace(*s); s++)
; ;
@@ -198,6 +221,11 @@ void parse_makefile(const char *path) @@ -198,6 +225,11 @@ void parse_makefile(const char *path)
} }
} }
} }
@ -56,7 +79,7 @@
fclose(fp); fclose(fp);
for (node = tree_list; node; node = node->next) { for (node = tree_list; node; node = node->next) {
@@ -234,7 +262,17 @@ static void filter_files(const char *dir @@ -234,7 +266,17 @@ static void filter_files(const char *dir
filter_prefix = prefix; filter_prefix = prefix;
snprintf(path, sizeof(path), "/etc/init.d/%s.d", dir); snprintf(path, sizeof(path), "/etc/init.d/%s.d", dir);
@ -74,7 +97,7 @@
/* mark all matching nodes */ /* mark all matching nodes */
for (i = 0; i < ndirs; i++) { for (i = 0; i < ndirs; i++) {
t = lookup_target(dirlist[i]->d_name + 3); t = lookup_target(dirlist[i]->d_name + 3);
@@ -342,6 +380,17 @@ struct makenode *pickup_task(void) @@ -342,6 +384,17 @@ struct makenode *pickup_task(void)
} }
} }
if (best) { if (best) {
@ -92,7 +115,7 @@
blogger("service %s", best->name); blogger("service %s", best->name);
best->status = T_RUNNING; best->status = T_RUNNING;
} }
@@ -359,6 +408,17 @@ void finish_task(struct makenode *node) @@ -359,6 +412,17 @@ void finish_task(struct makenode *node)
return; return;
for (n = node->select; n; n = n->next) for (n = node->select; n; n = n->next)
n->node->num_deps--; n->node->num_deps--;

View File

@ -1,13 +1,21 @@
--- src/killall5.c --- src/killall5.c
+++ src/killall5.c 2008-10-01 18:05:29.829808878 +0200 +++ src/killall5.c 2009-01-27 16:32:40.048701097 +0100
@@ -456,6 +456,39 @@ int readproc() @@ -59,6 +59,8 @@ typedef struct proc {
return 0; pid_t pid; /* Process ID. */
int sid; /* Session ID. */
char kernel; /* Kernel thread or zombie. */
+ char isfuse; /* Provides FUSE filesystems */
+ char isudev; /* Is the uevent handler */
char nfs; /* Binary is loacted on NFS part. */
struct proc *next; /* Pointer to next struct. */
} PROC;
@@ -283,6 +285,38 @@ int readarg(FILE *fp, char *buf, int sz)
} }
+/* /*
+ * Scan the filedescriptors of pid for /dev/fuse + * Scan the filedescriptors of pid for /dev/fuse
+ */ + */
+int is_fuse(int pid) { +int is_fuse(const char *pid) {
+ DIR *dir; + DIR *dir;
+ char path[256]; + char path[256];
+ char buf[256]; + char buf[256];
@ -15,19 +23,18 @@
+ ssize_t len; + ssize_t len;
+ +
+ /* Open /proc/pid/fd/ */ + /* Open /proc/pid/fd/ */
+ snprintf(path, sizeof(path), "/proc/%d/fd", pid); + snprintf(path, sizeof(path), "/proc/%s/fd", pid);
+ if ((dir = opendir(path)) != NULL) { + if ((dir = opendir(path)) != NULL) {
+ int dfd = dirfd(dir);
+ /* Walk through the directory. */ + /* Walk through the directory. */
+ while ((d = readdir(dir)) != NULL) { + while ((d = readdir(dir)) != NULL) {
+ if (*d->d_name == '.') + if (*d->d_name == '.')
+ continue; + continue;
+ /* check for /dev/fuse */ + /* check for /dev/fuse */
+ snprintf(path, sizeof(path), "/proc/%d/fd/%s", pid, d->d_name); + if ((len = readlinkat(dfd, d->d_name, buf, sizeof(buf))) > 0) {
+ if ((len = readlink(path, buf, sizeof(buf))) > 0) { + buf[len] = '\0';
+ if (strncmp("/dev/fuse", buf, len) == 0) { + if (strcmp("/dev/fuse", buf) == 0)
+ /* Fuse filesystem */ + return 1; /* Fuse filesystem */
+ return 1;
+ }
+ } + }
+ } + }
+ closedir(dir); + closedir(dir);
@ -37,10 +44,32 @@
+ return 0; + return 0;
+} +}
+ +
PIDQ_HEAD *init_pid_q(PIDQ_HEAD *q) +/*
{ * Read the proc filesystem.
q->head = q->next = q->tail = NULL; */
@@ -779,11 +812,11 @@ int main(int argc, char **argv) int readproc()
@@ -438,13 +472,19 @@ int readproc()
/* Try to stat the executable. */
snprintf(path, sizeof(path), "/proc/%s/exe", d->d_name);
- if (check4nfs(path, NULL))
+ if (check4nfs(path, buf))
p->nfs = 1;
if ((p->nfs == 0) && (stat(path, &st) == 0)) {
p->dev = st.st_dev;
p->ino = st.st_ino;
}
+ /* Check for uevent handler */
+ p->isudev = (strncmp(buf, "/sbin/udevd", 11) == 0);
+
+ /* Check for provider of FUSE filesystems */
+ p->isfuse = is_fuse(d->d_name);
+
/* Link it into the list. */
p->next = plist;
plist = p;
@@ -779,14 +819,16 @@ int main(int argc, char **argv)
exit(1); exit(1);
} }
@ -50,7 +79,12 @@
pid = (int)getpid(); pid = (int)getpid();
for (p = plist; p; p = p->next) { for (p = plist; p; p = p->next) {
- if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel) { - if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel) {
+ if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel || is_fuse(p->pid)) { + if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel || p->isfuse) {
kill(p->pid, SIGCONT); kill(p->pid, SIGCONT);
continue; continue;
} }
+ if (((sig == SIGTERM) || (sig == SIGKILL)) && p->isudev)
+ continue;
kill(p->pid, sig);
}

View File

@ -1,3 +1,16 @@
-------------------------------------------------------------------
Tue Jan 27 16:00:03 CET 2009 - werner@suse.de
- Do not terminate udevd with mkill(8)
- Do not terminate udevd with killall5(8)
- Avoid chrashing startpar due recursion caused by loops
-------------------------------------------------------------------
Mon Jan 26 12:02:43 CET 2009 - werner@suse.de
- Do not kill fuse user space processes with mkill(8) (bnc#466484)
- Minimize fuse patch for killall5(8) by using readlinkat(2)
------------------------------------------------------------------- -------------------------------------------------------------------
Wed Dec 10 14:27:34 CET 2008 - werner@suse.de Wed Dec 10 14:27:34 CET 2008 - werner@suse.de

View File

@ -1,7 +1,7 @@
# #
# spec file for package sysvinit (Version 2.86) # spec file for package sysvinit (Version 2.86)
# #
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. # Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany.
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -30,7 +30,7 @@ Group: System/Base
PreReq: coreutils PreReq: coreutils
AutoReqProv: on AutoReqProv: on
Version: 2.86 Version: 2.86
Release: 189 Release: 190
Summary: SysV-Style init Summary: SysV-Style init
BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: libselinux-devel libsepol-devel BuildRequires: libselinux-devel libsepol-devel
@ -321,6 +321,13 @@ rm -rf ${RPM_BUILD_ROOT}
%doc %{_mandir}/man8/mkill.8.gz %doc %{_mandir}/man8/mkill.8.gz
%changelog %changelog
* Tue Jan 27 2009 werner@suse.de
- Do not terminate udevd with mkill(8)
- Do not terminate udevd with killall5(8)
- Avoid chrashing startpar due recursion caused by loops
* Mon Jan 26 2009 werner@suse.de
- Do not kill fuse user space processes with mkill(8) (bnc#466484)
- Minimize fuse patch for killall5(8) by using readlinkat(2)
* Wed Dec 10 2008 werner@suse.de * Wed Dec 10 2008 werner@suse.de
- Mkill(8): add the option -0 for debugging and wait upto 3 seconds - Mkill(8): add the option -0 for debugging and wait upto 3 seconds
if a signal was send. if a signal was send.