bsc#1098697
OBS-URL: https://build.opensuse.org/package/show/Base:System/psmisc?expand=0&rev=102
This commit is contained in:
parent
a299387d88
commit
4753dc8186
@ -1,4 +1,4 @@
|
||||
From d7487838d0c79bd007e63e9ba9f7933cec40e3c9 Mon Sep 17 00:00:00 2001
|
||||
From 28805c3dda0ce9c78f046974454c0bb8dfee615b Mon Sep 17 00:00:00 2001
|
||||
From: Werner Fink <werner@suse.de>
|
||||
Date: Thu, 29 Jun 2017 15:18:28 +0200
|
||||
Subject: [PATCH] Use mountinfo to be able to use the mount identity
|
||||
@ -14,11 +14,11 @@ get the real mount ID for each file
|
||||
Signed-off-by: Werner Fink <werner@suse.de>
|
||||
---
|
||||
configure.ac | 18 +-
|
||||
src/fuser.c | 528 +++++++++++++++++++++++++++----------
|
||||
src/fuser.c | 540 +++++++++++++++++++++--------
|
||||
src/fuser.h | 19 +-
|
||||
testsuite/Makefile.am | 3 +-
|
||||
testsuite/killall.test/killall.exp | 4 +
|
||||
5 files changed, 424 insertions(+), 148 deletions(-)
|
||||
5 files changed, 436 insertions(+), 148 deletions(-)
|
||||
|
||||
diff --git configure.ac configure.ac
|
||||
index 176a2fc..d8d3366 100644
|
||||
@ -64,7 +64,7 @@ index 176a2fc..d8d3366 100644
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
diff --git src/fuser.c src/fuser.c
|
||||
index 31ef30c..a204f08 100644
|
||||
index 31ef30c..e5337cd 100644
|
||||
--- src/fuser.c
|
||||
+++ src/fuser.c
|
||||
@@ -32,6 +32,10 @@
|
||||
@ -227,11 +227,11 @@ index 31ef30c..a204f08 100644
|
||||
(unsigned long)this_name->st.st_dev,
|
||||
- (unsigned long)this_name->st.st_ino);
|
||||
+ (unsigned long)this_name->st.st_ino,
|
||||
+ mountinfo.id, mountinfo.isnfs ? "yes" : "no");
|
||||
+ mountinfo->id, mountinfo->isnfs ? "yes" : "no");
|
||||
#endif /* DEBUG */
|
||||
add_inode(ino_list, this_name, this_name->st.st_dev,
|
||||
this_name->st.st_ino);
|
||||
@@ -501,11 +515,39 @@ parse_mounts(struct names *this_name, struct device_list **dev_list,
|
||||
@@ -501,11 +515,51 @@ parse_mounts(struct names *this_name, struct device_list **dev_list,
|
||||
const opt_type opts)
|
||||
{
|
||||
dev_t match_device;
|
||||
@ -247,7 +247,17 @@ index 31ef30c..a204f08 100644
|
||||
+ count = 0;
|
||||
+ list_for_each(ptr, &mntinfo) {
|
||||
+ mntinfo_t *mnt = list_entry(ptr, mntinfo_t);
|
||||
+ if (match_device != mnt->dev || this_name->mnt_id != mnt->id)
|
||||
+ if (match_device != mnt->dev)
|
||||
+ continue;
|
||||
+ if (S_ISBLK(this_name->st.st_mode)) {
|
||||
+ /* Skip mount IDs check if a block device
|
||||
+ * was specified */
|
||||
+ this_name->mnt_id = mnt->id;
|
||||
+ add_device(dev_list, this_name, match_device);
|
||||
+ count++;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (this_name->mnt_id != mnt->id)
|
||||
+ continue;
|
||||
+ if (!mountinfo)
|
||||
+ mountinfo = mnt;
|
||||
@ -264,14 +274,16 @@ index 31ef30c..a204f08 100644
|
||||
+ errno = ENOTUNIQ;
|
||||
+ fprintf(stderr,
|
||||
+ _("The device %u:%u is not unique. Please change!\n"),
|
||||
+ major(mountinfo->dev), minor(mountinfo->dev));
|
||||
+ major(match_device), minor(match_device));
|
||||
+ /* return -1 */
|
||||
+ }
|
||||
+ if (S_ISBLK(this_name->st.st_mode))
|
||||
+ return 0;
|
||||
+ this_name->mnt_id = mountinfo->id;
|
||||
add_device(dev_list, this_name, match_device);
|
||||
return 0;
|
||||
}
|
||||
@@ -620,7 +662,7 @@ int parse_inet(struct names *this_name, struct ip_connections **ip_list)
|
||||
@@ -620,7 +674,7 @@ int parse_inet(struct names *this_name, struct ip_connections **ip_list)
|
||||
fprintf(stderr, _("Unknown local port AF %d\n"),
|
||||
res->ai_family);
|
||||
freeaddrinfo(res);
|
||||
@ -280,7 +292,7 @@ index 31ef30c..a204f08 100644
|
||||
return -1;
|
||||
}
|
||||
freeaddrinfo(res);
|
||||
@@ -683,10 +725,12 @@ int parse_inet(struct names *this_name, struct ip_connections **ip_list)
|
||||
@@ -683,10 +737,12 @@ int parse_inet(struct names *this_name, struct ip_connections **ip_list)
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
@ -296,7 +308,7 @@ index 31ef30c..a204f08 100644
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -1161,16 +1205,11 @@ int main(int argc, char *argv[])
|
||||
@@ -1161,16 +1217,11 @@ int main(int argc, char *argv[])
|
||||
skip_argv = 1;
|
||||
//while(option != '\0') option++;
|
||||
if (strcmp(argv[argc_cnt], "tcp") == 0)
|
||||
@ -318,7 +330,7 @@ index 31ef30c..a204f08 100644
|
||||
else
|
||||
usage(_
|
||||
("Invalid namespace name"));
|
||||
@@ -1210,7 +1249,7 @@ int main(int argc, char *argv[])
|
||||
@@ -1210,7 +1261,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
#if defined(WITH_MOUNTINFO_LIST)
|
||||
@ -327,7 +339,7 @@ index 31ef30c..a204f08 100644
|
||||
thestat = mntstat;
|
||||
#endif
|
||||
/* an option */
|
||||
@@ -1524,7 +1563,7 @@ print_matches(struct names *names_head, const opt_type opts,
|
||||
@@ -1524,7 +1575,7 @@ print_matches(struct names *names_head, const opt_type opts,
|
||||
|
||||
}
|
||||
|
||||
@ -336,7 +348,7 @@ index 31ef30c..a204f08 100644
|
||||
{
|
||||
char pathname[256];
|
||||
struct stat *st;
|
||||
@@ -1536,6 +1575,15 @@ static struct stat *get_pidstat(const pid_t pid, const char *filename)
|
||||
@@ -1536,6 +1587,15 @@ static struct stat *get_pidstat(const pid_t pid, const char *filename)
|
||||
free(st);
|
||||
return NULL;
|
||||
}
|
||||
@ -352,7 +364,7 @@ index 31ef30c..a204f08 100644
|
||||
return st;
|
||||
}
|
||||
|
||||
@@ -1550,18 +1598,19 @@ check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
|
||||
@@ -1550,18 +1610,19 @@ check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
|
||||
struct inode_list *ino_tmp;
|
||||
struct device_list *dev_tmp;
|
||||
struct unixsocket_list *sock_tmp;
|
||||
@ -377,7 +389,7 @@ index 31ef30c..a204f08 100644
|
||||
pid, dirname, direntry->d_name);
|
||||
|
||||
if (timeout(thestat, filepath, &st, 5) != 0) {
|
||||
@@ -1586,9 +1635,12 @@ check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
|
||||
@@ -1586,9 +1647,12 @@ check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
|
||||
dev_tmp = dev_tmp->next) {
|
||||
if (thedev != dev_tmp->device)
|
||||
continue;
|
||||
@ -392,7 +404,7 @@ index 31ef30c..a204f08 100644
|
||||
add_matched_proc(dev_tmp->name,
|
||||
pid, uid,
|
||||
ACCESS_FILEWR |
|
||||
@@ -1610,9 +1662,10 @@ check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
|
||||
@@ -1610,9 +1674,10 @@ check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
|
||||
continue;
|
||||
}
|
||||
if (st.st_ino == ino_tmp->inode) {
|
||||
@ -405,7 +417,7 @@ index 31ef30c..a204f08 100644
|
||||
add_matched_proc(ino_tmp->name,
|
||||
pid, uid,
|
||||
ACCESS_FILEWR |
|
||||
@@ -1641,18 +1694,30 @@ check_map(const pid_t pid, const char *filename,
|
||||
@@ -1641,18 +1706,30 @@ check_map(const pid_t pid, const char *filename,
|
||||
FILE *fp;
|
||||
unsigned long long tmp_inode;
|
||||
unsigned int tmp_maj, tmp_min;
|
||||
@ -441,7 +453,7 @@ index 31ef30c..a204f08 100644
|
||||
add_matched_proc(dev_tmp->name, pid,
|
||||
uid, access);
|
||||
for (ino_tmp = ino_head; ino_tmp != NULL;
|
||||
@@ -1661,7 +1726,8 @@ check_map(const pid_t pid, const char *filename,
|
||||
@@ -1661,7 +1738,8 @@ check_map(const pid_t pid, const char *filename,
|
||||
&& ino_tmp->inode == tmp_inode)
|
||||
add_matched_proc(ino_tmp->name, pid,
|
||||
uid, access);
|
||||
@ -451,7 +463,7 @@ index 31ef30c..a204f08 100644
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
@@ -1682,6 +1748,7 @@ static uid_t getpiduid(const pid_t pid)
|
||||
@@ -1682,6 +1760,7 @@ static uid_t getpiduid(const pid_t pid)
|
||||
* fill_unix_cache : Create a list of Unix sockets
|
||||
* This list is used later for matching purposes
|
||||
*/
|
||||
@ -459,7 +471,7 @@ index 31ef30c..a204f08 100644
|
||||
void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
{
|
||||
FILE *fp;
|
||||
@@ -1698,6 +1765,8 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
@@ -1698,6 +1777,8 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
while (fgets(line, BUFSIZ, fp) != NULL) {
|
||||
char *path;
|
||||
char *scanned_path = NULL;
|
||||
@ -468,7 +480,7 @@ index 31ef30c..a204f08 100644
|
||||
if (sscanf(line, "%*x: %*x %*x %*x %*x %*d %d %ms",
|
||||
&scanned_inode, &scanned_path) != 2) {
|
||||
if (scanned_path)
|
||||
@@ -1713,6 +1782,8 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
@@ -1713,6 +1794,8 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
free(path);
|
||||
continue;
|
||||
}
|
||||
@ -477,7 +489,7 @@ index 31ef30c..a204f08 100644
|
||||
if ((newsocket = (struct unixsocket_list *)
|
||||
malloc(sizeof(struct unixsocket_list))) == NULL) {
|
||||
free(path);
|
||||
@@ -1721,6 +1792,7 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
@@ -1721,6 +1804,7 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
newsocket->sun_name = strdup(scanned_path);
|
||||
newsocket->inode = st.st_ino;
|
||||
newsocket->dev = st.st_dev;
|
||||
@ -485,7 +497,7 @@ index 31ef30c..a204f08 100644
|
||||
newsocket->net_inode = scanned_inode;
|
||||
newsocket->next = *unixsocket_head;
|
||||
*unixsocket_head = newsocket;
|
||||
@@ -1733,6 +1805,7 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
@@ -1733,6 +1817,7 @@ void fill_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
/*
|
||||
* Free up the list of Unix sockets
|
||||
*/
|
||||
@ -493,7 +505,7 @@ index 31ef30c..a204f08 100644
|
||||
void clear_unix_cache(struct unixsocket_list **unixsocket_head)
|
||||
{
|
||||
while(*unixsocket_head != NULL) {
|
||||
@@ -1900,30 +1973,22 @@ scan_mounts(struct names *names_head, struct inode_list *ino_head,
|
||||
@@ -1900,30 +1985,22 @@ scan_mounts(struct names *names_head, struct inode_list *ino_head,
|
||||
{
|
||||
struct device_list *dev_tmp;
|
||||
struct inode_list *ino_tmp;
|
||||
@ -534,7 +546,7 @@ index 31ef30c..a204f08 100644
|
||||
add_special_proc(dev_tmp->name, PTYPE_MOUNT, 0,
|
||||
find_mountp);
|
||||
}
|
||||
@@ -1935,7 +2000,6 @@ scan_mounts(struct names *names_head, struct inode_list *ino_head,
|
||||
@@ -1935,7 +2012,6 @@ scan_mounts(struct names *names_head, struct inode_list *ino_head,
|
||||
find_mountp);
|
||||
}
|
||||
}
|
||||
@ -542,7 +554,7 @@ index 31ef30c..a204f08 100644
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1985,16 +2049,42 @@ scan_swaps(struct names *names_head, struct inode_list *ino_head,
|
||||
@@ -1985,16 +2061,42 @@ scan_swaps(struct names *names_head, struct inode_list *ino_head,
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
@ -588,7 +600,7 @@ index 31ef30c..a204f08 100644
|
||||
{
|
||||
list_t *ptr, *tmp;
|
||||
|
||||
@@ -2005,72 +2095,232 @@ static void clear_mntinfo(void)
|
||||
@@ -2005,72 +2107,232 @@ static void clear_mntinfo(void)
|
||||
}
|
||||
}
|
||||
|
||||
@ -668,7 +680,12 @@ index 31ef30c..a204f08 100644
|
||||
+ char line[BUFSIZ];
|
||||
+ FILE *fp;
|
||||
+ int mnt_id = 0, flags = 0;
|
||||
+
|
||||
|
||||
- /* Sort mount points accordingly to the reverse mount order */
|
||||
- initial(&sort);
|
||||
- for (mid = 1; mid <= max; mid++) {
|
||||
- list_t *ptr, *tmp;
|
||||
- list_for_each_safe(ptr, tmp, &mntinfo) {
|
||||
+ snprintf(pathname, 256, "/proc/%d/fdinfo/%s", pid, fd);
|
||||
+ if ((fp = fopen(pathname, "r")) == NULL)
|
||||
+ goto out;
|
||||
@ -747,12 +764,7 @@ index 31ef30c..a204f08 100644
|
||||
+ int ret = -1;
|
||||
+
|
||||
+ *mountinfo = NULL;
|
||||
|
||||
- /* Sort mount points accordingly to the reverse mount order */
|
||||
- initial(&sort);
|
||||
- for (mid = 1; mid <= max; mid++) {
|
||||
- list_t *ptr, *tmp;
|
||||
- list_for_each_safe(ptr, tmp, &mntinfo) {
|
||||
+
|
||||
+#if defined(HAS_NAME_TO_HANDLE_AT)
|
||||
+ if (mnt_id >= 0) {
|
||||
+ list_t *ptr;
|
||||
@ -834,11 +846,11 @@ index 31ef30c..a204f08 100644
|
||||
- if (mid != mnt->parid)
|
||||
+
|
||||
+ if (nlen != mnt->nlen)
|
||||
continue;
|
||||
- move_head(ptr, &sort);
|
||||
+ continue;
|
||||
+
|
||||
+ if (strcmp(use, mnt->mpoint))
|
||||
+ continue;
|
||||
continue;
|
||||
- move_head(ptr, &sort);
|
||||
+
|
||||
+ ret = 0;
|
||||
+ errno = 0;
|
||||
@ -865,7 +877,7 @@ index 31ef30c..a204f08 100644
|
||||
/*
|
||||
* Determine device of links below /proc/
|
||||
*/
|
||||
@@ -2078,8 +2328,7 @@ static int mntstat(const char *path, struct stat *buf)
|
||||
@@ -2078,8 +2340,7 @@ static int mntstat(const char *path, struct stat *buf)
|
||||
{
|
||||
char name[PATH_MAX + 1];
|
||||
const char *use;
|
||||
@ -875,7 +887,7 @@ index 31ef30c..a204f08 100644
|
||||
|
||||
if ((use = realpath(path, name)) == NULL || *use != '/')
|
||||
{
|
||||
@@ -2091,27 +2340,26 @@ static int mntstat(const char *path, struct stat *buf)
|
||||
@@ -2091,27 +2352,26 @@ static int mntstat(const char *path, struct stat *buf)
|
||||
errno = 0;
|
||||
return stat(path, buf);
|
||||
}
|
||||
@ -1030,5 +1042,5 @@ index b244893..1a10a1a 100644
|
||||
set test "killall list signals"
|
||||
spawn $killall -l
|
||||
--
|
||||
2.12.3
|
||||
2.17.1
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Jun 22 16:33:00 UTC 2018 - werner@suse.de
|
||||
|
||||
- Modify patch 0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch
|
||||
to make fuser option -m <block_device> work even with mountinfo
|
||||
(bsc#1098697)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu May 17 10:32:53 UTC 2018 - werner@suse.de
|
||||
|
||||
|
@ -73,9 +73,10 @@ grep -h src/ po/*.po|\
|
||||
sort -t : -k1,1 -u|\
|
||||
sed -r 's/:[0-9]+$//' > po/POTFILES.in
|
||||
autoreconf -fi
|
||||
CFLAGS="-D_GNU_SOURCE -D_DEFAULT_SOURCE ${RPM_OPT_FLAGS} -pipe"
|
||||
CFLAGS="-D_GNU_SOURCE -D_DEFAULT_SOURCE ${RPM_OPT_FLAGS} -pipe -fPIE"
|
||||
CXXFLAGS="$CFLAGS"
|
||||
export CFLAGS CXXFLAGS
|
||||
LDFLAGS=-pie
|
||||
export CFLAGS CXXFLAGS LDFLAGS
|
||||
%configure --disable-rpath \
|
||||
--with-gnu-ld \
|
||||
--enable-selinux \
|
||||
|
Loading…
Reference in New Issue
Block a user