From 1f085f5a9f036625696bfa370779232f8f0b769c Mon Sep 17 00:00:00 2001 From: Craig Small Date: Tue, 26 Apr 2022 21:18:03 +1000 Subject: [PATCH] pmap: Don't reopen stdin for reading file pmap uses freopen to read /proc/self/maps. There doesn't seem to be a good reason to do this and if pmap has its stdin previously closed then it fails. Signed-off-by: Craig Small --- NEWS | 1 + pmap.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 2209e615..f1bdf4a7 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ procps-ng-NEXT * library Re-add elogind support merge #151 + * pmap: Dont reuse stdin filehandle issue #231 * ps: threads again display when -L is used with -q issue #234 * ps: proper aix format string behavior was restored * sysctl: print dotted keys again diff --git a/pmap.c b/pmap.c index 1e20fe0f..d4fe4c00 100644 --- a/pmap.c +++ b/pmap.c @@ -158,21 +158,25 @@ static void discover_shm_minor(void) void *addr; int shmid; char mapbuf_b[256]; + FILE *fp; - if (!freopen("/proc/self/maps", "r", stdin)) + if ( (fp = fopen("/proc/self/maps", "r")) == NULL) return; /* create */ shmid = shmget(IPC_PRIVATE, 42, IPC_CREAT | 0666); if (shmid == -1) + { /* failed; oh well */ + fclose(fp); return; + } /* attach */ addr = shmat(shmid, NULL, SHM_RDONLY); if (addr == (void *)-1) goto out_destroy; - while (fgets(mapbuf_b, sizeof mapbuf_b, stdin)) { + while (fgets(mapbuf_b, sizeof mapbuf_b, fp)) { char perms[32]; /* to clean up unprintables */ char *tmp; @@ -207,6 +211,7 @@ static void discover_shm_minor(void) perror(_("shared memory detach")); out_destroy: + fclose(fp); if (shmctl(shmid, IPC_RMID, NULL) && errno != EINVAL) perror(_("shared memory remove"));