From a7384d2941b42eab4a22afb98ce54a663ae26743 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Fri, 21 Mar 2025 07:20:47 +0000 Subject: [PATCH] import CS ppc64-diag-2.7.9-6.el9 --- ...-2.7.9-call_home-fail-on-nvmf-device.patch | 71 +++++++++ .../ppc64-diag-2.7.9-compiler-warnings.patch | 43 ++++++ ...ag-2.7.9-diag_encl-man-and-help-page.patch | 72 +++++++++ ...ag-2.7.9-diag_nvme-man-and-help-page.patch | 62 ++++++++ ...-2.7.9-diag_vnme-add-power11-support.patch | 55 +++++++ ...improvements_status_and_err_messages.patch | 37 +++++ ...diag-2.7.9-remove-d-and-f-from-usage.patch | 24 +++ ...c64-diag-2.7.9-remove_d_and_f_option.patch | 143 ++++++++++++++++++ .../ppc64-diag-2.7.9-rtas_errd_crash.patch | 89 +++++++++++ SPECS/ppc64-diag.spec | 33 +++- 10 files changed, 623 insertions(+), 6 deletions(-) create mode 100644 SOURCES/ppc64-diag-2.7.9-call_home-fail-on-nvmf-device.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-compiler-warnings.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-diag_encl-man-and-help-page.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-diag_nvme-man-and-help-page.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-diag_vnme-add-power11-support.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-improvements_status_and_err_messages.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-remove-d-and-f-from-usage.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-remove_d_and_f_option.patch create mode 100644 SOURCES/ppc64-diag-2.7.9-rtas_errd_crash.patch diff --git a/SOURCES/ppc64-diag-2.7.9-call_home-fail-on-nvmf-device.patch b/SOURCES/ppc64-diag-2.7.9-call_home-fail-on-nvmf-device.patch new file mode 100644 index 0000000..d3e3006 --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-call_home-fail-on-nvmf-device.patch @@ -0,0 +1,71 @@ +commit db0c6d7974d7f8909878384d77ec02457759d6df +Author: Nilay Shroff +Date: Tue Jan 16 13:55:03 2024 +0530 + + diags/diag_nvme: call_home command fails on nvmf drive + + The diag_nvme command needs to retrieve the VPD log page from NVMe for + filling in the product data while generating the call-home event. + However, call-home feature is supported for directly attached NVMe + module. In the current diag_nvme implementation, if user doesn't + provide NVMe device name for diagnostics then it(diag_nvme) loops + through each NVMe moudle (directly connected to the system/LPAR as + well as discovered over fabrics) and attempt retrieving the SMART log + page as well as VPD page. Unfortunately, diag_nvme fails to retrieve + the VPD page for NVMe connected over fabrics and that causes the + diag_nvme to print "not-so-nice" failure messages on console. + + Henec fixed the diag_nvme code so that for call-home event reporting, + it skips the NVMe which is connected over fabrics and prints a + "nice-message" informing the user that it's skipping diagnosting for + NVMe module connected over fabrics. In a nutshell, with this fix now + diag_nvme would only diagnose the NVMe module which is directtly + attached (over PCIe) to the system. + + Signed-off-by: Nilay Shroff + +diff --git a/diags/diag_nvme.c b/diags/diag_nvme.c +index c1c0a20..e86786c 100644 +--- a/diags/diag_nvme.c ++++ b/diags/diag_nvme.c +@@ -375,9 +375,40 @@ static int diagnose_nvme(char *device_name, struct notify *notify, char *file_pa + char endurance_s[sizeof(vpd.endurance) + 1], capacity_s[sizeof(vpd.capacity)+1]; + uint64_t event_id; + uint8_t severity; ++ FILE *fp; ++ char tr_file_path[PATH_MAX]; + uint32_t raw_data_len = 0; + unsigned char *raw_data = NULL; + ++ /* ++ * Skip diag test if NVMe is connected over fabric ++ */ ++ snprintf(tr_file_path, sizeof(tr_file_path), ++ NVME_SYS_PATH"/%s/%s", device_name, "transport"); ++ fp = fopen(tr_file_path, "r"); ++ if (fp) { ++ char buf[12]; ++ int n = fread(buf, 1, sizeof(buf), fp); ++ ++ if (n) { ++ /* ++ * If NVMe transport is anything but pcie then skip the diag test ++ */ ++ if (strncmp(buf, "pcie", 4) != 0) { ++ fprintf(stdout, "Skipping diagnostics for nvmf : %s\n", ++ device_name); ++ fclose(fp); ++ return 0; ++ } ++ } ++ fclose(fp); ++ } else { ++ fprintf(stderr, "Skipping diagnostics for %s:\n" ++ "Unable to find the nvme transport type\n", ++ device_name); ++ return -1; ++ } ++ + tmp_rc = regex_controller(controller_name, device_name); + if (tmp_rc != 0) + return -1; diff --git a/SOURCES/ppc64-diag-2.7.9-compiler-warnings.patch b/SOURCES/ppc64-diag-2.7.9-compiler-warnings.patch new file mode 100644 index 0000000..8a9933e --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-compiler-warnings.patch @@ -0,0 +1,43 @@ +diff --git a/lpd/usysident.c b/lpd/usysident.c +index 8fee736..11a512b 100644 +--- a/lpd/usysident.c ++++ b/lpd/usysident.c +@@ -429,7 +429,7 @@ retry: + * next elements in the list (which may match the device name); + * for this we need to retry, re-starting on the next element. + */ +- if (dvalue && current->devname && ++ if (dvalue && current->devname[0] != '\0' && + strncmp(dvalue, current->devname, DEV_LENGTH)) { + list_start = current->next; + goto retry; +diff --git a/opal_errd/extract_opal_dump.c b/opal_errd/extract_opal_dump.c +index b7f365f..656899d 100644 +--- a/opal_errd/extract_opal_dump.c ++++ b/opal_errd/extract_opal_dump.c +@@ -77,8 +77,10 @@ static void dump_get_file_name(char *buf, int bsize, char *dfile, + if (bsize >= DUMP_HDR_PREFIX_OFFSET + sizeof(uint16_t)) + *prefix_size = be16toh(*(uint16_t *)(buf + DUMP_HDR_PREFIX_OFFSET)); + +- if (bsize >= DUMP_HDR_FNAME_OFFSET + DUMP_MAX_FNAME_LEN) +- strncpy(dfile, buf + DUMP_HDR_FNAME_OFFSET, dfile_size); ++ if (bsize >= DUMP_HDR_FNAME_OFFSET + DUMP_MAX_FNAME_LEN) { ++ strncpy(dfile, buf + DUMP_HDR_FNAME_OFFSET, dfile_size - 1); ++ dfile[dfile_size - 1] = '\0'; ++ } + else + strncpy(dfile, "platform.dumpid.PARTIAL", dfile_size); + +diff --git a/rtas_errd/extract_platdump.c b/rtas_errd/extract_platdump.c +index 831e57e..50bac99 100644 +--- a/rtas_errd/extract_platdump.c ++++ b/rtas_errd/extract_platdump.c +@@ -220,7 +220,7 @@ extract_platform_dump(uint64_t dump_tag) + char filename[DUMP_MAX_FNAME_LEN + 1]; + char pathname[PATH_MAX]; + char dump_err[RTAS_ERROR_LOG_MAX]; +- char dumpid[5]; ++ char dumpid[5] = ""; + int out=-1, rc, librtas_rc, dump_complete=0, ret=0; + + msg("Dump tag: 0x%016LX", dump_tag); diff --git a/SOURCES/ppc64-diag-2.7.9-diag_encl-man-and-help-page.patch b/SOURCES/ppc64-diag-2.7.9-diag_encl-man-and-help-page.patch new file mode 100644 index 0000000..c6b6cdd --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-diag_encl-man-and-help-page.patch @@ -0,0 +1,72 @@ +commit 565035cf98e97c7adda523221e109c676daf3430 +Author: Barnali Guha Thakurata +Date: Mon Jan 8 20:16:19 2024 +0530 + + diag_encl help output update + + This patch changes "scsi_enclosure" in the help output of diag_encl to + "sgn ..." so that it matches with the naming convention in the + manual page + + Before patch: + + diags/diag_encl --help + Usage: diags/diag_encl [-h] [-V] [...] [] + + [...] + : the sg device on which to operate, such + as sg7; if not specified, all such + devices will be diagnosed + man diags/man/diag_encl.8 + ... + SYNOPSIS + diag_encl [-s [-c][-l]] [-v] [-f ] [sgn ...] + diag_encl -d + diag_encl --version + diag_encl --help + ... + + After patch: + + diags/diag_encl --help + Usage: diags/diag_encl [-h] [-V] [...] [-f ] [] + + [...] + : the scsi device on which to operate, such + as sg7; if not specified, all such + devices will be diagnosed + + man diags/man/diag_encl.8 + ... + SYNOPSIS + diag_encl [-s [-c][-l]] [-v] [-f ] [sgn ...] + diag_encl -d + diag_encl --version + diag_encl --help + ... + + Signed-off-by: Barnali Guha Thakurata + +diff --git a/diags/diag_encl.c b/diags/diag_encl.c +index 449b097..e0d86ce 100644 +--- a/diags/diag_encl.c ++++ b/diags/diag_encl.c +@@ -75,8 +75,7 @@ static struct { + */ + static void + print_usage(const char *name) { +- printf("Usage: %s [-h] [-V] [-s [-c][-l]] [-v] [-f ]" +- " []\n" ++ printf("Usage: %s [-h] [-V] [-s [-c][-l]] [-v] [-f ] []\n" + "\n\t-h: print this help message\n" + "\t-s: generate serviceable events for any failures and\n" + "\t write events to the servicelog\n" +@@ -87,7 +86,7 @@ print_usage(const char *name) { + "\t-V: print the version of the command and exit\n" + "\t-f: for testing, read SES data from path.pg2 and VPD\n" + "\t from path.vpd\n" +- "\t: the sg device on which to operate, such\n" ++ "\t: the scsi device on which to operate, such\n" + "\t as sg7; if not specified, all such\n" + "\t devices will be diagnosed\n", name); + } diff --git a/SOURCES/ppc64-diag-2.7.9-diag_nvme-man-and-help-page.patch b/SOURCES/ppc64-diag-2.7.9-diag_nvme-man-and-help-page.patch new file mode 100644 index 0000000..a794b78 --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-diag_nvme-man-and-help-page.patch @@ -0,0 +1,62 @@ +commit 420d5145230041e0256f0f950a36c4ecaed4d584 +Author: Barnali Guha Thakurata +Date: Mon Jan 8 16:59:33 2024 +0530 + + diag_nvme help output update + + This patch changes "nvme_devices" in the help output of diag_nvme to + "nvmen ..." so that it matches with the naming convention in the + manual page + + Before patch: + + diags/diag_nvme --help + Usage: diags/diag_nvme [-h] [] + -h or --help: print this help message + : the NVMe devices on which to operate, for + example nvme0; if not specified, all detected + nvme devices will be diagnosed + + man diags/man/diag_nvme.8 + ... + SYNOPSIS + diag_nvme [] + diag_nvme + diag_nvme --help + ... + + After patch: + + diags/diag_nvme --help + Usage: diags/diag_nvme [-h] [] + -h or --help: print this help message + : the NVMe devices on which to operate, for + example nvme0; if not specified, all detected + nvme devices will be diagnosed + + man diags/man/diag_nvme.8 + ... + SYNOPSIS + diag_nvme [] + diag_nvme + diag_nvme --help + ... + + Signed-off-by: Barnali Guha Thakurata + +diff --git a/diags/diag_nvme.c b/diags/diag_nvme.c +index c1c0a20..2a74007 100644 +--- a/diags/diag_nvme.c ++++ b/diags/diag_nvme.c +@@ -989,9 +989,9 @@ extern int open_nvme(char *dev_path) { + } + + static void print_usage(char *command) { +- printf("Usage: %s [-h] []\n" ++ printf("Usage: %s [-h] []\n" + "\t-h or --help: print this help message\n" +- "\t: the NVMe devices on which to operate, for\n" ++ "\t: the NVMe devices on which to operate, for\n" + "\t example nvme0; if not specified, all detected\n" + "\t nvme devices will be diagnosed\n", command); + } diff --git a/SOURCES/ppc64-diag-2.7.9-diag_vnme-add-power11-support.patch b/SOURCES/ppc64-diag-2.7.9-diag_vnme-add-power11-support.patch new file mode 100644 index 0000000..5b18276 --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-diag_vnme-add-power11-support.patch @@ -0,0 +1,55 @@ +commit 6bfa2ec7a7f424b018fd2e21a70e9d2f04041832 +Author: Barnali Guha Thakurata +Date: Tue Oct 22 12:05:39 2024 +0530 + + Added Power11 support for diag_nvme + + Without Patch: + # diag_nvme nvme0 + diag_nvme is only supported in PowerVM LPARs and at least Power10 processors + + With Patch: + # diag_nvme nvme0 + Running diagnostics for nvme0 + + NVMe diag command completed successfully + + Signed-off-by: Barnali Guha Thakurata + Signed-off-by: Nilay Shroff + Reviewed-by: Sathvika Vasireddy + Tested-by: Sathvika Vasireddy + +diff --git a/common/platform.c b/common/platform.c +index 1359adb..801b924 100644 +--- a/common/platform.c ++++ b/common/platform.c +@@ -96,6 +96,9 @@ get_processor(void) + case PVR_POWER10: + rc = POWER10; + break; ++ case PVR_POWER11: ++ rc = POWER11; ++ break; + default: + rc = PROCESSOR_UNKNOWN; + break; +diff --git a/common/platform.h b/common/platform.h +index b265d1e..ae3ea21 100644 +--- a/common/platform.h ++++ b/common/platform.h +@@ -36,6 +36,7 @@ + #define PVR_POWER8 0x004D + #define PVR_POWER9 0x004E + #define PVR_POWER10 0x0080 ++#define PVR_POWER11 0x0082 + + enum { + PLATFORM_UNKNOWN = 0, +@@ -56,6 +57,7 @@ enum { + POWER8, + POWER9, + POWER10, ++ POWER11, + }; + + extern const char *__platform_name[]; diff --git a/SOURCES/ppc64-diag-2.7.9-improvements_status_and_err_messages.patch b/SOURCES/ppc64-diag-2.7.9-improvements_status_and_err_messages.patch new file mode 100644 index 0000000..9f0b8ad --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-improvements_status_and_err_messages.patch @@ -0,0 +1,37 @@ +commit 3ad587d20868f154bb7ab972ee7812add1380d7a +Author: Greg Joyce +Date: Wed Oct 11 12:10:40 2023 -0500 + + diag_nvme: improvements to status and err messages + + Signed-off-by: Greg Joyce + +diff --git a/diags/diag_nvme.c b/diags/diag_nvme.c +index df191f2..00efec2 100644 +--- a/diags/diag_nvme.c ++++ b/diags/diag_nvme.c +@@ -166,9 +166,9 @@ int main(int argc, char *argv[]) { + } + + if (rc == 0) +- fprintf(stdout, "Command completed successfully\n"); ++ fprintf(stdout, "NVMe diag command completed successfully\n"); + else +- fprintf(stderr, "Command failed, exiting with rc %d\n", rc); ++ fprintf(stderr, "NVMe diag command failed with rc %d\n", rc); + + return rc; + } +@@ -724,8 +724,11 @@ extern int get_smart_file(char *file_path, struct nvme_smart_log_page *log) { + int num_elements = 0; + struct dictionary dict[MAX_DICT_ELEMENTS]; + +- if ((num_elements = read_file_dict(file_path, dict, MAX_DICT_ELEMENTS)) < 0) ++ if ((num_elements = read_file_dict(file_path, dict, MAX_DICT_ELEMENTS)) < 0) { ++ fprintf(stderr, "read_file_dict failed: %s, rc % d\n", ++ file_path, num_elements); + return num_elements; ++ } + return set_smart_log_field(log, dict, num_elements); + } + diff --git a/SOURCES/ppc64-diag-2.7.9-remove-d-and-f-from-usage.patch b/SOURCES/ppc64-diag-2.7.9-remove-d-and-f-from-usage.patch new file mode 100644 index 0000000..3d79a20 --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-remove-d-and-f-from-usage.patch @@ -0,0 +1,24 @@ +commit 316d2baf5dba0d00447a3ac49f2f95339dbdf5cd +Author: Greg Joyce +Date: Wed Nov 15 11:28:05 2023 -0600 + + nvme_call_home: remove -d and -f from usage message + + The -d and -f weren't removed from the first line of the + usage message. + + Signed-off-by: Greg Joyce + +diff --git a/diags/diag_nvme.c b/diags/diag_nvme.c +index 00efec2..164afe1 100644 +--- a/diags/diag_nvme.c ++++ b/diags/diag_nvme.c +@@ -989,7 +989,7 @@ extern int open_nvme(char *dev_path) { + } + + static void print_usage(char *command) { +- printf("Usage: %s [-h] [-d ] [-f ] []\n" ++ printf("Usage: %s [-h] []\n" + "\t-h or --help: print this help message\n" + "\t: the NVMe devices on which to operate, for\n" + "\t example nvme0; if not specified, all detected\n" diff --git a/SOURCES/ppc64-diag-2.7.9-remove_d_and_f_option.patch b/SOURCES/ppc64-diag-2.7.9-remove_d_and_f_option.patch new file mode 100644 index 0000000..3c7a5a2 --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-remove_d_and_f_option.patch @@ -0,0 +1,143 @@ +commit 11cb2a44a59b63bdc23c94e386c4e2f43ea7eb61 +Author: Greg Joyce +Date: Fri Sep 22 15:19:34 2023 -0500 + + nvme_call_home: remove -d and -f as visible options + + The dump(-d) and file(-f) options have been removed as option in usage + and also in the man page. The options are for internal test only and + should not have been exposed. Also added some helpful status messages. + + Signed-off-by: Greg Joyce + +diff --git a/diags/diag_nvme.c b/diags/diag_nvme.c +index 2a78034..df191f2 100644 +--- a/diags/diag_nvme.c ++++ b/diags/diag_nvme.c +@@ -165,6 +165,11 @@ int main(int argc, char *argv[]) { + optind++; + } + ++ if (rc == 0) ++ fprintf(stdout, "Command completed successfully\n"); ++ else ++ fprintf(stderr, "Command failed, exiting with rc %d\n", rc); ++ + return rc; + } + +@@ -310,6 +315,7 @@ extern int dump_smart_data(char *device_name, char *dump_path) { + int fd, rc; + FILE *fp; + struct nvme_smart_log_page smart_log = { 0 }; ++ char ans; + + /* Read SMART data from device */ + snprintf(dev_path,sizeof(dev_path), "/dev/%s", device_name); +@@ -331,8 +337,16 @@ extern int dump_smart_data(char *device_name, char *dump_path) { + } + fp = fopen(dump_path, "wx"); + if (fp == NULL) { +- fprintf(stderr, "%s open failed: %s\n", dump_path, strerror(errno)); +- return -1; ++ if (errno == EEXIST) { ++ fprintf(stdout, "File %s exists. Overwrite (y/n)? ", dump_path); ++ rc = scanf("%c", &ans); ++ if (ans == 'y' || ans == 'Y') ++ fp = fopen(dump_path, "w"); ++ } ++ if (fp == NULL) { ++ fprintf(stderr, "%s open failed: %s\n", dump_path, strerror(errno)); ++ return -1; ++ } + } + write_smart_file(fp, &smart_log); + fclose(fp); +@@ -974,11 +988,6 @@ extern int open_nvme(char *dev_path) { + static void print_usage(char *command) { + printf("Usage: %s [-h] [-d ] [-f ] []\n" + "\t-h or --help: print this help message\n" +- "\t-d or --dump: dump SMART data to the specified path and file name \n" +- "\t one is expected with this option\n" +- "\t-f or --file: use SMART data from the specified path and file name \n" +- "\t instead of device, one is expected with\n" +- "\t this option\n" + "\t: the NVMe devices on which to operate, for\n" + "\t example nvme0; if not specified, all detected\n" + "\t nvme devices will be diagnosed\n", command); +diff --git a/diags/man/diag_nvme.8 b/diags/man/diag_nvme.8 +index 45567ac..c023ed6 100644 +--- a/diags/man/diag_nvme.8 ++++ b/diags/man/diag_nvme.8 +@@ -1,7 +1,7 @@ + .\" +-.\" Copyright (C) 2022 IBM Corporation ++.\" Copyright (C) 2022, 2023 IBM Corporation + .\" +-.TH "DIAG_NVME" "8" "June 2022" "Linux" "PowerLinux Diagnostic Tools" ++.TH "DIAG_NVME" "8" "September 2023" "Linux" "PowerLinux Diagnostic Tools" + .hy + .SH NAME + .PP +@@ -12,7 +12,7 @@ diag_nvme \- diagnose NVMe devices + .PD 0 + .P + .PD +-\f[B]diag_nvme\f[] [\-d <\f[I]file\f[]>] [\-f <\f[I]file\f[]>] ++\f[B]diag_nvme\f[] + <\f[B]nvme\f[]\f[I]n\f[]> + .PD 0 + .P +@@ -29,52 +29,10 @@ go through the diagnostics procedure. + The user can control which events will be reported through the + configuration file \f[I]/etc/ppc64\-diag/diag_nvme.config\f[] + .SH OPTIONS +-.TP +-.B \f[B]\-d\f[], \f[B]--dump\f[] \f[I]file\f[] +-Dump SMART data to the specified path and file name \f[I]file\f[]. +-The SMART data is extracted from an NVMe device, so specifying one is +-mandatory if this option is selected. +-File created is in a simple key=value format. +-.RS +-.RE +-.TP +-.B \f[B]\-f\f[], \f[B]--file\f[] \f[I]file\f[] +-This option usage is for testing only. +-Use SMART data from the specified path and file name \f[I]file\f[] +-instead of device, one NVMe is mandatory if this option is selected. +-The expected format of the file is a simple key=value that is the same +-one provided with the \-d / --dump option. +-If \f[I]file\f[] is missing from the filesystem it will be treated as a +-failure to retrieve SMART data and an event will be reported. +-.RS +-.RE +-.TP +-.B \f[B]\-h\f[], \f[B]--help\f[] +-Print a help message and exit +-.RS +-.RE +-.SH EXAMPLES +-.TP +-.B \f[B]diag_nvme\f[] +-Run diagnostics in all NVMe devices detected in the system. +-.RS +-.RE +-.TP + .B \f[B]diag_nvme nvme0 nvme1\f[] + Run diagnostics only in nvme0 and nvme1 devices. + .RS + .RE +-.TP +-.B \f[B]diag_nvme \-d smart.txt nvme0\f[] +-Dump SMART data from nvme0 into file smart.txt. +-.RS +-.RE +-.TP +-.B \f[B]diag_nvme \-f smart.txt nvme0\f[] +-Read SMART data from file smart.txt and use it as health information for +-diagnostics of device nvme0. +-.RS +-.RE + .SH REPORTING BUGS + .PP + Patches and issues may be submitted at diff --git a/SOURCES/ppc64-diag-2.7.9-rtas_errd_crash.patch b/SOURCES/ppc64-diag-2.7.9-rtas_errd_crash.patch new file mode 100644 index 0000000..8b3c554 --- /dev/null +++ b/SOURCES/ppc64-diag-2.7.9-rtas_errd_crash.patch @@ -0,0 +1,89 @@ +commit 357923dafda766429acbe68470c3bd6028d5ebf5 +Author: Sathvika Vasireddy +Date: Sun May 5 02:48:25 2024 -0400 + + rtas_errd: Fix core dump with large filename passed to -f option + + When a filename passed to rtas_errd's -f option is excessively long, + it causes a stack buffer overflow in the _log_msg() function, leading + to stack smashing. + + The _log_msg() function, utilized by log_msg(), operates with a buffer + limited to 4096 characters. Additional space is consumed by _dbg() and + re-formatting in _log_msg(), increasing the risk of buffer overflow. + + To address this, in case of an error, if the filename exceeds the + length of 2048 characters, truncate it and log a message indicating the + truncation. Use 2048 characters as limit for filename length to allow + space for further modifications. + + Additionally, add a check when processing the -f option to ensure that + the length of the specified filename does not exceed 4096 characters. + + Reported-by: R Nageswara Sastry + Closes: https://github.com/power-ras/ppc64-diag/issues/31 + Signed-off-by: Sathvika Vasireddy + Tested-by: R Nageswara Sastry + Signed-off-by: Mahesh Salgaonkar + +diff --git a/rtas_errd/files.c b/rtas_errd/files.c +index 4be75c6..3750bdc 100644 +--- a/rtas_errd/files.c ++++ b/rtas_errd/files.c +@@ -284,10 +284,27 @@ init_files(void) + proc_error_log_fd = open(proc_error_log2, O_RDONLY); + + if (proc_error_log_fd < 0) { +- log_msg(NULL, "Could not open error log file at either %s or " +- "%s, %s\nThe rtas_errd daemon cannot continue and will " +- "exit", proc_error_log1, proc_error_log2, +- strerror(errno)); ++ ++ if (strlen(proc_error_log1) <= 2048) { ++ log_msg(NULL, "Could not open error log file at either %s or " ++ "%s, %s\nThe rtas_errd daemon cannot continue and will " ++ "exit", proc_error_log1, proc_error_log2, ++ strerror(errno)); ++ } else { ++ /* If the filename is too long, truncate it */ ++ char truncated_filename[2048]; ++ ++ strncpy(truncated_filename, proc_error_log1, ++ sizeof(truncated_filename) - 1); ++ truncated_filename[sizeof(truncated_filename) - 1] = '\0'; ++ ++ log_msg(NULL, "Truncating the filename since it is too long " ++ "(%d characters)", strlen(proc_error_log1)); ++ log_msg(NULL, "Could not open error log file at either %s or " ++ "%s, %s\nThe rtas_errd daemon cannot continue and will " ++ "exit", truncated_filename, proc_error_log2, ++ strerror(errno)); ++ } + return -1; + } + +diff --git a/rtas_errd/rtas_errd.c b/rtas_errd/rtas_errd.c +index 10c422c..f6c6a4a 100644 +--- a/rtas_errd/rtas_errd.c ++++ b/rtas_errd/rtas_errd.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + + #include "rtas_errd.h" + #include "platform.h" +@@ -474,6 +475,12 @@ main(int argc, char *argv[]) + + f_flag++; + proc_error_log1 = optarg; ++ if (strlen(proc_error_log1) > PATH_MAX) { ++ fprintf(stderr, "The specified file path %s exceeds" ++ " the maximum supported file length of 4096 characters.\n", ++ proc_error_log1); ++ goto error_out; ++ } + proc_error_log2 = NULL; + break; + diff --git a/SPECS/ppc64-diag.spec b/SPECS/ppc64-diag.spec index 08f2f9b..1a60422 100644 --- a/SPECS/ppc64-diag.spec +++ b/SPECS/ppc64-diag.spec @@ -1,6 +1,6 @@ Name: ppc64-diag Version: 2.7.9 -Release: 3%{?dist} +Release: 6%{?dist} Summary: PowerLinux Platform Diagnostics URL: https://github.com/power-ras/%{name} License: GPLv2 @@ -35,11 +35,19 @@ Source5: rtas_errd.8 Patch0: ppc64-diag-2.7.9-fedora.patch # upstream fixes -# rtas_errd: Handle multiple platform dumps -Patch10: ppc64-diag-2.7.9-handle_multiple_platform_dumps.patch -Patch11: ppc64-diag-2.7.9-moving-trim_trail_space-function.patch -Patch12: ppc64-diag-2.7.9-utilize-trim_trail_space-in-event_fru_callout.patch -Patch13: ppc64-diag-2.7.9-enable-light-path-diagnostics-for-RTAS-events.patch +Patch10: ppc64-diag-2.7.9-handle_multiple_platform_dumps.patch +Patch11: ppc64-diag-2.7.9-remove_d_and_f_option.patch +Patch12: ppc64-diag-2.7.9-moving-trim_trail_space-function.patch +Patch13: ppc64-diag-2.7.9-utilize-trim_trail_space-in-event_fru_callout.patch +Patch14: ppc64-diag-2.7.9-enable-light-path-diagnostics-for-RTAS-events.patch +Patch15: ppc64-diag-2.7.9-improvements_status_and_err_messages.patch +Patch16: ppc64-diag-2.7.9-remove-d-and-f-from-usage.patch +Patch17: ppc64-diag-2.7.9-diag_encl-man-and-help-page.patch +Patch18: ppc64-diag-2.7.9-diag_nvme-man-and-help-page.patch +Patch19: ppc64-diag-2.7.9-call_home-fail-on-nvmf-device.patch +Patch20: ppc64-diag-2.7.9-compiler-warnings.patch +Patch21: ppc64-diag-2.7.9-rtas_errd_crash.patch +Patch22: ppc64-diag-2.7.9-diag_vnme-add-power11-support.patch %description This package contains various diagnostic tools for PowerLinux. @@ -176,6 +184,19 @@ if [ "$1" = "0" ]; then # last uninstall fi %changelog +* Wed Jan 08 2025 Than Ngo - 2.7.9-6 +- Resolves: RHEL-72515, Added Power11 support for diag_nvme + +* Mon Dec 02 2024 Than Ngo - 2.7.9-5 +- man and help of diag_nvme are not in sync +- compiler warnings +- diag_nvme: call_home command fails on nvmf drive +- rtas_errd: Fix core dump with large filename passed to -f option +Resolves: RHEL-55398 + +* Sun Oct 27 2024 Than Ngo - 2.7.9-4 +- Resolves: RHEL-55399, diag_encl man and help page are not in sync + * Sun Dec 10 2023 Than Ngo - 2.7.9-3 - Enable light path diagnostics for RTAS events Resolves: RHEL-11478