From d3e3a26a452d24607220a4d60ec124e69f860458 Mon Sep 17 00:00:00 2001 From: baiguo Date: Fri, 12 Apr 2024 10:43:39 +0800 Subject: [PATCH] Fix parsing of /proc/self/stat --- 0034-Fix-parsing-of-proc-self-stat.patch | 120 +++++++++++++++++++++++ lvm2.spec | 6 +- 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 0034-Fix-parsing-of-proc-self-stat.patch diff --git a/0034-Fix-parsing-of-proc-self-stat.patch b/0034-Fix-parsing-of-proc-self-stat.patch new file mode 100644 index 0000000..4504ab2 --- /dev/null +++ b/0034-Fix-parsing-of-proc-self-stat.patch @@ -0,0 +1,120 @@ +From 89fba499188bcdcb9e58c605b16ffbefad556aa1 Mon Sep 17 00:00:00 2001 +From: vtrefny vtrefny@redhat.com +Date: Fri, 12 Apr 2024 10:31:44 +0800 +Subject: [PATCH] Fix parsing of /proc/self/stat + +--- + lib/log/log.c | 81 +++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 56 insertions(+), 25 deletions(-) + +diff --git a/lib/log/log.c b/lib/log/log.c +index e8a16e0..e0abe32 100644 +--- a/lib/log/log.c ++++ b/lib/log/log.c +@@ -218,6 +218,49 @@ void init_log_fn(lvm2_log_fn_t log_fn) + _lvm2_log_fn = log_fn; + } + ++/* Read /proc/self/stat to extract pid and starttime */ ++static int _get_pid_starttime(int *pid, unsigned long long *starttime) ++{ ++ static const char statfile[] = "/proc/self/stat"; ++ char buf[1024]; ++ char *p; ++ int fd; ++ int e; ++ ++ if ((fd = open(statfile, O_RDONLY)) == -1) { ++ log_sys_debug("open", statfile); ++ return 0; ++ } ++ ++ if ((e = read(fd, buf, sizeof(buf) - 1)) <= 0) ++ log_sys_debug("read", statfile); ++ ++ if (!close(fd)) ++ log_sys_debug("close", statfile); ++ ++ if (!close(fd)) ++ log_sys_debug("close", statfile); ++ ++ if (e <= 0) ++ return 0; ++ ++ buf[e] = '\0'; ++ if ((sscanf(buf, "%d ", pid) == 1) && ++ /* Jump past COMM, don't use scanf with '%s' since COMM may contain a space. */ ++ (p = strrchr(buf, ')')) && ++ (scanf(++p, " %*c %*d %*d %*d %*d " /* tty_nr */ ++ "%*d %*u %*u %*u %*u " /* mjflt */ ++ "%*u %*u %*u %*d %*d " /* cstim */ ++ "%*d %*d %*d %*d " /* itrealvalue */ ++ "%llu", &starttime) == 1)) ++ return 1; ++ ++ log_debug("Cannot parse content of %s.", statfile); ++ ++ return 0; ++} ++ ++ + /* + * Support envvar LVM_LOG_FILE_EPOCH and allow to attach + * extra keyword (consist of upto 32 alpha chars) to +@@ -229,11 +272,9 @@ void init_log_fn(lvm2_log_fn_t log_fn) + */ + void init_log_file(const char *log_file, int append) + { +- static const char statfile[] = "/proc/self/stat"; +- const char *env; + int pid; + unsigned long long starttime; +- FILE *st; ++ const char *env; + int i = 0; + + _log_file_path[0] = '\0'; +@@ -246,28 +287,18 @@ void init_log_file(const char *log_file, int append) + goto no_epoch; + } + +- if (!(st = fopen(statfile, "r"))) +- log_sys_error("fopen", statfile); +- else if (fscanf(st, "%d %*s %*c %*d %*d %*d %*d " /* tty_nr */ +- "%*d %*u %*u %*u %*u " /* mjflt */ +- "%*u %*u %*u %*d %*d " /* cstim */ +- "%*d %*d %*d %*d " /* itrealvalue */ +- "%llu", &pid, &starttime) != 2) { +- log_warn("WARNING: Cannot parse content of %s.", statfile); +- } else { +- if (dm_snprintf(_log_file_path, sizeof(_log_file_path), +- "%s_%s_%d_%llu", log_file, env, pid, starttime) < 0) { +- log_warn("WARNING: Debug log file path is too long for epoch."); +- _log_file_path[0] = '\0'; +- } else { +- log_file = _log_file_path; +- append = 1; /* force */ +- } +- } +- +- if (st && fclose(st)) +- log_sys_debug("fclose", statfile); +- ++ if (!_get_pid_starttime(&pid, &starttime)) ++ log_debug("Failed to obtain pid and starttime."); ++ ++ if (dm_snprintf(_log_file_path, sizeof(_log_file_path), ++ "%s_%s_%d_%llu", log_file, env, pid, starttime) < 0) { ++ log_warn("WARNING: Debug log file path is too long for epoch."); ++ _log_file_path[0] = '\0'; ++ } else { ++ log_file = _log_file_path; ++ append = 1; /* force */ ++ } ++ + if ((env = getenv("LVM_LOG_FILE_MAX_LINES"))) { + if (sscanf(env, FMTu64, &_log_file_max_lines) != 1) { + log_warn("WARNING: Ignoring invalid LVM_LOG_MAX_LINES envvar \"%s\".", env); +-- +2.27.0 + diff --git a/lvm2.spec b/lvm2.spec index 1bb995c..acb9e7f 100644 --- a/lvm2.spec +++ b/lvm2.spec @@ -43,7 +43,7 @@ Name: lvm2 Version: 2.03.14 -Release: 14 +Release: 15 Epoch: 8 Summary: Tools for logical volume management License: GPLv2+ and LGPLv2.1 and BSD @@ -82,6 +82,7 @@ Patch30: 0030-udev-create-symlinks-and-watch-even-in-suspended-sta.patch Patch31: 0031-udev-import-previous-results-of-blkid-when-in-suspen.patch Patch32: 0032-clean-up-group-struct-in-_stats_create_group-error-path.patch Patch33: 0033-dm-event-release-buffer-on-dm_event_get_version.patch +Patch34: 0034-Fix-parsing-of-proc-self-stat.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -508,6 +509,9 @@ fi %changelog +* Fri Apr 12 2024 baiguo - 8:2.03.14-15 +- fix parsing of /proc/self/stat + * Fri Feb 2 2024 peng.zou - 8:2.03.14-14 - lvm2-lockd: add suport for ppc64le -- Gitee