diff --git a/backport-Try-to-avoid-negative-values.patch b/backport-Try-to-avoid-negative-values.patch new file mode 100644 index 0000000..eeb61ec --- /dev/null +++ b/backport-Try-to-avoid-negative-values.patch @@ -0,0 +1,100 @@ +From c43167cca3d27940e81bfed06f6645a864d00216 Mon Sep 17 00:00:00 2001 +From: Sebastien GODARD +Date: Sun, 7 May 2023 10:16:40 +0200 +Subject: [PATCH] iostat: Try to avoid negative values (#355) + +Check for negative values to avoir displaying large numbers. + +Signed-off-by: Sebastien GODARD + +Reference:https://github.com/sysstat/sysstat/commit/c43167cca3d27940e81bfed06f6645a864d00216 +Conflict:NA +--- + iostat.c | 28 +++++++++++++++++++++------- + rd_stats.c | 4 +++- + 2 files changed, 24 insertions(+), 8 deletions(-) + +diff --git a/iostat.c b/iostat.c +index 41a1dbd..23b12f7 100644 +--- a/iostat.c ++++ b/iostat.c +@@ -1001,6 +1001,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + if ((hpart == 1) || !hpart) { + /* r/s */ + cprintf_f(NO_UNIT, 1, 7, 2, ++ ioi->rd_ios < ioj->rd_ios ? 0.0 : + S_VALUE(ioj->rd_ios, ioi->rd_ios, itv)); + /* rkB/s */ + if (!DISPLAY_UNIT(flags)) { +@@ -1024,6 +1025,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + if ((hpart == 2) || !hpart) { + /* w/s */ + cprintf_f(NO_UNIT, 1, 7, 2, ++ ioi->wr_ios < ioj->wr_ios ? 0.0 : + S_VALUE(ioj->wr_ios, ioi->wr_ios, itv)); + /* wkB/s */ + if (!DISPLAY_UNIT(flags)) { +@@ -1047,6 +1049,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + if ((hpart == 3) || !hpart) { + /* d/s */ + cprintf_f(NO_UNIT, 1, 7, 2, ++ ioi->dc_ios < ioj->dc_ios ? 0.0 : + S_VALUE(ioj->dc_ios, ioi->dc_ios, itv)); + /* dkB/s */ + if (!DISPLAY_UNIT(flags)) { +@@ -1148,9 +1151,12 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + } + else { + printf("\"r/s\": %.2f, \"w/s\": %.2f, \"d/s\": %.2f, ", +- S_VALUE(ioj->rd_ios, ioi->rd_ios, itv), +- S_VALUE(ioj->wr_ios, ioi->wr_ios, itv), +- S_VALUE(ioj->dc_ios, ioi->dc_ios, itv)); ++ ioi->rd_ios < ioj->rd_ios ? 0.0 ++ : S_VALUE(ioj->rd_ios, ioi->rd_ios, itv), ++ ioi->wr_ios < ioj->wr_ios ? 0.0 ++ : S_VALUE(ioj->wr_ios, ioi->wr_ios, itv), ++ ioi->dc_ios < ioj->dc_ios ? 0.0 ++ : S_VALUE(ioj->dc_ios, ioi->dc_ios, itv)); + if (DISPLAY_MEGABYTES(flags)) { + sprintf(line, "\"rMB/s\": %%.2f, \"wMB/s\": %%.2f, \"dMB/s\": %%.2f, "); + } +@@ -1256,10 +1262,18 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, + compute_ext_disk_stats(&sdc, &sdp, itv, &xds); + } + +- /* rkB/s wkB/s dkB/s */ +- xios.rsectors = S_VALUE(ioj->rd_sectors, ioi->rd_sectors, itv); +- xios.wsectors = S_VALUE(ioj->wr_sectors, ioi->wr_sectors, itv); +- xios.dsectors = S_VALUE(ioj->dc_sectors, ioi->dc_sectors, itv); ++ /* ++ * rkB/s wkB/s dkB/s ++ * Note: We've already tried to determine if a device had been ++ * removed then added again (see write_stats() function). ++ * Anyway we need to check again for possible negative values. ++ */ ++ xios.rsectors = ioi->rd_sectors < ioj->rd_sectors ? 0.0 : ++ S_VALUE(ioj->rd_sectors, ioi->rd_sectors, itv); ++ xios.wsectors = ioi->wr_sectors < ioj->wr_sectors ? 0.0 : ++ S_VALUE(ioj->wr_sectors, ioi->wr_sectors, itv); ++ xios.dsectors = ioi->dc_sectors < ioj->dc_sectors ? 0.0 : ++ S_VALUE(ioj->dc_sectors, ioi->dc_sectors, itv); + + if (DISPLAY_SHORT_OUTPUT(flags)) { + xios.sectors = xios.rsectors + xios.wsectors + xios.dsectors; +diff --git a/rd_stats.c b/rd_stats.c +index 58d8a44..fcae43e 100644 +--- a/rd_stats.c ++++ b/rd_stats.c +@@ -369,7 +369,9 @@ void read_uptime(unsigned long long *uptime) + void compute_ext_disk_stats(struct stats_disk *sdc, struct stats_disk *sdp, + unsigned long long itv, struct ext_disk_stats *xds) + { +- xds->util = S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv); ++ xds->util = sdc->tot_ticks < sdp->tot_ticks ? ++ 0.0 : ++ S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv); + /* + * Kernel gives ticks already in milliseconds for all platforms + * => no need for further scaling. +-- +2.33.0 diff --git a/backport-Try-to-avoid-some-more-negative-values.patch b/backport-Try-to-avoid-some-more-negative-values.patch new file mode 100644 index 0000000..8f35d84 --- /dev/null +++ b/backport-Try-to-avoid-some-more-negative-values.patch @@ -0,0 +1,189 @@ +From 3442cec3872d6c07eda21d147ebdd35ef2fea620 Mon Sep 17 00:00:00 2001 +From: Sebastien GODARD +Date: Sat, 27 May 2023 16:31:05 +0200 +Subject: [PATCH] iostat: Try to avoid some more negative values (#355) + +Signed-off-by: Sebastien GODARD + +Reference:https://github.com/sysstat/sysstat/commit/3442cec3872d6c07eda21d147ebdd35ef2fea620 +Conflict:NA + +--- + iostat.c | 40 +++++++++++++++++++++++++++++----------- + rd_stats.c | 4 ++-- + 2 files changed, 31 insertions(+), 13 deletions(-) + +diff --git a/iostat.c b/iostat.c +index 23b12f7..04b6ae3 100644 +--- a/iostat.c ++++ b/iostat.c +@@ -970,6 +970,8 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + if (DISPLAY_SHORT_OUTPUT(flags)) { + /* tps */ + cprintf_f(NO_UNIT, 1, 8, 2, ++ ioi->rd_ios + ioi->wr_ios + ioi->dc_ios < ioj->rd_ios + ioj->wr_ios + ioj->dc_ios ? ++ 0.0 : + S_VALUE(ioj->rd_ios + ioj->wr_ios + ioj->dc_ios, + ioi->rd_ios + ioi->wr_ios + ioi->dc_ios, itv)); + /* kB/s */ +@@ -980,6 +982,8 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + xios->sectors); + /* rqm/s */ + cprintf_f(NO_UNIT, 1, 8, 2, ++ ioi->rd_merges + ioi->wr_merges + ioi->dc_merges < ioj->rd_merges + ioj->wr_merges + ioj->dc_merges ? ++ 0.0 : + S_VALUE(ioj->rd_merges + ioj->wr_merges + ioj->dc_merges, + ioi->rd_merges + ioi->wr_merges + ioi->dc_merges, itv)); + /* await */ +@@ -990,6 +994,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + xds->arqsz / 2); + /* aqu-sz */ + cprintf_f(NO_UNIT, 1, 7, 2, ++ ioi->rq_ticks < ioj->rq_ticks ? 0.0 : + S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + /* + * %util +@@ -1011,6 +1016,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + xios->rsectors); + /* rrqm/s */ + cprintf_f(NO_UNIT, 1, 8, 2, ++ ioi->rd_merges < ioj->rd_merges ? 0.0 : + S_VALUE(ioj->rd_merges, ioi->rd_merges, itv)); + /* %rrqm */ + cprintf_pc(DISPLAY_UNIT(flags), 1, 6, 2, +@@ -1035,6 +1041,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + xios->wsectors); + /* wrqm/s */ + cprintf_f(NO_UNIT, 1, 8, 2, ++ ioi->wr_merges < ioj->wr_merges ? 0.0 : + S_VALUE(ioj->wr_merges, ioi->wr_merges, itv)); + /* %wrqm */ + cprintf_pc(DISPLAY_UNIT(flags), 1, 6, 2, +@@ -1059,6 +1066,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + xios->dsectors); + /* drqm/s */ + cprintf_f(NO_UNIT, 1, 8, 2, ++ ioi->dc_merges < ioj->dc_merges ? 0.0 : + S_VALUE(ioj->dc_merges, ioi->dc_merges, itv)); + /* %drqm */ + cprintf_pc(DISPLAY_UNIT(flags), 1, 6, 2, +@@ -1073,6 +1081,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + if ((hpart == 4) || !hpart) { + /* aqu-sz */ + cprintf_f(NO_UNIT, 1, 7, 2, ++ ioi->rq_ticks < ioj->rq_ticks ? 0.0 : + S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + /* + * %util +@@ -1129,6 +1138,8 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + + if (DISPLAY_SHORT_OUTPUT(flags)) { + printf("\"tps\": %.2f, \"", ++ ioi->rd_ios + ioi->wr_ios + ioi->dc_ios < ioj->rd_ios + ioj->wr_ios + ioj->dc_ios ? ++ 0.0 : + S_VALUE(ioj->rd_ios + ioj->wr_ios + ioj->dc_ios, + ioi->rd_ios + ioi->wr_ios + ioi->dc_ios, itv)); + if (DISPLAY_MEGABYTES(flags)) { +@@ -1143,11 +1154,14 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + printf("\": %.2f, \"rqm/s\": %.2f, \"await\": %.2f, " + "\"areq-sz\": %.2f, \"aqu-sz\": %.2f, ", + xios->sectors /= fctr, ++ ioi->rd_merges + ioi->wr_merges + ioi->dc_merges < ioj->rd_merges + ioj->wr_merges + ioj->dc_merges ? ++ 0.0 : + S_VALUE(ioj->rd_merges + ioj->wr_merges + ioj->dc_merges, + ioi->rd_merges + ioi->wr_merges + ioi->dc_merges, itv), + xds->await, + xds->arqsz / 2, +- S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); ++ ioi->rq_ticks < ioj->rq_ticks ? 0.0 ++ : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + } + else { + printf("\"r/s\": %.2f, \"w/s\": %.2f, \"d/s\": %.2f, ", +@@ -1175,9 +1189,12 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + "\"r_await\": %.2f, \"w_await\": %.2f, \"d_await\": %.2f, " + "\"rareq-sz\": %.2f, \"wareq-sz\": %.2f, \"dareq-sz\": %.2f, " + "\"aqu-sz\": %.2f, ", +- S_VALUE(ioj->rd_merges, ioi->rd_merges, itv), +- S_VALUE(ioj->wr_merges, ioi->wr_merges, itv), +- S_VALUE(ioj->dc_merges, ioi->dc_merges, itv), ++ ioi->rd_merges < ioj->rd_merges ? 0.0 ++ : S_VALUE(ioj->rd_merges, ioi->rd_merges, itv), ++ ioi->wr_merges < ioj->wr_merges ? 0.0 ++ : S_VALUE(ioj->wr_merges, ioi->wr_merges, itv), ++ ioi->dc_merges < ioj->dc_merges ? 0.0 ++ : S_VALUE(ioj->dc_merges, ioi->dc_merges, itv), + xios->rrqm_pc, + xios->wrqm_pc, + xios->drqm_pc, +@@ -1187,7 +1204,8 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + xios->rarqsz / 2, + xios->warqsz / 2, + xios->darqsz / 2, +- S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); ++ ioi->rq_ticks < ioj->rq_ticks ? 0.0 ++ : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + } + + if (d->dev_tp > T_GROUP) { +@@ -1286,11 +1304,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, + ((ioi->rd_merges - ioj->rd_merges) + (ioi->rd_ios - ioj->rd_ios)) * 100 : + 0.0; + /* r_await */ +- xios.r_await = (ioi->rd_ios - ioj->rd_ios) ? ++ xios.r_await = (ioi->rd_ios > ioj->rd_ios) ? + (ioi->rd_ticks - ioj->rd_ticks) / + ((double) (ioi->rd_ios - ioj->rd_ios)) : 0.0; + /* rareq-sz (still in sectors, not kB) */ +- xios.rarqsz = (ioi->rd_ios - ioj->rd_ios) ? ++ xios.rarqsz = (ioi->rd_ios > ioj->rd_ios) ? + (ioi->rd_sectors - ioj->rd_sectors) / ((double) (ioi->rd_ios - ioj->rd_ios)) : + 0.0; + } +@@ -1301,11 +1319,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, + ((ioi->wr_merges - ioj->wr_merges) + (ioi->wr_ios - ioj->wr_ios)) * 100 : + 0.0; + /* w_await */ +- xios.w_await = (ioi->wr_ios - ioj->wr_ios) ? ++ xios.w_await = (ioi->wr_ios > ioj->wr_ios) ? + (ioi->wr_ticks - ioj->wr_ticks) / + ((double) (ioi->wr_ios - ioj->wr_ios)) : 0.0; + /* wareq-sz (still in sectors, not kB) */ +- xios.warqsz = (ioi->wr_ios - ioj->wr_ios) ? ++ xios.warqsz = (ioi->wr_ios > ioj->wr_ios) ? + (ioi->wr_sectors - ioj->wr_sectors) / ((double) (ioi->wr_ios - ioj->wr_ios)) : + 0.0; + } +@@ -1316,11 +1334,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, + ((ioi->dc_merges - ioj->dc_merges) + (ioi->dc_ios - ioj->dc_ios)) * 100 : + 0.0; + /* d_await */ +- xios.d_await = (ioi->dc_ios - ioj->dc_ios) ? ++ xios.d_await = (ioi->dc_ios > ioj->dc_ios) ? + (ioi->dc_ticks - ioj->dc_ticks) / + ((double) (ioi->dc_ios - ioj->dc_ios)) : 0.0; + /* dareq-sz (still in sectors, not kB) */ +- xios.darqsz = (ioi->dc_ios - ioj->dc_ios) ? ++ xios.darqsz = (ioi->dc_ios > ioj->dc_ios) ? + (ioi->dc_sectors - ioj->dc_sectors) / ((double) (ioi->dc_ios - ioj->dc_ios)) : + 0.0; + } +diff --git a/rd_stats.c b/rd_stats.c +index fcae43e..610b843 100644 +--- a/rd_stats.c ++++ b/rd_stats.c +@@ -376,10 +376,10 @@ void compute_ext_disk_stats(struct stats_disk *sdc, struct stats_disk *sdp, + * Kernel gives ticks already in milliseconds for all platforms + * => no need for further scaling. + */ +- xds->await = (sdc->nr_ios - sdp->nr_ios) ? ++ xds->await = (sdc->nr_ios > sdp->nr_ios) ? + ((sdc->rd_ticks - sdp->rd_ticks) + (sdc->wr_ticks - sdp->wr_ticks) + (sdc->dc_ticks - sdp->dc_ticks)) / + ((double) (sdc->nr_ios - sdp->nr_ios)) : 0.0; +- xds->arqsz = (sdc->nr_ios - sdp->nr_ios) ? ++ xds->arqsz = (sdc->nr_ios > sdp->nr_ios) ? + ((sdc->rd_sect - sdp->rd_sect) + (sdc->wr_sect - sdp->wr_sect) + (sdc->dc_sect - sdp->dc_sect)) / + ((double) (sdc->nr_ios - sdp->nr_ios)) : 0.0; + } +-- +2.33.0 diff --git a/sysstat.spec b/sysstat.spec index ae4dfdd..2bd59b7 100644 --- a/sysstat.spec +++ b/sysstat.spec @@ -1,6 +1,6 @@ Name: sysstat Version: 12.2.1 -Release: 6 +Release: 7 Summary: System performance tools for the Linux operating system License: GPLv2+ URL: http://sebastien.godard.pagesperso-orange.fr/ @@ -10,6 +10,8 @@ Patch6000: backport-CVE-2022-39377.patch Patch6001: backport-0001-CVE-2023-33204.patch Patch6002: backport-0002-CVE-2023-33204.patch Patch6003: backport-0003-CVE-2023-33204.patch +Patch6004: backport-Try-to-avoid-negative-values.patch +Patch6005: backport-Try-to-avoid-some-more-negative-values.patch BuildRequires: gcc, gettext, lm_sensors-devel, systemd @@ -91,6 +93,9 @@ export compressafter="31" %{_mandir}/man*/* %changelog +* Tue Jun 20 2023 zhouwenpei - 12.2.1-7 +- Try to avoid negative values + * Mon May 29 2023 zhouwenpei - 12.2.1-6 - add missing patch