From d9224c66a41e7918570b81d41495870c20380c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Tue, 24 Nov 2020 18:14:56 +0100 Subject: Use size_t as len type for xSnprintf Like the C snprintf function --- XUtils.c | 4 ++-- XUtils.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/XUtils.c b/XUtils.c index 743d98bf..cd5edb91 100644 --- a/XUtils.c +++ b/XUtils.c @@ -184,13 +184,13 @@ int xAsprintf(char** strp, const char* fmt, ...) { return r; } -int xSnprintf(char* buf, int len, const char* fmt, ...) { +int xSnprintf(char* buf, size_t len, const char* fmt, ...) { va_list vl; va_start(vl, fmt); int n = vsnprintf(buf, len, fmt, vl); va_end(vl); - if (n < 0 || n >= len) { + if (n < 0 || (size_t)n >= len) { fail(); } diff --git a/XUtils.h b/XUtils.h index e0aeebe2..19cfadb3 100644 --- a/XUtils.h +++ b/XUtils.h @@ -59,7 +59,7 @@ ATTR_FORMAT(printf, 2, 3) int xAsprintf(char** strp, const char* fmt, ...); ATTR_FORMAT(printf, 3, 4) -int xSnprintf(char* buf, int len, const char* fmt, ...); +int xSnprintf(char* buf, size_t len, const char* fmt, ...); char* xStrdup(const char* str) ATTR_NONNULL; -- cgit v1.2.3 From e1ce141bc3123c1dea7eb2ef908c8ebce945c72a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Tue, 24 Nov 2020 18:31:03 +0100 Subject: Use size_t as len type for Meter_UpdateValues Most of the time the parameter is passed to snprintf type functions --- BatteryMeter.c | 2 +- CPUMeter.c | 2 +- ClockMeter.c | 2 +- DateMeter.c | 2 +- DateTimeMeter.c | 2 +- DiskIOMeter.c | 2 +- HostnameMeter.c | 2 +- LoadAverageMeter.c | 4 ++-- MemoryMeter.c | 2 +- Meter.c | 5 ++--- Meter.h | 4 ++-- NetworkIOMeter.c | 2 +- SwapMeter.c | 2 +- TasksMeter.c | 2 +- UptimeMeter.c | 2 +- linux/PressureStallMeter.c | 2 +- linux/SELinuxMeter.c | 2 +- linux/SystemdMeter.c | 2 +- linux/ZramMeter.c | 14 +++++++++----- zfs/ZfsArcMeter.c | 2 +- zfs/ZfsCompressedArcMeter.c | 4 ++-- 21 files changed, 33 insertions(+), 30 deletions(-) diff --git a/BatteryMeter.c b/BatteryMeter.c index 5a06825f..4836809b 100644 --- a/BatteryMeter.c +++ b/BatteryMeter.c @@ -21,7 +21,7 @@ static const int BatteryMeter_attributes[] = { BATTERY }; -static void BatteryMeter_updateValues(Meter* this, char* buffer, int len) { +static void BatteryMeter_updateValues(Meter* this, char* buffer, size_t len) { ACPresence isOnAC; double percent; diff --git a/CPUMeter.c b/CPUMeter.c index 855d94bd..97fc3f0b 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -50,7 +50,7 @@ static void CPUMeter_init(Meter* this) { Meter_setCaption(this, "Avg"); } -static void CPUMeter_updateValues(Meter* this, char* buffer, int size) { +static void CPUMeter_updateValues(Meter* this, char* buffer, size_t size) { int cpu = this->param; if (cpu > this->pl->cpuCount) { xSnprintf(buffer, size, "absent"); diff --git a/ClockMeter.c b/ClockMeter.c index 3cc9dd03..023ca425 100644 --- a/ClockMeter.c +++ b/ClockMeter.c @@ -19,7 +19,7 @@ static const int ClockMeter_attributes[] = { CLOCK }; -static void ClockMeter_updateValues(Meter* this, char* buffer, int size) { +static void ClockMeter_updateValues(Meter* this, char* buffer, size_t size) { time_t t = time(NULL); struct tm result; struct tm* lt = localtime_r(&t, &result); diff --git a/DateMeter.c b/DateMeter.c index bfe0cbf1..bd6a306b 100644 --- a/DateMeter.c +++ b/DateMeter.c @@ -19,7 +19,7 @@ static const int DateMeter_attributes[] = { DATE }; -static void DateMeter_updateValues(Meter* this, char* buffer, int size) { +static void DateMeter_updateValues(Meter* this, char* buffer, size_t size) { time_t t = time(NULL); struct tm result; struct tm* lt = localtime_r(&t, &result); diff --git a/DateTimeMeter.c b/DateTimeMeter.c index ad5e81ea..0d231cd5 100644 --- a/DateTimeMeter.c +++ b/DateTimeMeter.c @@ -19,7 +19,7 @@ static const int DateTimeMeter_attributes[] = { DATETIME }; -static void DateTimeMeter_updateValues(Meter* this, char* buffer, int size) { +static void DateTimeMeter_updateValues(Meter* this, char* buffer, size_t size) { time_t t = time(NULL); struct tm result; struct tm* lt = localtime_r(&t, &result); diff --git a/DiskIOMeter.c b/DiskIOMeter.c index da6ae7d5..0105ce35 100644 --- a/DiskIOMeter.c +++ b/DiskIOMeter.c @@ -30,7 +30,7 @@ static unsigned long int cached_read_diff = 0; static unsigned long int cached_write_diff = 0; static double cached_utilisation_diff = 0.0; -static void DiskIOMeter_updateValues(Meter* this, char* buffer, int len) { +static void DiskIOMeter_updateValues(Meter* this, char* buffer, size_t len) { static unsigned long long int cached_last_update = 0; struct timeval tv; diff --git a/HostnameMeter.c b/HostnameMeter.c index 000bc3fd..af8e3493 100644 --- a/HostnameMeter.c +++ b/HostnameMeter.c @@ -19,7 +19,7 @@ static const int HostnameMeter_attributes[] = { HOSTNAME }; -static void HostnameMeter_updateValues(Meter* this, char* buffer, int size) { +static void HostnameMeter_updateValues(Meter* this, char* buffer, size_t size) { (void) this; gethostname(buffer, size - 1); } diff --git a/LoadAverageMeter.c b/LoadAverageMeter.c index 76b89ea1..d5424cd2 100644 --- a/LoadAverageMeter.c +++ b/LoadAverageMeter.c @@ -24,7 +24,7 @@ static const int LoadMeter_attributes[] = { LOAD }; -static void LoadAverageMeter_updateValues(Meter* this, char* buffer, int size) { +static void LoadAverageMeter_updateValues(Meter* this, char* buffer, size_t size) { Platform_getLoadAverage(&this->values[0], &this->values[1], &this->values[2]); xSnprintf(buffer, size, "%.2f/%.2f/%.2f", this->values[0], this->values[1], this->values[2]); } @@ -40,7 +40,7 @@ static void LoadAverageMeter_display(const Object* cast, RichString* out) { RichString_append(out, CRT_colors[LOAD_AVERAGE_FIFTEEN], buffer); } -static void LoadMeter_updateValues(Meter* this, char* buffer, int size) { +static void LoadMeter_updateValues(Meter* this, char* buffer, size_t size) { double five, fifteen; Platform_getLoadAverage(&this->values[0], &five, &fifteen); if (this->values[0] > this->total) { diff --git a/MemoryMeter.c b/MemoryMeter.c index 3d29ddf4..5e334a93 100644 --- a/MemoryMeter.c +++ b/MemoryMeter.c @@ -19,7 +19,7 @@ static const int MemoryMeter_attributes[] = { MEMORY_CACHE }; -static void MemoryMeter_updateValues(Meter* this, char* buffer, int size) { +static void MemoryMeter_updateValues(Meter* this, char* buffer, size_t size) { int written; Platform_setMemoryValues(this); diff --git a/Meter.c b/Meter.c index 71457d4d..9c9a8dea 100644 --- a/Meter.c +++ b/Meter.c @@ -49,7 +49,7 @@ Meter* Meter_new(const struct ProcessList_* pl, int param, const MeterClass* typ return this; } -int Meter_humanUnit(char* buffer, unsigned long int value, int size) { +int Meter_humanUnit(char* buffer, unsigned long int value, size_t size) { const char* prefix = "KMGTPEZY"; unsigned long int powi = 1; unsigned int powj = 1, precision = 2; @@ -441,8 +441,7 @@ const MeterMode* const Meter_modes[] = { /* Blank meter */ -static void BlankMeter_updateValues(Meter* this, char* buffer, int size) { - (void) this; (void) buffer; (void) size; +static void BlankMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, size_t size) { if (size > 0) { *buffer = 0; } diff --git a/Meter.h b/Meter.h index 43518e52..13cbebba 100644 --- a/Meter.h +++ b/Meter.h @@ -26,7 +26,7 @@ typedef struct Meter_ Meter; typedef void(*Meter_Init)(Meter*); typedef void(*Meter_Done)(Meter*); typedef void(*Meter_UpdateMode)(Meter*, int); -typedef void(*Meter_UpdateValues)(Meter*, char*, int); +typedef void(*Meter_UpdateValues)(Meter*, char*, size_t); typedef void(*Meter_Draw)(Meter*, int, int, int); typedef struct MeterClass_ { @@ -101,7 +101,7 @@ extern const MeterClass Meter_class; Meter* Meter_new(const ProcessList* pl, int param, const MeterClass* type); -int Meter_humanUnit(char* buffer, unsigned long int value, int size); +int Meter_humanUnit(char* buffer, unsigned long int value, size_t size); void Meter_delete(Object* cast); diff --git a/NetworkIOMeter.c b/NetworkIOMeter.c index a28738a2..90ec9909 100644 --- a/NetworkIOMeter.c +++ b/NetworkIOMeter.c @@ -24,7 +24,7 @@ static unsigned long int cached_rxp_diff = 0; static unsigned long int cached_txb_diff = 0; static unsigned long int cached_txp_diff = 0; -static void NetworkIOMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, int len) { +static void NetworkIOMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, size_t len) { static unsigned long long int cached_last_update = 0; struct timeval tv; diff --git a/SwapMeter.c b/SwapMeter.c index 9de7fa35..0f8bb5a4 100644 --- a/SwapMeter.c +++ b/SwapMeter.c @@ -17,7 +17,7 @@ static const int SwapMeter_attributes[] = { SWAP }; -static void SwapMeter_updateValues(Meter* this, char* buffer, int size) { +static void SwapMeter_updateValues(Meter* this, char* buffer, size_t size) { int written; Platform_setSwapValues(this); diff --git a/TasksMeter.c b/TasksMeter.c index 562cc8fc..7696988a 100644 --- a/TasksMeter.c +++ b/TasksMeter.c @@ -23,7 +23,7 @@ static const int TasksMeter_attributes[] = { TASKS_RUNNING }; -static void TasksMeter_updateValues(Meter* this, char* buffer, int len) { +static void TasksMeter_updateValues(Meter* this, char* buffer, size_t len) { const ProcessList* pl = this->pl; this->values[0] = pl->kernelThreads; this->values[1] = pl->userlandThreads; diff --git a/UptimeMeter.c b/UptimeMeter.c index 79070286..37740c21 100644 --- a/UptimeMeter.c +++ b/UptimeMeter.c @@ -17,7 +17,7 @@ static const int UptimeMeter_attributes[] = { UPTIME }; -static void UptimeMeter_updateValues(Meter* this, char* buffer, int len) { +static void UptimeMeter_updateValues(Meter* this, char* buffer, size_t len) { int totalseconds = Platform_getUptime(); if (totalseconds == -1) { xSnprintf(buffer, len, "(unknown)"); diff --git a/linux/PressureStallMeter.c b/linux/PressureStallMeter.c index d2fd7d37..745068c9 100644 --- a/linux/PressureStallMeter.c +++ b/linux/PressureStallMeter.c @@ -25,7 +25,7 @@ static const int PressureStallMeter_attributes[] = { PRESSURE_STALL_THREEHUNDRED }; -static void PressureStallMeter_updateValues(Meter* this, char* buffer, int len) { +static void PressureStallMeter_updateValues(Meter* this, char* buffer, size_t len) { const char* file; if (strstr(Meter_name(this), "CPU")) { file = "cpu"; diff --git a/linux/SELinuxMeter.c b/linux/SELinuxMeter.c index a8b07bd3..64a3f2a7 100644 --- a/linux/SELinuxMeter.c +++ b/linux/SELinuxMeter.c @@ -70,7 +70,7 @@ static bool isSelinuxEnforcing(void) { return !!enforce; } -static void SELinuxMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, int len) { +static void SELinuxMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, size_t len) { enabled = isSelinuxEnabled(); enforcing = isSelinuxEnforcing(); diff --git a/linux/SystemdMeter.c b/linux/SystemdMeter.c index d49185ee..4350d264 100644 --- a/linux/SystemdMeter.c +++ b/linux/SystemdMeter.c @@ -229,7 +229,7 @@ static void updateViaExec(void) { fclose(commandOutput); } -static void SystemdMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, int size) { +static void SystemdMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, size_t size) { free(systemState); systemState = NULL; nFailedUnits = nInstalledJobs = nNames = nJobs = INVALID_VALUE; diff --git a/linux/ZramMeter.c b/linux/ZramMeter.c index cee70586..35148871 100644 --- a/linux/ZramMeter.c +++ b/linux/ZramMeter.c @@ -11,7 +11,7 @@ static const int ZramMeter_attributes[] = { ZRAM }; -static void ZramMeter_updateValues(Meter* this, char* buffer, int size) { +static void ZramMeter_updateValues(Meter* this, char* buffer, size_t size) { int written; Platform_setZramValues(this); @@ -38,11 +38,15 @@ static void ZramMeter_updateValues(Meter* this, char* buffer, int size) { } *buffer++ = ')'; size--; - if ((size -= written) > 0) { - *buffer++ = '/'; - size--; - Meter_humanUnit(buffer, this->total, size); + if (size <= 0) { + return; + } + *buffer++ = '/'; + size--; + if (size <= 0) { + return; } + Meter_humanUnit(buffer, this->total, size); } static void ZramMeter_display(const Object* cast, RichString* out) { diff --git a/zfs/ZfsArcMeter.c b/zfs/ZfsArcMeter.c index 9bfc44b7..5b8082bb 100644 --- a/zfs/ZfsArcMeter.c +++ b/zfs/ZfsArcMeter.c @@ -33,7 +33,7 @@ void ZfsArcMeter_readStats(Meter* this, const ZfsArcStats* stats) { this->values[5] = stats->size; } -static void ZfsArcMeter_updateValues(Meter* this, char* buffer, int size) { +static void ZfsArcMeter_updateValues(Meter* this, char* buffer, size_t size) { int written; Platform_setZfsArcValues(this); diff --git a/zfs/ZfsCompressedArcMeter.c b/zfs/ZfsCompressedArcMeter.c index 31773664..8766f801 100644 --- a/zfs/ZfsCompressedArcMeter.c +++ b/zfs/ZfsCompressedArcMeter.c @@ -32,11 +32,11 @@ void ZfsCompressedArcMeter_readStats(Meter* this, const ZfsArcStats* stats) { } } -static void ZfsCompressedArcMeter_printRatioString(const Meter* this, char* buffer, int size) { +static void ZfsCompressedArcMeter_printRatioString(const Meter* this, char* buffer, size_t size) { xSnprintf(buffer, size, "%.2f:1", this->total / this->values[0]); } -static void ZfsCompressedArcMeter_updateValues(Meter* this, char* buffer, int size) { +static void ZfsCompressedArcMeter_updateValues(Meter* this, char* buffer, size_t size) { Platform_setZfsCompressedArcValues(this); ZfsCompressedArcMeter_printRatioString(this, buffer, size); -- cgit v1.2.3 From 77ec86aff4314afd893baed0d16d7bd52c387fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Tue, 24 Nov 2020 18:37:13 +0100 Subject: Use size_t as type for buffer length in Process --- Process.c | 6 +++--- Process.h | 2 +- linux/LinuxProcess.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Process.c b/Process.c index 7ea2c4af..8245f86d 100644 --- a/Process.c +++ b/Process.c @@ -223,7 +223,7 @@ static inline void Process_writeCommand(const Process* this, int attr, int basea } } -void Process_outputRate(RichString* str, char* buffer, int n, double rate, int coloring) { +void Process_outputRate(RichString* str, char* buffer, size_t n, double rate, int coloring) { int largeNumberColor = CRT_colors[LARGE_NUMBER]; int processMegabytesColor = CRT_colors[PROCESS_MEGABYTES]; int processColor = CRT_colors[PROCESS]; @@ -258,7 +258,7 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field char buffer[256]; buffer[255] = '\0'; int attr = CRT_colors[DEFAULT_COLOR]; int baseattr = CRT_colors[PROCESS_BASENAME]; - int n = sizeof(buffer) - 1; + size_t n = sizeof(buffer) - 1; bool coloring = this->settings->highlightMegabytes; switch (field) { @@ -312,7 +312,7 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field } else { ret = snprintf(buf, n, " "); } - if (ret < 0 || ret >= n) { + if (ret < 0 || (size_t)ret >= n) { written = n; } else { written = ret; diff --git a/Process.h b/Process.h index 7a68c69f..48e31b1d 100644 --- a/Process.h +++ b/Process.h @@ -176,7 +176,7 @@ void Process_printTime(RichString* str, unsigned long long totalHundredths); void Process_fillStarttimeBuffer(Process* this); -void Process_outputRate(RichString* str, char* buffer, int n, double rate, int coloring); +void Process_outputRate(RichString* str, char* buffer, size_t n, double rate, int coloring); void Process_display(const Object* cast, RichString* out); diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index f51cf1e3..8298000a 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -618,7 +618,7 @@ static void LinuxProcess_writeField(const Process* this, RichString* str, Proces bool coloring = this->settings->highlightMegabytes; char buffer[256]; buffer[255] = '\0'; int attr = CRT_colors[DEFAULT_COLOR]; - int n = sizeof(buffer) - 1; + size_t n = sizeof(buffer) - 1; switch ((int)field) { case TTY_NR: { if (lp->ttyDevice) { -- cgit v1.2.3 From ad764ff972082608604634c84e5427e7bfdcda1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Tue, 24 Nov 2020 19:34:27 +0100 Subject: Introduce METER_BUFFER_CHECK and METER_BUFFER_APPEND_CHR to cleanup writing to bar buffers Closes: #294 --- MemoryMeter.c | 11 +++++------ Meter.c | 10 +++++----- Meter.h | 23 +++++++++++++++++++++++ SwapMeter.c | 11 +++++------ linux/ZramMeter.c | 35 ++++++++++------------------------- zfs/ZfsArcMeter.c | 11 +++++------ 6 files changed, 53 insertions(+), 48 deletions(-) diff --git a/MemoryMeter.c b/MemoryMeter.c index 5e334a93..9830bf51 100644 --- a/MemoryMeter.c +++ b/MemoryMeter.c @@ -24,12 +24,11 @@ static void MemoryMeter_updateValues(Meter* this, char* buffer, size_t size) { Platform_setMemoryValues(this); written = Meter_humanUnit(buffer, this->values[0], size); - buffer += written; - if ((size -= written) > 0) { - *buffer++ = '/'; - size--; - Meter_humanUnit(buffer, this->total, size); - } + METER_BUFFER_CHECK(buffer, size, written); + + METER_BUFFER_APPEND_CHR(buffer, size, '/'); + + Meter_humanUnit(buffer, this->total, size); } static void MemoryMeter_display(const Object* cast, RichString* out) { diff --git a/Meter.c b/Meter.c index 9c9a8dea..945911c9 100644 --- a/Meter.c +++ b/Meter.c @@ -155,7 +155,7 @@ ListItem* Meter_toListItem(Meter* this, bool moving) { static void TextMeterMode_draw(Meter* this, int x, int y, int w) { char buffer[METER_BUFFER_LEN]; - Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1); + Meter_updateValues(this, buffer, sizeof(buffer)); (void) w; attrset(CRT_colors[METER_TEXT]); @@ -175,7 +175,7 @@ static const char BarMeterMode_characters[] = "|#*@$%&."; static void BarMeterMode_draw(Meter* this, int x, int y, int w) { char buffer[METER_BUFFER_LEN]; - Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1); + Meter_updateValues(this, buffer, sizeof(buffer)); w -= 2; attrset(CRT_colors[METER_TEXT]); @@ -309,8 +309,8 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) { for (int i = 0; i < nValues - 1; i++) data->values[i] = data->values[i + 1]; - char buffer[nValues]; - Meter_updateValues(this, buffer, nValues - 1); + char buffer[METER_BUFFER_LEN]; + Meter_updateValues(this, buffer, sizeof(buffer)); double value = 0.0; for (uint8_t i = 0; i < this->curItems; i++) @@ -378,7 +378,7 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) { LEDMeterMode_digits = LEDMeterMode_digitsAscii; char buffer[METER_BUFFER_LEN]; - Meter_updateValues(this, buffer, METER_BUFFER_LEN - 1); + Meter_updateValues(this, buffer, sizeof(buffer)); RichString_begin(out); Meter_displayBuffer(this, buffer, &out); diff --git a/Meter.h b/Meter.h index 13cbebba..cb054057 100644 --- a/Meter.h +++ b/Meter.h @@ -20,6 +20,29 @@ in the source distribution for its full text. #define METER_BUFFER_LEN 256 +#define METER_BUFFER_CHECK(buffer, size, written) \ + do { \ + if ((written) < 0 || (size_t)(written) >= (size)) { \ + return; \ + } \ + (buffer) += (written); \ + (size) -= (size_t)(written); \ + } while (0) + +#define METER_BUFFER_APPEND_CHR(buffer, size, c) \ + do { \ + if ((size) < 2) { \ + return; \ + } \ + *(buffer)++ = c; \ + *(buffer) = '\0'; \ + (size)--; \ + if ((size) == 0) { \ + return; \ + } \ + } while (0) + + struct Meter_; typedef struct Meter_ Meter; diff --git a/SwapMeter.c b/SwapMeter.c index 0f8bb5a4..8e39c752 100644 --- a/SwapMeter.c +++ b/SwapMeter.c @@ -22,12 +22,11 @@ static void SwapMeter_updateValues(Meter* this, char* buffer, size_t size) { Platform_setSwapValues(this); written = Meter_humanUnit(buffer, this->values[0], size); - buffer += written; - if ((size -= written) > 0) { - *buffer++ = '/'; - size--; - Meter_humanUnit(buffer, this->total, size); - } + METER_BUFFER_CHECK(buffer, size, written); + + METER_BUFFER_APPEND_CHR(buffer, size, '/'); + + Meter_humanUnit(buffer, this->total, size); } static void SwapMeter_display(const Object* cast, RichString* out) { diff --git a/linux/ZramMeter.c b/linux/ZramMeter.c index 35148871..e6b6937e 100644 --- a/linux/ZramMeter.c +++ b/linux/ZramMeter.c @@ -20,32 +20,17 @@ static void ZramMeter_updateValues(Meter* this, char* buffer, size_t size) { this->curItems = 1; written = Meter_humanUnit(buffer, this->values[0], size); - buffer += written; - size -= written; - if (size <= 0) { - return; - } - *buffer++ = '('; - size--; - if (size <= 0) { - return; - } + METER_BUFFER_CHECK(buffer, size, written); + + METER_BUFFER_APPEND_CHR(buffer, size, '('); + written = Meter_humanUnit(buffer, this->values[1], size); - buffer += written; - size -= written; - if (size <= 0) { - return; - } - *buffer++ = ')'; - size--; - if (size <= 0) { - return; - } - *buffer++ = '/'; - size--; - if (size <= 0) { - return; - } + METER_BUFFER_CHECK(buffer, size, written); + + METER_BUFFER_APPEND_CHR(buffer, size, ')'); + + METER_BUFFER_APPEND_CHR(buffer, size, '/'); + Meter_humanUnit(buffer, this->total, size); } diff --git a/zfs/ZfsArcMeter.c b/zfs/ZfsArcMeter.c index 5b8082bb..e844d779 100644 --- a/zfs/ZfsArcMeter.c +++ b/zfs/ZfsArcMeter.c @@ -38,12 +38,11 @@ static void ZfsArcMeter_updateValues(Meter* this, char* buffer, size_t size) { Platform_setZfsArcValues(this); written = Meter_humanUnit(buffer, this->values[5], size); - buffer += written; - if ((size -= written) > 0) { - *buffer++ = '/'; - size--; - Meter_humanUnit(buffer, this->total, size); - } + METER_BUFFER_CHECK(buffer, size, written); + + METER_BUFFER_APPEND_CHR(buffer, size, '/'); + + Meter_humanUnit(buffer, this->total, size); } static void ZfsArcMeter_display(const Object* cast, RichString* out) { -- cgit v1.2.3