diff --git a/0001-Safer-string-handling-in-procinterrupts.c.patch b/0001-Safer-string-handling-in-procinterrupts.c.patch new file mode 100644 index 0000000..45700f9 --- /dev/null +++ b/0001-Safer-string-handling-in-procinterrupts.c.patch @@ -0,0 +1,42 @@ +From 030edf9aeb7310821df76f3c2965e3d3540e5bba Mon Sep 17 00:00:00 2001 +From: Jiri BlueBear Dluhos +Date: Tue, 10 Jun 2025 00:26:47 +0200 +Subject: [PATCH 1/3] Safer string handling in procinterrupts.c. + +--- + procinterrupts.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/procinterrupts.c b/procinterrupts.c +index 8303ad3..16dcff2 100644 +--- a/procinterrupts.c ++++ b/procinterrupts.c +@@ -55,7 +55,7 @@ struct irq_match { + static int check_platform_device(char *name, struct irq_info *info) + { + DIR *dirfd; +- char path[512]; ++ char path[PATH_MAX]; + struct dirent *ent; + int rc = -ENOENT, i; + static struct pdev_irq_info { +@@ -69,12 +69,11 @@ static int check_platform_device(char *name, struct irq_info *info) + {NULL}, + }; + +- memset(path, 0, 512); ++ if (snprintf(path, PATH_MAX, "/sys/devices/platform/%s", name) == PATH_MAX) { ++ log(TO_ALL, LOG_ERROR, "Device path in /sys exceeds maximum length"); ++ return -ENAMETOOLONG; ++ } + +- strcat(path, "/sys/devices/platform/"); +- snprintf(path + strlen(path), sizeof(path) - strlen(path) - 1, +- "%s", name); +- strcat(path, "/"); + dirfd = opendir(path); + + if (!dirfd) { +-- +2.47.0 + diff --git a/0001-Unify-meson-and-autoconf-Install-executables-to-sbin.patch b/0001-Unify-meson-and-autoconf-Install-executables-to-sbin.patch new file mode 100644 index 0000000..0b9e6ea --- /dev/null +++ b/0001-Unify-meson-and-autoconf-Install-executables-to-sbin.patch @@ -0,0 +1,32 @@ +From 499688321313a11d32a4e0386833472da026d68a Mon Sep 17 00:00:00 2001 +From: Thomas Renninger +Date: Thu, 3 Apr 2025 17:51:23 +0200 +Subject: [PATCH 1/4] Unify meson and autoconf: Install executables to sbin + +--- + meson.build | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/meson.build b/meson.build +index d26ef42..0441b30 100644 +--- a/meson.build ++++ b/meson.build +@@ -35,6 +35,7 @@ if cdata.get('HAVE_IRQBALANCEUI') + 'ui/ui.c', + dependencies: [glib_dep, ncurses_dep], + install: true, ++ install_dir : get_option('sbindir'), + ) + + install_man('irqbalance-ui.1') +@@ -63,6 +64,7 @@ executable( + irqbalance_sources, + dependencies: [glib_dep, m_dep, capng_dep, libnl_3_dep, libnl_genl_3_dep, numa_dep, systemd_dep], + install: true, ++ install_dir : get_option('sbindir'), + ) + + install_man('irqbalance.1') +-- +2.47.0 + diff --git a/0002-Added-missing-and-fixed-message-in-procinterrupts.c.patch b/0002-Added-missing-and-fixed-message-in-procinterrupts.c.patch new file mode 100644 index 0000000..1995fe7 --- /dev/null +++ b/0002-Added-missing-and-fixed-message-in-procinterrupts.c.patch @@ -0,0 +1,27 @@ +From 5fdc1d64083ab92f63cdd9d4f2f01587cf8eab28 Mon Sep 17 00:00:00 2001 +From: Jiri BlueBear Dluhos +Date: Tue, 10 Jun 2025 00:51:43 +0200 +Subject: [PATCH 2/3] Added missing '/' and fixed message in procinterrupts.c. + +--- + procinterrupts.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/procinterrupts.c b/procinterrupts.c +index 16dcff2..ab31cdb 100644 +--- a/procinterrupts.c ++++ b/procinterrupts.c +@@ -69,8 +69,8 @@ static int check_platform_device(char *name, struct irq_info *info) + {NULL}, + }; + +- if (snprintf(path, PATH_MAX, "/sys/devices/platform/%s", name) == PATH_MAX) { +- log(TO_ALL, LOG_ERROR, "Device path in /sys exceeds maximum length"); ++ if (snprintf(path, PATH_MAX, "/sys/devices/platform/%s/", name) == PATH_MAX) { ++ log(TO_ALL, LOG_WARNING, "WARNING: Platform device path in /sys exceeds PATH_MAX, cannot examine"); + return -ENAMETOOLONG; + } + +-- +2.47.0 + diff --git a/0002-Properly-embed-EnvironmentFile-sourced-systemd-confi.patch b/0002-Properly-embed-EnvironmentFile-sourced-systemd-confi.patch new file mode 100644 index 0000000..290b2a8 --- /dev/null +++ b/0002-Properly-embed-EnvironmentFile-sourced-systemd-confi.patch @@ -0,0 +1,259 @@ +From 41cb97c714e6216ab7f10f8aaa51a2548da3acc7 Mon Sep 17 00:00:00 2001 +From: Thomas Renninger +Date: Mon, 7 Apr 2025 09:09:31 +0200 +Subject: [PATCH 2/4] Properly embed EnvironmentFile sourced systemd configs + into meson and autonconf + +Commit 724243f introduced a 2nd environment file. + +This patch fixes that both files are optional. +There should be one mandatory EnvironmentFile provided by package install as +before which lives in e.g. /usr/lib +and one optional one that users/admins can place into /etc/... + +Before the replacement of both EnvironmentFile directives was fragile, e.g. +a spec file's sed could easily result in overwriting both EnvironmentFile +occurences silently pointing to the same location. + +This patch properly integrates the paths into meson and autoconf by +introducing 2 configurable directories, defaults set to: +/usr/etc/default +for the mandatory, package provided config file and +/etc/default +for the optional admin override conf file. +It renames misc/irqbalance.service to misc/irqbalance.service.in and replaces +the paths via AC_SUBST/AC_CONFIG_FILES (autoconf) or configure_file (meson) +via pkgconfdir and usrconfdir introduced configure/setup options: ++EnvironmentFile=@pkgconfdir@/irqbalance.env ++EnvironmentFile=-@usrconfdir@/irqbalance + +irqbalance.service is now installed via autoconf/meson, by trying to fetch +systemd's unitdir via pkgconfig. +--- + Makefile.am | 5 ++++- + configure.ac | 19 +++++++++++++++++ + meson.build | 37 +++++++++++++++++++++++++++++++++ + meson_options.txt | 8 ++++++++ + misc/irqbalance.service | 42 -------------------------------------- + misc/irqbalance.service.in | 42 ++++++++++++++++++++++++++++++++++++++ + 6 files changed, 110 insertions(+), 43 deletions(-) + delete mode 100644 misc/irqbalance.service + create mode 100644 misc/irqbalance.service.in + +diff --git a/Makefile.am b/Makefile.am +index 80d8fee..ed40628 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -22,7 +22,10 @@ + + AUTOMAKE_OPTIONS = no-dependencies + ACLOCAL_AMFLAGS = -I m4 +-EXTRA_DIST = COPYING autogen.sh misc/irqbalance.service misc/irqbalance.env ++EXTRA_DIST = COPYING autogen.sh ++ ++systemdsystemunit_DATA = misc/irqbalance.service ++pkgconf_DATA = misc/irqbalance.env + + SUBDIRS = tests + +diff --git a/configure.ac b/configure.ac +index 678f66e..6983c4a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -115,6 +115,24 @@ AS_IF( + ] + ) + ++AC_ARG_WITH([pkgconfdir], ++ [AS_HELP_STRING([--with-pkgconfdir=DIR], ++ [Systemd Environment configs sourced by irqbalanced])], ++ [pkgconfdir=$withval], ++ [pkgconfdir="$prefix/etc/default"]) ++AC_SUBST([pkgconfdir]) ++ ++AC_ARG_WITH([usrconfdir], ++ [AS_HELP_STRING([--with-usrconfdir=DIR], ++ [Systemd Environment user configs sourced by irqbalanced])], ++ [usrconfdir=$withval], ++ [usrconfdir="${sysconfdir}/default"]) ++AC_SUBST([usrconfdir]) ++ ++AC_CONFIG_FILES([misc/irqbalance.service]) ++ ++PKG_CHECK_VAR([systemdsystemunitdir], [systemd], [systemdsystemunitdir]) ++ + AC_OUTPUT(Makefile tests/Makefile) + + AC_MSG_NOTICE() +@@ -123,3 +141,4 @@ AC_MSG_NOTICE([Target: $target]) + AC_MSG_NOTICE([Installation prefix: $prefix]) + AC_MSG_NOTICE([Compiler: $CC]) + AC_MSG_NOTICE([Compiler flags: $CFLAGS]) ++AC_MSG_NOTICE([Systemdunitdir: $systemdsystemunitdir]) +diff --git a/meson.build b/meson.build +index 0441b30..b69c224 100644 +--- a/meson.build ++++ b/meson.build +@@ -14,6 +14,13 @@ numa_dep = cc.find_library('numa', required: get_option('numa')) + libnl_3_dep = dependency('libnl-3.0', required: get_option('thermal')) + libnl_genl_3_dep = dependency('libnl-genl-3.0', required: get_option('thermal')) + systemd_dep = dependency('libsystemd', required: get_option('systemd')) ++systemd_dir_dep = dependency('systemd', required: get_option('systemd')) ++ ++systemdsystemunitdir = systemd_dir_dep.get_variable( ++ pkgconfig: 'systemdsystemunitdir', ++ default_value: get_option('prefix') / 'lib/systemd/system' ++) ++ + + cdata = configuration_data() + cdata.set('HAVE_GETOPT_LONG', cc.has_function('getopt_long')) +@@ -68,3 +75,33 @@ executable( + ) + + install_man('irqbalance.1') ++ ++if systemd_dep.found() ++ pkgconfdir = get_option('pkgconfdir') ++ usrconfdir = get_option('usrconfdir') ++ ++# Set defaults ++ if pkgconfdir == '' ++ pkgconfdir = get_option('prefix') / 'etc/default' ++ endif ++ if usrconfdir == '' ++ usrconfdir = get_option('sysconfdir') / 'default' ++ endif ++ ++ idata = configuration_data() ++ idata.set('usrconfdir', usrconfdir) ++ idata.set('pkgconfdir', pkgconfdir) ++ ++ configure_file( ++ input: 'misc/irqbalance.service.in', ++ output: 'irqbalance.service', ++ install_dir: systemdsystemunitdir, ++ configuration: idata ++ ) ++ configure_file( ++ input: 'misc/irqbalance.env', ++ output: 'irqbalance.env', ++ install_dir: pkgconfdir, ++ configuration: idata ++ ) ++endif +diff --git a/meson_options.txt b/meson_options.txt +index 53cc121..c4967f7 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -17,3 +17,11 @@ option('thermal', type : 'feature', + option('ui', type : 'feature', + description : 'Build the UI component', + ) ++ ++option('usrconfdir', type: 'string', ++ description: 'Directory to systemd environment file, optionally added by user' ++) ++ ++option('pkgconfdir', type: 'string', ++ description: 'Directory to systemd environment file, provided by irqbalance' ++) +diff --git a/misc/irqbalance.service b/misc/irqbalance.service +deleted file mode 100644 +index 7e0c5d8..0000000 +--- a/misc/irqbalance.service ++++ /dev/null +@@ -1,42 +0,0 @@ +-[Unit] +-Description=irqbalance daemon +-Documentation=man:irqbalance(1) +-Documentation=https://github.com/Irqbalance/irqbalance +-ConditionVirtualization=!container +-ConditionCPUs=>1 +- +-[Service] +-EnvironmentFile=-/usr/lib/irqbalance/defaults.env +-EnvironmentFile=-/path/to/irqbalance.env +-ExecStart=/usr/sbin/irqbalance $IRQBALANCE_ARGS +-CapabilityBoundingSet=CAP_SETPCAP +-NoNewPrivileges=yes +-ProtectSystem=strict +-ReadOnlyPaths=/ +-ReadWritePaths=/proc/irq +-RestrictAddressFamilies=AF_UNIX AF_NETLINK +-RuntimeDirectory=irqbalance/ +-IPAddressDeny=any +-ProtectHome=true +-PrivateTmp=yes +-PrivateNetwork=yes +-PrivateUsers=true +-ProtectHostname=yes +-ProtectClock=yes +-ProtectKernelModules=yes +-ProtectKernelLogs=yes +-ProtectControlGroups=yes +-RestrictNamespaces=yes +-LockPersonality=yes +-MemoryDenyWriteExecute=yes +-RestrictRealtime=yes +-RestrictSUIDSGID=yes +-RemoveIPC=yes +-PrivateMounts=yes +-SystemCallFilter=@cpu-emulation @privileged @system-service +-SystemCallFilter=~@clock @module @mount @obsolete @raw-io @reboot @resources @swap +-SystemCallErrorNumber=EPERM +-SystemCallArchitectures=native +- +-[Install] +-WantedBy=multi-user.target +diff --git a/misc/irqbalance.service.in b/misc/irqbalance.service.in +new file mode 100644 +index 0000000..bd31039 +--- /dev/null ++++ b/misc/irqbalance.service.in +@@ -0,0 +1,42 @@ ++[Unit] ++Description=irqbalance daemon ++Documentation=man:irqbalance(1) ++Documentation=https://github.com/Irqbalance/irqbalance ++ConditionVirtualization=!container ++ConditionCPUs=>1 ++ ++[Service] ++EnvironmentFile=@pkgconfdir@/irqbalance.env ++EnvironmentFile=-@usrconfdir@/irqbalance ++ExecStart=/usr/sbin/irqbalance $IRQBALANCE_ARGS ++CapabilityBoundingSet=CAP_SETPCAP ++NoNewPrivileges=yes ++ProtectSystem=strict ++ReadOnlyPaths=/ ++ReadWritePaths=/proc/irq ++RestrictAddressFamilies=AF_UNIX AF_NETLINK ++RuntimeDirectory=irqbalance/ ++IPAddressDeny=any ++ProtectHome=true ++PrivateTmp=yes ++PrivateNetwork=yes ++PrivateUsers=true ++ProtectHostname=yes ++ProtectClock=yes ++ProtectKernelModules=yes ++ProtectKernelLogs=yes ++ProtectControlGroups=yes ++RestrictNamespaces=yes ++LockPersonality=yes ++MemoryDenyWriteExecute=yes ++RestrictRealtime=yes ++RestrictSUIDSGID=yes ++RemoveIPC=yes ++PrivateMounts=yes ++SystemCallFilter=@cpu-emulation @privileged @system-service ++SystemCallFilter=~@clock @module @mount @obsolete @raw-io @reboot @resources @swap ++SystemCallErrorNumber=EPERM ++SystemCallArchitectures=native ++ ++[Install] ++WantedBy=multi-user.target +-- +2.47.0 + diff --git a/0003-Fixed-incorrect-comparison-in-snprintf-in-procinterr.patch b/0003-Fixed-incorrect-comparison-in-snprintf-in-procinterr.patch new file mode 100644 index 0000000..ddc26e3 --- /dev/null +++ b/0003-Fixed-incorrect-comparison-in-snprintf-in-procinterr.patch @@ -0,0 +1,26 @@ +From 14fb83896e44d1efe03963658574204696051397 Mon Sep 17 00:00:00 2001 +From: Jiri BlueBear Dluhos +Date: Tue, 10 Jun 2025 11:00:14 +0200 +Subject: [PATCH 3/3] Fixed incorrect comparison in snprintf() in + procinterrupts.c. + +--- + procinterrupts.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/procinterrupts.c b/procinterrupts.c +index ab31cdb..ebfb762 100644 +--- a/procinterrupts.c ++++ b/procinterrupts.c +@@ -69,7 +69,7 @@ static int check_platform_device(char *name, struct irq_info *info) + {NULL}, + }; + +- if (snprintf(path, PATH_MAX, "/sys/devices/platform/%s/", name) == PATH_MAX) { ++ if (snprintf(path, PATH_MAX, "/sys/devices/platform/%s/", name) >= PATH_MAX) { + log(TO_ALL, LOG_WARNING, "WARNING: Platform device path in /sys exceeds PATH_MAX, cannot examine"); + return -ENAMETOOLONG; + } +-- +2.47.0 + diff --git a/0004-Increase-file-descriptor-limit-via-systemd-service-f.patch b/0004-Increase-file-descriptor-limit-via-systemd-service-f.patch new file mode 100644 index 0000000..bf94144 --- /dev/null +++ b/0004-Increase-file-descriptor-limit-via-systemd-service-f.patch @@ -0,0 +1,36 @@ +From 0a7ca36d99f14dcaa32cbd2e6360c382e3a9ed1a Mon Sep 17 00:00:00 2001 +From: Thomas Renninger +Date: Wed, 9 Apr 2025 09:44:19 +0200 +Subject: [PATCH 4/4] Increase file descriptor limit via systemd service file + +Default file limit value set by systemd can be found: +systemctl show --property DefaultLimitNOFILESoft +DefaultLimitNOFILESoft=1024 + +This limit could easily be exceeded on larger systems resulting in: + +Starting irqbalance Can't open class file: : Too many open files +startproc: signal catched /usr/sbin/irqbalance: Segmentation fault + +Adding the property to irqbalance.service.in sets a sane default +and allows people to easily find the right place where to adjust +the limit. +--- + misc/irqbalance.service.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/misc/irqbalance.service.in b/misc/irqbalance.service.in +index bd31039..40ff38b 100644 +--- a/misc/irqbalance.service.in ++++ b/misc/irqbalance.service.in +@@ -16,6 +16,7 @@ ReadOnlyPaths=/ + ReadWritePaths=/proc/irq + RestrictAddressFamilies=AF_UNIX AF_NETLINK + RuntimeDirectory=irqbalance/ ++LimitNOFILE=4096 + IPAddressDeny=any + ProtectHome=true + PrivateTmp=yes +-- +2.47.0 + diff --git a/0045-fix-some-GCC-fanalyzer-warnings.patch b/0045-fix-some-GCC-fanalyzer-warnings.patch new file mode 100644 index 0000000..e4acf48 --- /dev/null +++ b/0045-fix-some-GCC-fanalyzer-warnings.patch @@ -0,0 +1,113 @@ +From d43411406bb9f37968ea71c11863f485db824b23 Mon Sep 17 00:00:00 2001 +From: Rosen Penev +Date: Tue, 24 Dec 2024 15:37:35 -0800 +Subject: [PATCH 1/4] fix some GCC fanalyzer warnings + +-Wfanalyzer complains about null pointer dereferences. Check for them. + +Signed-off-by: Rosen Penev +--- + placement.c | 2 +- + ui/irqbalance-ui.c | 15 ++++++++------- + ui/ui.c | 17 +++++++++++++---- + 3 files changed, 22 insertions(+), 12 deletions(-) + +diff --git a/placement.c b/placement.c +index 3276dea..0fa4af1 100644 +--- a/placement.c ++++ b/placement.c +@@ -67,7 +67,7 @@ static void find_best_object(struct topo_obj *d, void *data) + best->best = d; + best->best_cost = newload; + } else if (newload == best->best_cost) { +- if (g_list_length(d->interrupts) < g_list_length(best->best->interrupts)) { ++ if (!best->best || g_list_length(d->interrupts) < g_list_length(best->best->interrupts)) { + best->best = d; + } + } +diff --git a/ui/irqbalance-ui.c b/ui/irqbalance-ui.c +index 4a6832a..9ed25e1 100644 +--- a/ui/irqbalance-ui.c ++++ b/ui/irqbalance-ui.c +@@ -214,17 +214,18 @@ out: { + GList * concat_child_lists(cpu_node_t *node) + { + GList *new = NULL; ++ GList *cpu_entry; + GList *child_entry = g_list_first(node->children); +- do { ++ while (child_entry) { + cpu_node_t *child = (cpu_node_t *)child_entry->data; +- GList *cpu_entry = g_list_first(child->cpu_list); +- do { ++ cpu_entry = g_list_first(child->cpu_list); ++ while (cpu_entry) { + uint64_t *cpu = (uint64_t *)cpu_entry->data; + new = g_list_append(new, cpu); + cpu_entry = g_list_next(cpu_entry); +- } while(cpu_entry != NULL); ++ }; + child_entry = g_list_next(child_entry); +- } while(child_entry != NULL); ++ } + + return new; + } +@@ -253,11 +254,11 @@ void assign_cpu_mask(cpu_node_t *node, void *data __attribute__((unused))) + mask[0] = '\0'; + unsigned int sum = 0; + GList *list_entry = g_list_first(node->cpu_list); +- do { ++ while (list_entry) { + int *cpu = list_entry->data; + sum += 1 << (*cpu); + list_entry = g_list_next(list_entry); +- } while(list_entry != NULL); ++ }; + snprintf(mask, 15, "0x%x", sum); + node->cpu_mask = mask; + +diff --git a/ui/ui.c b/ui/ui.c +index 8325bcd..b716f3b 100644 +--- a/ui/ui.c ++++ b/ui/ui.c +@@ -210,12 +210,16 @@ void display_banned_cpus(void) + + int toggle_cpu(GList *cpu_list, int cpu_number) + { ++ cpu_ban_t *entry_data; ++ + GList *entry = g_list_first(cpu_list); +- cpu_ban_t *entry_data = (cpu_ban_t *)(entry->data); +- while(entry_data->number != cpu_number) { +- entry = g_list_next(entry); ++ while (entry) { + entry_data = (cpu_ban_t *)(entry->data); ++ if (entry_data && entry_data->number == cpu_number) ++ break; ++ entry = g_list_next(entry); + } ++ + if(((cpu_ban_t *)(entry->data))->is_banned) { + ((cpu_ban_t *)(entry->data))->is_banned = 0; + } else { +@@ -522,10 +526,15 @@ int toggle_irq(GList *irq_list, int position) + { + GList *entry = g_list_first(irq_list); + int irq_node = 0; +- while(irq_node != position) { ++ ++ while(entry && irq_node != position) { + entry = g_list_next(entry); + irq_node++; + } ++ ++ if (!entry) ++ return -1; ++ + if(((irq_t *)(entry->data))->is_banned) { + ((irq_t *)(entry->data))->is_banned = 0; + } else { +-- +2.47.0 + diff --git a/0046-Check-API-command-length-allow-up-to-16384.patch b/0046-Check-API-command-length-allow-up-to-16384.patch new file mode 100644 index 0000000..735d581 --- /dev/null +++ b/0046-Check-API-command-length-allow-up-to-16384.patch @@ -0,0 +1,47 @@ +From 105b155545e00560a55d34b160324910586ae74c Mon Sep 17 00:00:00 2001 +From: Etienne Champetier +Date: Thu, 30 Jan 2025 15:20:31 -0500 +Subject: [PATCH 2/4] Check API command length, allow up to 16384 + +When using the API to ban cpus or irqs, the command can easily be longer +than 500, so increase the buffer to 16384, which fits ~3250 cpus +or irqs, and add a check to log and exit if it is still not enough. + +Signed-off-by: Etienne Champetier +--- + irqbalance.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/irqbalance.c b/irqbalance.c +index 6422a7b..f80244c 100644 +--- a/irqbalance.c ++++ b/irqbalance.c +@@ -400,12 +400,12 @@ void get_object_stat(struct topo_obj *object, void *data) + #ifdef HAVE_IRQBALANCEUI + gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attribute__((unused))) + { +- char buff[500]; ++ char buff[16384]; + int sock; + int recv_size = 0; + int valid_user = 0; + +- struct iovec iov = { buff, 500 }; ++ struct iovec iov = { buff, sizeof(buff) }; + struct msghdr msg = { + .msg_iov = &iov, + .msg_iovlen = 1, +@@ -426,6 +426,10 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri + log(TO_ALL, LOG_WARNING, "Error while receiving data.\n"); + goto out_close; + } ++ if (recv_size == sizeof(buff)) { ++ log(TO_ALL, LOG_WARNING, "Received command too long.\n"); ++ goto out_close; ++ } + cmsg = CMSG_FIRSTHDR(&msg); + if (!cmsg) { + log(TO_ALL, LOG_WARNING, "Connection no memory.\n"); +-- +2.47.0 + diff --git a/0047-check_platform_device-Check-the-length-of-path.patch b/0047-check_platform_device-Check-the-length-of-path.patch new file mode 100644 index 0000000..23d6a68 --- /dev/null +++ b/0047-check_platform_device-Check-the-length-of-path.patch @@ -0,0 +1,32 @@ +From d602002e1982a322d19034a4a64ca5a81bace7ef Mon Sep 17 00:00:00 2001 +From: Tao Liu +Date: Tue, 25 Feb 2025 16:35:34 +1300 +Subject: [PATCH 3/4] check_platform_device: Check the length of path + +The default length of path is 512, but the strcat() is used without +check if path is overflowed, otherwise a segfault is observed on +some aarch64 machines. This patch will use snprintf instead of strcat +for the buffer length checking. + +Signed-off-by: Tao Liu +--- + procinterrupts.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/procinterrupts.c b/procinterrupts.c +index 4d04bf2..e82fac7 100644 +--- a/procinterrupts.c ++++ b/procinterrupts.c +@@ -72,7 +72,8 @@ static int check_platform_device(char *name, struct irq_info *info) + memset(path, 0, 512); + + strcat(path, "/sys/devices/platform/"); +- strcat(path, name); ++ snprintf(path + strlen(path), sizeof(path) - strlen(path) - 1, ++ "%s", name); + strcat(path, "/"); + dirfd = opendir(path); + +-- +2.47.0 + diff --git a/0048-Fix-the-wrong-string-existence-checking-condition.patch b/0048-Fix-the-wrong-string-existence-checking-condition.patch new file mode 100644 index 0000000..881c5ff --- /dev/null +++ b/0048-Fix-the-wrong-string-existence-checking-condition.patch @@ -0,0 +1,41 @@ +From ffa304a885fdafaf233510baa0017ceaa1349e96 Mon Sep 17 00:00:00 2001 +From: Tao Liu +Date: Fri, 7 Mar 2025 16:08:47 +1300 +Subject: [PATCH 4/4] Fix the wrong string existence checking condition + +Commit da75aae4effd ("conver strncmp to g_str_has_prefix") introduced an error +which reversed the string existence checking condition. + +Before that commit, the check condition is: + (strncmp(name, "Level", len) == 0 || strncmp(name, "Edge", len) == 0) + +After that commit, the check condition is equal to: + (strncmp(name, "Level", len) != 0 || strncmp(name, "Edge", len) != 0) + +This is unexpected and let's fixe this error. + +Signed-off-by: Tao Liu +--- + procinterrupts.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/procinterrupts.c b/procinterrupts.c +index e82fac7..8303ad3 100644 +--- a/procinterrupts.c ++++ b/procinterrupts.c +@@ -172,9 +172,9 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq) + * /proc/interrupts format defined, after of interrupt type + * the reset string is mark the irq desc name. + */ +- if (!g_str_has_prefix(irq_name, "Level") || +- !g_str_has_prefix(irq_name, "Edge")) +- break; ++ if (g_str_has_prefix(irq_name, "Level") || ++ g_str_has_prefix(irq_name, "Edge")) ++ break; + #endif + } + +-- +2.47.0 + diff --git a/irqbalance-1.9.0-environment-file-sysconfig.patch b/irqbalance-1.9.0-environment-file-sysconfig.patch index 0850e77..c9201be 100644 --- a/irqbalance-1.9.0-environment-file-sysconfig.patch +++ b/irqbalance-1.9.0-environment-file-sysconfig.patch @@ -1,22 +1,13 @@ -From 9d3070150d151bfd5535c3da43313511659d882e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timoth=C3=A9e=20Ravier?= -Date: Mon, 1 Aug 2022 15:52:24 +0200 -Subject: [PATCH] misc/irqbalance.service: Use sysconfig for EnvironmentFile - ---- - misc/irqbalance.service | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/misc/irqbalance.service b/misc/irqbalance.service -index 7e0c5d8..9ac430f 100644 ---- a/misc/irqbalance.service -+++ b/misc/irqbalance.service +diff --git a/misc/irqbalance.service.in b/misc/irqbalance.service.in +index 40ff38b..142a9e5 100644 +--- a/misc/irqbalance.service.in ++++ b/misc/irqbalance.service.in @@ -6,8 +6,7 @@ ConditionVirtualization=!container ConditionCPUs=>1 [Service] --EnvironmentFile=-/usr/lib/irqbalance/defaults.env --EnvironmentFile=-/path/to/irqbalance.env +-EnvironmentFile=@pkgconfdir@/irqbalance.env +-EnvironmentFile=-@usrconfdir@/irqbalance +EnvironmentFile=-/etc/sysconfig/irqbalance ExecStart=/usr/sbin/irqbalance $IRQBALANCE_ARGS CapabilityBoundingSet=CAP_SETPCAP diff --git a/irqbalance.spec b/irqbalance.spec index 01fca1a..26f3752 100644 --- a/irqbalance.spec +++ b/irqbalance.spec @@ -1,6 +1,6 @@ Name: irqbalance Version: 1.9.4 -Release: 5%{?dist} +Release: 6%{?dist} Epoch: 2 Summary: IRQ balancing daemon License: GPL-2.0-only @@ -52,9 +52,22 @@ Patch43: 0042-Check-info-moved-before-updating.patch Patch44: 0043-irqbalance.1-a-b-a-b-it-s-type-its-type.patch Patch45: 0044-Use-EPERM-instead-of-EIO-when-try-setting-irq-affini.patch -Patch46: irqbalance-1.9.0-environment-file-sysconfig.patch Patch47: irqbalance-manual.patch +Patch48: 0045-fix-some-GCC-fanalyzer-warnings.patch +Patch49: 0046-Check-API-command-length-allow-up-to-16384.patch +Patch50: 0047-check_platform_device-Check-the-length-of-path.patch +Patch51: 0048-Fix-the-wrong-string-existence-checking-condition.patch +Patch52: 0001-Unify-meson-and-autoconf-Install-executables-to-sbin.patch +Patch53: 0002-Properly-embed-EnvironmentFile-sourced-systemd-confi.patch +Patch54: 0004-Increase-file-descriptor-limit-via-systemd-service-f.patch + +Patch55: irqbalance-1.9.0-environment-file-sysconfig.patch + +Patch56: 0001-Safer-string-handling-in-procinterrupts.c.patch +Patch57: 0002-Added-missing-and-fixed-message-in-procinterrupts.c.patch +Patch58: 0003-Fixed-incorrect-comparison-in-snprintf-in-procinterr.patch + BuildRequires: autoconf automake libtool libcap-ng BuildRequires: glib2-devel pkgconf libcap-ng-devel BuildRequires: systemd ncurses-devel systemd-devel @@ -109,6 +122,9 @@ make check %systemd_postun_with_restart irqbalance.service %changelog +* Tue Sep 30 2025 Tao Liu - 2:1.9.4-6 +- Rebase to upstream commit (8e8945e509) + * Mon Aug 18 2025 Tao Liu - 2:1.9.4-5 - Release 1.9.4-5