Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rasdaemon for openSUSE:Factory checked in at 2026-08-14 22:09:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rasdaemon (Old) and /work/SRC/openSUSE:Factory/.rasdaemon.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rasdaemon" Fri Aug 14 22:09:39 2026 rev:32 rq:1371214 version:0.8.5+git10.4aec37b Changes: -------- --- /work/SRC/openSUSE:Factory/rasdaemon/rasdaemon.changes 2026-07-13 14:29:20.678037869 +0200 +++ /work/SRC/openSUSE:Factory/.rasdaemon.new.1258/rasdaemon.changes 2026-08-14 22:10:08.876875685 +0200 @@ -1,0 +2,34 @@ +Fri Aug 14 10:34:58 UTC 2026 - Thomas Renninger <[email protected]> + +- Remove shebang in bash completions +A There-must-be-no-shebang-in-bash-completion-scripts.patch +- Move configs from sysconfig (/etc/rasdaemon) to distconfig + (/usr/etc/rasdaemon) +- Update to version 0.8.5+git10.4aec37b: + * util/ras-mc-ctl.in: use "-H" as an alias for --human + * ras-mc-ctl: add --human to scale --layout sizes + * ras-mc-ctl: fix --layout column alignment with large DIMMs + * ras-mc-ctl: use an explicit placeholder for unknown mainboard/product info (bsc#1273190) + * ras-mc-ctl: report missing dmidecode instead of an obscure Perl error (bsc#1273190) + +------------------------------------------------------------------- +Fri Aug 07 18:52:38 UTC 2026 - Thomas Renninger <[email protected]> + +- Update to version 0.8.5+git5.c551de9: + * Fix dangerous stack allocations in ras-report.c + * Introduce commit_report_common to consolidate reporting logic + * ras-cxl-handler: Handle missing optional DRAM event fields gracefully + * rasdaemon requires debugfs - add dependency to rasdaemon.service + * Makefile.am: install the DIMM label database +Remove mainlined patch: +D debugfs_service_dependency.patch + +------------------------------------------------------------------- +Tue Aug 4 16:21:35 UTC 2026 - Thomas Renninger <[email protected]> + +- Handle ras-mc-ctl abortion more gracefully in case dmidecode is + not available (bsc#1273190) +A ras-mc-ctl-report-missing-dmidecode-instead-of-an-obscure-Perl-error.patch +A ras-mc-ctl-use-an-explicit-placeholder-for-unknown-mainboard-product-info.patch + +------------------------------------------------------------------- Old: ---- debugfs_service_dependency.patch rasdaemon-0.8.5+git0.769593b.obscpio New: ---- There-must-be-no-shebang-in-bash-completion-scripts.patch rasdaemon-0.8.5+git10.4aec37b.obscpio ----------(Old B)---------- Old:Remove mainlined patch: D debugfs_service_dependency.patch ----------(Old E)---------- ----------(New B)---------- New:- Remove shebang in bash completions A There-must-be-no-shebang-in-bash-completion-scripts.patch - Move configs from sysconfig (/etc/rasdaemon) to distconfig ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rasdaemon.spec ++++++ --- /var/tmp/diff_new_pack.0l5QYE/_old 2026-08-14 22:10:10.442933122 +0200 +++ /var/tmp/diff_new_pack.0l5QYE/_new 2026-08-14 22:10:10.448933342 +0200 @@ -17,7 +17,7 @@ Name: rasdaemon -Version: 0.8.5+git0.769593b +Version: 0.8.5+git10.4aec37b Release: 0 Summary: Utility to receive RAS error tracings License: GPL-2.0-only @@ -26,8 +26,7 @@ Source: %{name}-%{version}.tar.xz # PATCH-FIX-UPSTREAM -- based on https://github.com/mchehab/rasdaemon/pull/213 Patch0: rasdaemon_ras-mc-ctl_change_no_dimm_label_message_to_info_from_error.patch -# PATCH-FIX-UPSTREAM -- based on https://github.com/mchehab/rasdaemon/pull/253 -Patch1: debugfs_service_dependency.patch +Patch1: There-must-be-no-shebang-in-bash-completion-scripts.patch BuildRequires: autoconf BuildRequires: automake BuildRequires: gettext-devel @@ -85,6 +84,7 @@ --enable-yitian-ns-decode \ --disable-signal \ --enable-erst \ + --sysconfdir=%{_distconfdir} \ --with-sysconfdefdir=%{_sysconfdir}/sysconfig make %{?_smp_mflags} V=1 @@ -122,11 +122,12 @@ %{_sbindir}/rcras-mc-ctl %{_mandir}/*/* %{_unitdir}/*.service -%dir %{_sysconfdir}/ras -%dir %{_sysconfdir}/ras/dimm_labels.d -%dir %{_sysconfdir}/ras/triggers -%{_sysconfdir}/ras/triggers/mc_event_trigger -%{_sysconfdir}/ras/triggers/mem_fail_trigger +%dir %{_distconfdir}/ras +%dir %{_distconfdir}/ras/dimm_labels.d +%dir %{_distconfdir}/ras/triggers +%{_distconfdir}/ras/triggers/mc_event_trigger +%{_distconfdir}/ras/triggers/mem_fail_trigger +%{_distconfdir}/ras/dimm_labels.d/* %dir %{_localstatedir}/lib/rasdaemon %ghost %{_localstatedir}/lib/rasdaemon/ras-mc_event.db %attr (644,root,root) %{_fillupdir}/sysconfig.rasdaemon ++++++ There-must-be-no-shebang-in-bash-completion-scripts.patch ++++++ From: Thomas Renninger <[email protected]> Subject: There must be no shebang in bash completion scripts References: Patch-Mainline: ffed3ec Git-commit: ffed3ecc89354cd1da3fe46d3d48a8027646a12d Git-repo: git://git.infradead.org/users/mchehab/rasdaemon.git Signed-off-by: Thomas Renninger <[email protected]> diff --git a/completions/ras-mc-ctl.bash b/completions/ras-mc-ctl.bash index df60cee..cca57e2 100644 --- a/completions/ras-mc-ctl.bash +++ b/completions/ras-mc-ctl.bash @@ -1,5 +1,3 @@ -#!/bin/bash - _ras_mc_ctl() { local cur prev opts COMPREPLY=() ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.0l5QYE/_old 2026-08-14 22:10:10.618939577 +0200 +++ /var/tmp/diff_new_pack.0l5QYE/_new 2026-08-14 22:10:10.637940274 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">git://git.infradead.org/users/mchehab/rasdaemon.git</param> - <param name="changesrevision">769593be915b4f00a9a7d56569df99bc0cff249a</param></service></servicedata> + <param name="changesrevision">4aec37be20afe17895cfe8c6955c4f2584bd1e0a</param></service></servicedata> (No newline at EOF) ++++++ rasdaemon-0.8.5+git0.769593b.obscpio -> rasdaemon-0.8.5+git10.4aec37b.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rasdaemon-0.8.5+git0.769593b/Makefile.am new/rasdaemon-0.8.5+git10.4aec37b/Makefile.am --- old/rasdaemon-0.8.5+git0.769593b/Makefile.am 2026-06-26 12:00:07.000000000 +0200 +++ new/rasdaemon-0.8.5+git10.4aec37b/Makefile.am 2026-08-08 13:30:53.000000000 +0200 @@ -31,6 +31,7 @@ EXTRA_DIST += completions/ras-mc-ctl.zsh EXTRA_DIST += contrib/mem_fail_trigger EXTRA_DIST += contrib/mc_event_trigger +EXTRA_DIST += labels EXTRA_DIST += misc/rasdaemon.env CLEANFILES = misc/rasdaemon.logrotate @@ -257,6 +258,10 @@ # custom target install-data-local: $(install_sh) -d "$(DESTDIR)@sysconfdir@/ras/dimm_labels.d" + for f in @abs_srcdir@/labels/*; do \ + test -f "$$f" || continue; \ + $(install_sh) -m 0644 "$$f" "$(DESTDIR)@sysconfdir@/ras/dimm_labels.d/"; \ + done $(install_sh) -d "$(DESTDIR)@sysconfdir@/ras/triggers" install -D -p -m 0655 @abs_srcdir@/misc/rasdaemon.env "$(DESTDIR)@SYSCONFDEFDIR@/rasdaemon" $(install_sh) @abs_srcdir@/contrib/mc_event_trigger "$(DESTDIR)@sysconfdir@/ras/triggers/mc_event_trigger" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rasdaemon-0.8.5+git0.769593b/misc/rasdaemon.service.in new/rasdaemon-0.8.5+git10.4aec37b/misc/rasdaemon.service.in --- old/rasdaemon-0.8.5+git0.769593b/misc/rasdaemon.service.in 2026-06-26 12:00:07.000000000 +0200 +++ new/rasdaemon-0.8.5+git10.4aec37b/misc/rasdaemon.service.in 2026-08-08 13:30:53.000000000 +0200 @@ -4,6 +4,7 @@ Description=RAS daemon to log the RAS events # only needed when not running in foreground (--foreground | -f) #After=syslog.target +RequiresMountsFor=/sys/kernel/debug [Service] EnvironmentFile=@SYSCONFDEFDIR@/rasdaemon diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rasdaemon-0.8.5+git0.769593b/ras-cxl-handler.c new/rasdaemon-0.8.5+git10.4aec37b/ras-cxl-handler.c --- old/rasdaemon-0.8.5+git0.769593b/ras-cxl-handler.c 2026-06-26 12:00:07.000000000 +0200 +++ new/rasdaemon-0.8.5+git10.4aec37b/ras-cxl-handler.c 2026-08-08 13:30:53.000000000 +0200 @@ -1074,7 +1074,7 @@ struct tep_record *record, struct tep_event *event, void *context) { - int len, i, rc; + int len, i; unsigned long long val; struct ras_events *ras = context; struct ras_cxl_dram_event ev; @@ -1117,16 +1117,16 @@ ev.type)) <= 0) return -1; - if (tep_get_field_val(s, event, "sub_type", record, &val, 1) < 0) - return -1; - ev.sub_type = val; - if (trace_seq_printf(s, "memory_event_sub_type:%s ", - get_cxl_type_str(cxl_mem_event_sub_type, - ARRAY_SIZE(cxl_mem_event_sub_type), - ev.sub_type)) <= 0) - return -1; + /* sub_type is optional - skip gracefully if missing */ + if (tep_get_field_val(s, event, "sub_type", record, &val, 1) == 0) { + ev.sub_type = val; + trace_seq_printf(s, "memory_event_sub_type:%s ", + get_cxl_type_str(cxl_mem_event_sub_type, + ARRAY_SIZE(cxl_mem_event_sub_type), + ev.sub_type)); + } - if (tep_get_field_val(s, event, "transaction_type", record, &val, 1) < 0) + if (tep_get_field_val(s, event, "transaction_type", record, &val, 1) < 0) return -1; ev.transaction_type = val; if (trace_seq_printf(s, "transaction_type:%s ", @@ -1135,159 +1135,136 @@ ev.transaction_type)) <= 0) return -1; - if (tep_get_field_val(s, event, "hpa", record, &val, 1) < 0) - return -1; - ev.hpa = val; - if (trace_seq_printf(s, "hpa:0x%llx ", (unsigned long long)ev.hpa) <= 0) - return -1; + /* hpa/hpa_alias0 are optional - may not be available for all events */ + if (tep_get_field_val(s, event, "hpa", record, &val, 1) == 0) { + ev.hpa = val; + trace_seq_printf(s, "hpa:0x%llx ", (unsigned long long)ev.hpa); + } - if (tep_get_field_val(s, event, "hpa_alias0", record, &val, 1) < 0) - return -1; - ev.hpa_alias0 = val; - if (trace_seq_printf(s, "hpa_alias0:0x%llx ", (unsigned long long)ev.hpa_alias0) <= 0) - return -1; + if (tep_get_field_val(s, event, "hpa_alias0", record, &val, 1) == 0) { + ev.hpa_alias0 = val; + trace_seq_printf(s, "hpa_alias0:0x%llx ", (unsigned long long)ev.hpa_alias0); + } + /* region info is optional - may not be interleaved */ ev.region = tep_get_field_raw(s, event, "region_name", record, &len, 1); - if (!ev.region) - return -1; - if (trace_seq_printf(s, "region:%s ", ev.region) <= 0) - return -1; + if (ev.region) + trace_seq_printf(s, "region:%s ", ev.region); - ev.region_uuid = tep_get_field_raw(s, event, "region_uuid", - record, &len, 1); - if (!ev.region_uuid) - return -1; - ev.region_uuid = uuid_be(ev.region_uuid); - if (trace_seq_printf(s, "region_uuid:%s ", ev.region_uuid) <= 0) - return -1; + ev.region_uuid = tep_get_field_raw(s, event, "region_uuid", record, &len, 1); + if (ev.region_uuid) { + ev.region_uuid = uuid_be(ev.region_uuid); + trace_seq_printf(s, "region_uuid:%s ", ev.region_uuid); + } - if (tep_get_field_val(s, event, "validity_flags", record, &val, 1) < 0) - return -1; - ev.validity_flags = val; + /* validity_flags controls optional DRAM-specific fields */ + if (tep_get_field_val(s, event, "validity_flags", record, &val, 1) == 0) + ev.validity_flags = val; + /* Process conditional fields based on validity_flags - skip gracefully if missing */ if (ev.validity_flags & CXL_DER_VALID_CHANNEL) { - if (tep_get_field_val(s, event, "channel", record, &val, 1) < 0) - return -1; - ev.channel = val; - if (trace_seq_printf(s, "channel:%u ", ev.channel) <= 0) - return -1; + if (tep_get_field_val(s, event, "channel", record, &val, 1) == 0) { + ev.channel = val; + trace_seq_printf(s, "channel:%u ", ev.channel); + } } if (ev.validity_flags & CXL_DER_VALID_SUB_CHANNEL) { - if (tep_get_field_val(s, event, "sub_channel", record, &val, 1) < 0) - return -1; - ev.sub_channel = val; - if (trace_seq_printf(s, "sub_channel:%u ", ev.sub_channel) <= 0) - return -1; + if (tep_get_field_val(s, event, "sub_channel", record, &val, 1) == 0) { + ev.sub_channel = val; + trace_seq_printf(s, "sub_channel:%u ", ev.sub_channel); + } } if (ev.validity_flags & CXL_DER_VALID_RANK) { - if (tep_get_field_val(s, event, "rank", record, &val, 1) < 0) - return -1; - ev.rank = val; - if (trace_seq_printf(s, "rank:%u ", ev.rank) <= 0) - return -1; + if (tep_get_field_val(s, event, "rank", record, &val, 1) == 0) { + ev.rank = val; + trace_seq_printf(s, "rank:%u ", ev.rank); + } } if (ev.validity_flags & CXL_DER_VALID_NIBBLE) { - if (tep_get_field_val(s, event, "nibble_mask", record, &val, 1) < 0) - return -1; - ev.nibble_mask = val; - if (trace_seq_printf(s, "nibble_mask:%u ", ev.nibble_mask) <= 0) - return -1; + if (tep_get_field_val(s, event, "nibble_mask", record, &val, 1) == 0) { + ev.nibble_mask = val; + trace_seq_printf(s, "nibble_mask:%u ", ev.nibble_mask); + } } if (ev.validity_flags & CXL_DER_VALID_BANK_GROUP) { - if (tep_get_field_val(s, event, "bank_group", record, &val, 1) < 0) - return -1; - ev.bank_group = val; - if (trace_seq_printf(s, "bank_group:%u ", ev.bank_group) <= 0) - return -1; + if (tep_get_field_val(s, event, "bank_group", record, &val, 1) == 0) { + ev.bank_group = val; + trace_seq_printf(s, "bank_group:%u ", ev.bank_group); + } } if (ev.validity_flags & CXL_DER_VALID_BANK) { - if (tep_get_field_val(s, event, "bank", record, &val, 1) < 0) - return -1; - ev.bank = val; - if (trace_seq_printf(s, "bank:%u ", ev.bank) <= 0) - return -1; + if (tep_get_field_val(s, event, "bank", record, &val, 1) == 0) { + ev.bank = val; + trace_seq_printf(s, "bank:%u ", ev.bank); + } } if (ev.validity_flags & CXL_DER_VALID_ROW) { - if (tep_get_field_val(s, event, "row", record, &val, 1) < 0) - return -1; - ev.row = val; - if (trace_seq_printf(s, "row:%u ", ev.row) <= 0) - return -1; + if (tep_get_field_val(s, event, "row", record, &val, 1) == 0) { + ev.row = val; + trace_seq_printf(s, "row:%u ", ev.row); + } } if (ev.validity_flags & CXL_DER_VALID_COLUMN) { - if (tep_get_field_val(s, event, "column", record, &val, 1) < 0) - return -1; - ev.column = val; - if (trace_seq_printf(s, "column:%u ", ev.column) <= 0) - return -1; + if (tep_get_field_val(s, event, "column", record, &val, 1) == 0) { + ev.column = val; + trace_seq_printf(s, "column:%u ", ev.column); + } } if (ev.validity_flags & CXL_DER_VALID_CORRECTION_MASK) { ev.cor_mask = tep_get_field_raw(s, event, "cor_mask", record, &len, 1); - if (!ev.cor_mask) - return -1; - if (trace_seq_printf(s, "correction_mask:") <= 0) - return -1; - for (i = 0; i < CXL_EVENT_DER_CORRECTION_MASK_SIZE; i++) { - if (trace_seq_printf(s, "%02x ", ev.cor_mask[i]) <= 0) - break; + if (ev.cor_mask) { + trace_seq_printf(s, "correction_mask:"); + for (i = 0; i < CXL_EVENT_DER_CORRECTION_MASK_SIZE; i++) + trace_seq_printf(s, "%02x ", ev.cor_mask[i]); } } #ifdef HAVE_MEMORY_CE_PFA - /* Page offline for CE when threshold is set */ - if (!(ev.descriptor & CXL_GMER_EVT_DESC_UNCORRECTABLE_EVENT) && + /* Page offline for CE threshold events - only if HPA is valid */ + if (ev.hpa && + !(ev.descriptor & CXL_GMER_EVT_DESC_UNCORRECTABLE_EVENT) && (ev.descriptor & CXL_GMER_EVT_DESC_THRESHOLD_EVENT)) ras_hw_threshold_pageoffline(ev.hpa); #endif if (ev.validity_flags & CXL_DER_VALID_COMPONENT_ID) { ev.comp_id = tep_get_field_raw(s, event, "comp_id", record, &len, 1); - if (!ev.comp_id) - return -1; - if (trace_seq_printf(s, "comp_id:") <= 0) - return -1; - for (i = 0; i < CXL_EVENT_GEN_MED_COMP_ID_SIZE; i++) { - if (trace_seq_printf(s, "%02x ", ev.comp_id[i]) <= 0) - break; - } - - if (ev.validity_flags & CXL_DER_VALID_COMPONENT_ID_FORMAT) { - if (trace_seq_printf(s, "comp_id_pldm_valid_flags:") <= 0) - return -1; - if (decode_cxl_event_flags(s, ev.comp_id[0], cxl_pldm_comp_id_flags, - ARRAY_SIZE(cxl_pldm_comp_id_flags)) < 0) - return -1; - - rc = ras_cxl_print_component_id(s, ev.comp_id, ev.entity_id, ev.res_id); - if (rc) - return rc; + if (ev.comp_id) { + trace_seq_printf(s, "comp_id:"); + for (i = 0; i < CXL_EVENT_GEN_MED_COMP_ID_SIZE; i++) + trace_seq_printf(s, "%02x ", ev.comp_id[i]); + + if (ev.validity_flags & CXL_DER_VALID_COMPONENT_ID_FORMAT) { + trace_seq_printf(s, "comp_id_pldm_valid_flags:"); + decode_cxl_event_flags(s, ev.comp_id[0], cxl_pldm_comp_id_flags, + ARRAY_SIZE(cxl_pldm_comp_id_flags)); + ras_cxl_print_component_id(s, ev.comp_id, ev.entity_id, ev.res_id); + } } } + /* Threshold event fields are conditional - skip gracefully if missing */ if (ev.descriptor & CXL_GMER_EVT_DESC_THRESHOLD_EVENT) { - if (tep_get_field_val(s, event, "cme_threshold_ev_flags", record, &val, 1) < 0) - return -1; - ev.cme_threshold_ev_flags = val; - if (trace_seq_printf(s, "Advanced Programmable CME threshold Event Flags:") <= 0) - return -1; - if (decode_cxl_event_flags(s, ev.cme_threshold_ev_flags, - cxl_cme_threshold_ev_flags, - ARRAY_SIZE(cxl_cme_threshold_ev_flags)) < 0) - return -1; - - if (tep_get_field_val(s, event, "cvme_count", record, &val, 1) < 0) - return -1; - ev.cvme_count = val; - if (trace_seq_printf(s, "CVME Count:%u ", ev.cvme_count) <= 0) - return -1; + if (tep_get_field_val(s, event, "cme_threshold_ev_flags", record, &val, 1) == 0) { + ev.cme_threshold_ev_flags = val; + trace_seq_printf(s, "Advanced Programmable CME threshold Event Flags:"); + decode_cxl_event_flags(s, ev.cme_threshold_ev_flags, + cxl_cme_threshold_ev_flags, + ARRAY_SIZE(cxl_cme_threshold_ev_flags)); + } + + if (tep_get_field_val(s, event, "cvme_count", record, &val, 1) == 0) { + ev.cvme_count = val; + trace_seq_printf(s, "CVME Count:%u ", ev.cvme_count); + } } /* Insert data into the SGBD */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rasdaemon-0.8.5+git0.769593b/ras-report.c new/rasdaemon-0.8.5+git10.4aec37b/ras-report.c --- old/rasdaemon-0.8.5+git0.769593b/ras-report.c 2026-06-26 12:00:07.000000000 +0200 +++ new/rasdaemon-0.8.5+git10.4aec37b/ras-report.c 2026-08-08 13:30:53.000000000 +0200 @@ -11,7 +11,9 @@ #include <sys/un.h> #include <sys/utsname.h> #include <unistd.h> +#include <stdlib.h> +#include "ras-logger.h" #include "ras-report.h" #include "ras-record.h" @@ -41,44 +43,60 @@ static int commit_report_basic(int sockfd) { - char buf[INPUT_BUFFER_SIZE]; + char *buf; struct utsname un; int rc = -1; if (sockfd < 0) return rc; - memset(buf, 0, INPUT_BUFFER_SIZE); + buf = calloc(1, INPUT_BUFFER_SIZE); + if (!buf) { + log(TERM, LOG_ERR, "Failed to allocate memory for basic report\n"); + return -1; + } + memset(&un, 0, sizeof(struct utsname)); rc = uname(&un); - if (rc < 0) + if (rc < 0) { + free(buf); return rc; + } /* * ABRT server protocol */ snprintf(buf, INPUT_BUFFER_SIZE, "PUT / HTTP/1.1\r\n\r\n"); rc = write(sockfd, buf, strlen(buf)); - if (rc < strlen(buf)) + if (rc < strlen(buf)) { + free(buf); return -1; + } snprintf(buf, INPUT_BUFFER_SIZE, "PID=%d", (int)getpid()); rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) + if (rc < strlen(buf) + 1) { + free(buf); return -1; + } snprintf(buf, INPUT_BUFFER_SIZE, "EXECUTABLE=/boot/vmlinuz-%s", un.release); rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) + if (rc < strlen(buf) + 1) { + free(buf); return -1; + } snprintf(buf, INPUT_BUFFER_SIZE, "TYPE=%s", "ras"); rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) + if (rc < strlen(buf) + 1) { + free(buf); return -1; + } + free(buf); return 0; } @@ -797,15 +815,20 @@ static int commit_report_backtrace(int sockfd, int type, void *ev) { - char buf[MAX_BACKTRACE_SIZE]; - char *pbuf = buf; + char *buf; + char *pbuf; int rc = -1; int buf_len = 0; if (sockfd < 0 || !ev) return -1; - memset(buf, 0, MAX_BACKTRACE_SIZE); + buf = calloc(1, MAX_BACKTRACE_SIZE); + if (!buf) { + log(TERM, LOG_ERR, "Failed to allocate memory for backtrace report\n"); + return -1; + } + pbuf = buf; switch (type) { case MC_EVENT: @@ -877,828 +900,215 @@ (struct ras_signal_event *)ev); break; default: + free(buf); return -1; } - if (rc < 0) + if (rc < 0) { + free(buf); return -1; + } buf_len = strlen(buf); for (; buf_len > INPUT_BUFFER_SIZE - 1; buf_len -= (INPUT_BUFFER_SIZE - 1)) { rc = write(sockfd, pbuf, INPUT_BUFFER_SIZE - 1); - if (rc < INPUT_BUFFER_SIZE - 1) + if (rc < INPUT_BUFFER_SIZE - 1) { + free(buf); return -1; + } pbuf = pbuf + INPUT_BUFFER_SIZE - 1; } rc = write(sockfd, pbuf, buf_len + 1); - if (rc < buf_len) + if (rc < buf_len) { + free(buf); return -1; + } + free(buf); return 0; } -int ras_report_mc_event(struct ras_events *ras, struct ras_mc_event *ev) +static int commit_report_common(struct ras_events *ras, int type, void *ev, const char *analyzer, const char *reason) { - char buf[MAX_MESSAGE_SIZE]; + char *buf; int sockfd = -1; int done = 0; int rc = -1; - memset(buf, 0, sizeof(buf)); + buf = calloc(1, MAX_MESSAGE_SIZE); + if (!buf) { + log(TERM, LOG_ERR, "Failed to allocate memory for report\n"); + return -1; + } sockfd = setup_report_socket(); - if (sockfd < 0) + if (sockfd < 0) { + free(buf); return -1; + } rc = commit_report_basic(sockfd); if (rc < 0) - goto mc_fail; + goto fail; - rc = commit_report_backtrace(sockfd, MC_EVENT, ev); + rc = commit_report_backtrace(sockfd, type, ev); if (rc < 0) - goto mc_fail; + goto fail; - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-mc"); + snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", analyzer); rc = write(sockfd, buf, strlen(buf) + 1); if (rc < strlen(buf) + 1) - goto mc_fail; + goto fail; - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "EDAC driver report problem"); + snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", reason); rc = write(sockfd, buf, strlen(buf) + 1); if (rc < strlen(buf) + 1) - goto mc_fail; + goto fail; done = 1; -mc_fail: +fail: if (sockfd >= 0) close(sockfd); + free(buf); + return done ? 0 : -1; +} - if (done) - return 0; - - return -1; +int ras_report_mc_event(struct ras_events *ras, struct ras_mc_event *ev) +{ + return commit_report_common(ras, MC_EVENT, ev, + "rasdaemon-mc", + "EDAC driver report problem"); } int ras_report_aer_event(struct ras_events *ras, struct ras_aer_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto aer_fail; - - rc = commit_report_backtrace(sockfd, AER_EVENT, ev); - if (rc < 0) - goto aer_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-aer"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto aer_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", - "PCIe AER driver report problem"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto aer_fail; - - done = 1; - -aer_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, AER_EVENT, ev, + "rasdaemon-aer", + "PCIe AER driver report problem"); } int ras_report_non_standard_event(struct ras_events *ras, struct ras_non_standard_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return rc; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto non_standard_fail; - - rc = commit_report_backtrace(sockfd, NON_STANDARD_EVENT, ev); - if (rc < 0) - goto non_standard_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-non-standard"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto non_standard_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", - "Unknown CPER section problem"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto non_standard_fail; - - rc = 0; - -non_standard_fail: - - if (sockfd >= 0) - close(sockfd); - - return rc; + return commit_report_common(ras, NON_STANDARD_EVENT, ev, + "rasdaemon-non-standard", + "Unknown CPER section problem"); } int ras_report_arm_event(struct ras_events *ras, struct ras_arm_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return rc; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto arm_fail; - - rc = commit_report_backtrace(sockfd, ARM_EVENT, ev); - if (rc < 0) - goto arm_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-arm"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto arm_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "ARM CPU report problem"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto arm_fail; - - rc = 0; - -arm_fail: - - if (sockfd >= 0) - close(sockfd); - - return rc; + return commit_report_common(ras, ARM_EVENT, ev, + "rasdaemon-arm", + "ARM CPU report problem"); } int ras_report_mce_event(struct ras_events *ras, struct mce_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto mce_fail; - - rc = commit_report_backtrace(sockfd, MCE_EVENT, ev); - if (rc < 0) - goto mce_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-mce"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto mce_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", - "Machine Check driver report problem"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto mce_fail; - - done = 1; - -mce_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, MCE_EVENT, ev, + "rasdaemon-mce", + "Machine Check driver report problem"); } int ras_report_devlink_event(struct ras_events *ras, struct devlink_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto devlink_fail; - - rc = commit_report_backtrace(sockfd, DEVLINK_EVENT, ev); - if (rc < 0) - goto devlink_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-devlink"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto devlink_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", - "devlink health report problem"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto devlink_fail; - - done = 1; - -devlink_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, DEVLINK_EVENT, ev, + "rasdaemon-devlink", + "devlink health report problem"); } int ras_report_diskerror_event(struct ras_events *ras, struct diskerror_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto diskerror_fail; - - rc = commit_report_backtrace(sockfd, DISKERROR_EVENT, ev); - if (rc < 0) - goto diskerror_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-diskerror"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto diskerror_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "disk I/O error"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto diskerror_fail; - - done = 1; - -diskerror_fail: - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, DISKERROR_EVENT, ev, + "rasdaemon-diskerror", + "disk I/O error"); } int ras_report_mf_event(struct ras_events *ras, struct ras_mf_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto mf_fail; - - rc = commit_report_backtrace(sockfd, MF_EVENT, ev); - if (rc < 0) - goto mf_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-memory_failure"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto mf_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "memory failure problem"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto mf_fail; - - done = 1; - -mf_fail: - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - else - return -1; + return commit_report_common(ras, MF_EVENT, ev, + "rasdaemon-memory_failure", + "memory failure problem"); } int ras_report_cxl_poison_event(struct ras_events *ras, struct ras_cxl_poison_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_poison_fail; - - rc = commit_report_backtrace(sockfd, CXL_POISON_EVENT, ev); - if (rc < 0) - goto cxl_poison_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-cxl-poison"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_poison_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "CXL poison"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_poison_fail; - - done = 1; - -cxl_poison_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_POISON_EVENT, ev, + "rasdaemon-cxl-poison", + "CXL poison"); } int ras_report_cxl_aer_ue_event(struct ras_events *ras, struct ras_cxl_aer_ue_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_aer_ue_fail; - - rc = commit_report_backtrace(sockfd, CXL_AER_UE_EVENT, ev); - if (rc < 0) - goto cxl_aer_ue_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl-aer-uncorrectable-error"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_aer_ue_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", - "CXL AER uncorrectable error"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_aer_ue_fail; - - done = 1; - -cxl_aer_ue_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_AER_UE_EVENT, ev, + "rasdaemon-cxl-aer-uncorrectable-error", + "CXL AER uncorrectable error"); } int ras_report_cxl_aer_ce_event(struct ras_events *ras, struct ras_cxl_aer_ce_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_aer_ce_fail; - - rc = commit_report_backtrace(sockfd, CXL_AER_CE_EVENT, ev); - if (rc < 0) - goto cxl_aer_ce_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl-aer-correctable-error"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_aer_ce_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", - "CXL AER correctable error"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_aer_ce_fail; - - done = 1; - -cxl_aer_ce_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_AER_CE_EVENT, ev, + "rasdaemon-cxl-aer-correctable-error", + "CXL AER correctable error"); } int ras_report_cxl_overflow_event(struct ras_events *ras, struct ras_cxl_overflow_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_overflow_fail; - - rc = commit_report_backtrace(sockfd, CXL_OVERFLOW_EVENT, ev); - if (rc < 0) - goto cxl_overflow_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl-overflow"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_overflow_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "CXL overflow"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_overflow_fail; - - done = 1; - -cxl_overflow_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_OVERFLOW_EVENT, ev, + "rasdaemon-cxl-overflow", + "CXL overflow"); } int ras_report_cxl_generic_event(struct ras_events *ras, struct ras_cxl_generic_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_generic_fail; - - rc = commit_report_backtrace(sockfd, CXL_GENERIC_EVENT, ev); - if (rc < 0) - goto cxl_generic_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl_generic_event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_generic_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "CXL Generic Event "); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_generic_fail; - - done = 1; - -cxl_generic_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_GENERIC_EVENT, ev, + "rasdaemon-cxl_generic_event", + "CXL Generic Event "); } int ras_report_cxl_general_media_event(struct ras_events *ras, struct ras_cxl_general_media_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_general_media_fail; - - rc = commit_report_backtrace(sockfd, CXL_GENERAL_MEDIA_EVENT, ev); - if (rc < 0) - goto cxl_general_media_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl_general_media_event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_general_media_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "CXL General Media Event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_general_media_fail; - - done = 1; - -cxl_general_media_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_GENERAL_MEDIA_EVENT, ev, + "rasdaemon-cxl_general_media_event", + "CXL General Media Event"); } int ras_report_cxl_dram_event(struct ras_events *ras, struct ras_cxl_dram_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_dram_fail; - - rc = commit_report_backtrace(sockfd, CXL_DRAM_EVENT, ev); - if (rc < 0) - goto cxl_dram_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl_dram_event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_dram_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "CXL DRAM Event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_dram_fail; - - done = 1; - -cxl_dram_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_DRAM_EVENT, ev, + "rasdaemon-cxl_dram_event", + "CXL DRAM Event"); } int ras_report_cxl_memory_module_event(struct ras_events *ras, struct ras_cxl_memory_module_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto cxl_memory_module_fail; - - rc = commit_report_backtrace(sockfd, CXL_MEMORY_MODULE_EVENT, ev); - if (rc < 0) - goto cxl_memory_module_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-cxl_memory_module_event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_memory_module_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "CXL Memory Module Event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto cxl_memory_module_fail; - - done = 1; - -cxl_memory_module_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, CXL_MEMORY_MODULE_EVENT, ev, + "rasdaemon-cxl_memory_module_event", + "CXL Memory Module Event"); } int ras_report_signal_event(struct ras_events *ras, struct ras_signal_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int done = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return -1; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto signal_fail; - - rc = commit_report_backtrace(sockfd, SIGNAL_EVENT, ev); - if (rc < 0) - goto signal_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", - "rasdaemon-signal_event"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto signal_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "SIGBUS for Hardware error"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto signal_fail; - - done = 1; - -signal_fail: - - if (sockfd >= 0) - close(sockfd); - - if (done) - return 0; - - return -1; + return commit_report_common(ras, SIGNAL_EVENT, ev, + "rasdaemon-signal_event", + "SIGBUS for Hardware error"); } int ras_report_reri_event(struct ras_events *ras, struct ras_reri_event *ev) { - char buf[MAX_MESSAGE_SIZE]; - int sockfd = 0; - int rc = -1; - - memset(buf, 0, sizeof(buf)); - - sockfd = setup_report_socket(); - if (sockfd < 0) - return rc; - - rc = commit_report_basic(sockfd); - if (rc < 0) - goto reri_fail; - - rc = commit_report_backtrace(sockfd, RERI_EVENT, ev); - if (rc < 0) - goto reri_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "ANALYZER=%s", "rasdaemon-reri"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto reri_fail; - - snprintf(buf, MAX_MESSAGE_SIZE, "REASON=%s", "RISC-V RERI error report"); - rc = write(sockfd, buf, strlen(buf) + 1); - if (rc < strlen(buf) + 1) - goto reri_fail; - - rc = 0; - -reri_fail: - - if (sockfd >= 0) - close(sockfd); - - return rc; + return commit_report_common(ras, RERI_EVENT, ev, + "rasdaemon-reri", + "RISC-V RERI error report"); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rasdaemon-0.8.5+git0.769593b/util/ras-mc-ctl.in new/rasdaemon-0.8.5+git10.4aec37b/util/ras-mc-ctl.in --- old/rasdaemon-0.8.5+git0.769593b/util/ras-mc-ctl.in 2026-06-26 12:00:07.000000000 +0200 +++ new/rasdaemon-0.8.5+git10.4aec37b/util/ras-mc-ctl.in 2026-08-08 13:30:53.000000000 +0200 @@ -26,6 +26,7 @@ my $prefix = "@prefix@"; my $sysconfdir = "@sysconfdir@"; my $dmidecode = find_prog ("dmidecode"); +my $unknown_hw = "<undefined>"; my $has_aer = 0; my $has_arm = 0; @@ -84,6 +85,7 @@ --delay=N Delay N seconds before writing DIMM labels. --labeldb=DB Load label database from file DB. --layout Display the memory layout. + --human, -H With --layout, scale DIMM sizes to the largest exact unit. --summary Presents a summary of the logged errors. --errors Shows the errors stored at the error database. --error-count Shows the corrected and uncorrected error counts using sysfs. @@ -168,6 +170,7 @@ $conf{opt}{errors} = 0; $conf{opt}{error_count} = 0; $conf{opt}{per_rank} = 0; + $conf{opt}{human} = 0; $conf{opt}{vendor_errors_summary} = 0; $conf{opt}{vendor_errors} = 0; $conf{opt}{since} = ''; @@ -191,6 +194,7 @@ "errors" => \$conf{opt}{errors}, "error-count" => \$conf{opt}{error_count}, "per-rank" => \$conf{opt}{per_rank}, + "human|H" => \$conf{opt}{human}, "vendor-errors-summary" => \$conf{opt}{vendor_errors_summary}, "vendor-errors" => \$conf{opt}{vendor_errors}, "since=s" => \$conf{opt}{since}, @@ -211,6 +215,11 @@ exit (1); } + if ($conf{opt}{human} && !$conf{opt}{display_memory_layout}) { + log_error ("Only use --human with --layout\n"); + exit (1); + } + if ($conf{opt}{since}) { if ($conf{opt}{since} !~ /^20\d\d-[01]\d-[0-3]\d/) { log_error ("--since requires a date like yyyy-mm-dd where yyyy is the year, mm the month, and dd the day\n"); @@ -423,17 +432,17 @@ ($vendor, $model) = guess_vendor_model (); } - $conf{mainboard}{vendor} = $vendor; - $conf{mainboard}{model} = $model; + $conf{mainboard}{vendor} = $vendor || $unknown_hw; + $conf{mainboard}{model} = $model || $unknown_hw; ($pvendor, $pname) = guess_product (); # since product vendor is rare, use mainboard's vendor if ($pvendor) { $conf{mainboard}{product_vendor} = $pvendor; } else { - $conf{mainboard}{product_vendor} = $vendor; + $conf{mainboard}{product_vendor} = $conf{mainboard}{vendor}; } - $conf{mainboard}{product_name} = $pname if $pname; + $conf{mainboard}{product_name} = $pname || $unknown_hw; } sub guess_vendor_model_dmidecode { @@ -441,6 +450,8 @@ my ($system_vendor, $system_model); my $line = 0; + return (undef, undef) if ($dmidecode eq ""); + $< == 0 || die "Must be root to run dmidecode\n"; open (DMI, "$dmidecode |") or die "failed to run $dmidecode: $!\n"; @@ -549,6 +560,8 @@ } sub guess_dimm_label { + die "Can't guess DIMM labels: dmidecode not found in PATH\n" if ($dmidecode eq ""); + open (DMI, "$dmidecode |") or die "failed to run $dmidecode: $!\n"; LINE: @@ -866,7 +879,19 @@ if (!$size) { $size = 0; } - my $s = sprintf " %4i MB |", $size; + my $s; + if ($conf{opt}{human}) { + my @units = ('MB', 'GB', 'TB', 'PB'); + my $i = 0; + my $scaled = $size; + while ($scaled >= 1024 && $i < $#units) { + $scaled /= 1024; + $i++; + } + $s = sprintf " %4i %s |", $scaled, $units[$i]; + } else { + $s = sprintf " %6i MB |", $size; + } $item_size = length($s); return $s; } ++++++ rasdaemon.obsinfo ++++++ --- /var/tmp/diff_new_pack.0l5QYE/_old 2026-08-14 22:10:11.091956925 +0200 +++ /var/tmp/diff_new_pack.0l5QYE/_new 2026-08-14 22:10:11.105957438 +0200 @@ -1,5 +1,5 @@ name: rasdaemon -version: 0.8.5+git0.769593b -mtime: 1782468007 -commit: 769593be915b4f00a9a7d56569df99bc0cff249a +version: 0.8.5+git10.4aec37b +mtime: 1786188653 +commit: 4aec37be20afe17895cfe8c6955c4f2584bd1e0a
