diff --git a/RichString.c b/RichString.c index 556674b0d..248b3ae04 100644 --- a/RichString.c +++ b/RichString.c @@ -9,7 +9,9 @@ in the source distribution for its full text. #include "RichString.h" +#include #include +#include // IWYU pragma: keep #include #include @@ -144,7 +146,8 @@ static inline int RichString_writeFromAscii(RichString* this, int attrs, const c int newLen = from + len; RichString_setLen(this, newLen); for (int i = from, j = 0; i < newLen; i++, j++) { - this->chptr[i] = (CharType) { .attr = attrs & 0xffffff, .chars = { (isprint(data[j]) ? data[j] : L'\xFFFD') } }; + assert((unsigned char)data[j] <= SCHAR_MAX); + this->chptr[i] = (CharType) { .attr = attrs & 0xffffff, .chars = { (isprint((unsigned char)data[j]) ? data[j] : L'\xFFFD') } }; } return len; diff --git a/Settings.c b/Settings.c index 07b7e6a28..5913af27a 100644 --- a/Settings.c +++ b/Settings.c @@ -233,7 +233,7 @@ static const char* toFieldName(Hashtable* columns, int id, bool* enabled) { } static int toFieldIndex(Hashtable* columns, const char* str) { - if (isdigit(str[0])) { + if (isdigit((unsigned char)str[0])) { // This "+1" is for compatibility with the older enum format. int id = atoi(str) + 1; if (toFieldName(columns, id, NULL)) { diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index 741fe19dc..e70d7d0c9 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -284,9 +284,18 @@ static void LinuxProcess_rowWriteField(const Row* super, RichString* str, Proces #ifdef HAVE_VSERVER case VXID: xSnprintf(buffer, n, "%5u ", lp->vxid); break; #endif - case CGROUP: xSnprintf(buffer, n, "%-*.*s ", Row_fieldWidths[CGROUP], Row_fieldWidths[CGROUP], lp->cgroup ? lp->cgroup : "N/A"); break; - case CCGROUP: xSnprintf(buffer, n, "%-*.*s ", Row_fieldWidths[CCGROUP], Row_fieldWidths[CCGROUP], lp->cgroup_short ? lp->cgroup_short : (lp->cgroup ? lp->cgroup : "N/A")); break; - case CONTAINER: xSnprintf(buffer, n, "%-*.*s ", Row_fieldWidths[CONTAINER], Row_fieldWidths[CONTAINER], lp->container_short ? lp->container_short : "N/A"); break; + case CGROUP: + xSnprintf(buffer, n, "%-*.*s ", Row_fieldWidths[CGROUP], Row_fieldWidths[CGROUP], lp->cgroup ? lp->cgroup : "N/A"); + RichString_appendWide(str, attr, buffer); + return; + case CCGROUP: + xSnprintf(buffer, n, "%-*.*s ", Row_fieldWidths[CCGROUP], Row_fieldWidths[CCGROUP], lp->cgroup_short ? lp->cgroup_short : (lp->cgroup ? lp->cgroup : "N/A")); + RichString_appendWide(str, attr, buffer); + return; + case CONTAINER: + xSnprintf(buffer, n, "%-*.*s ", Row_fieldWidths[CONTAINER], Row_fieldWidths[CONTAINER], lp->container_short ? lp->container_short : "N/A"); + RichString_appendWide(str, attr, buffer); + return; case OOM: xSnprintf(buffer, n, "%4u ", lp->oom); break; case IO_PRIORITY: { int klass = IOPriority_class(lp->ioPriority); @@ -317,7 +326,10 @@ static void LinuxProcess_rowWriteField(const Row* super, RichString* str, Proces } xSnprintf(buffer, n, "%5lu ", lp->ctxt_diff); break; - case SECATTR: snprintf(buffer, n, "%-*.*s ", Row_fieldWidths[SECATTR], Row_fieldWidths[SECATTR], lp->secattr ? lp->secattr : "N/A"); break; + case SECATTR: + snprintf(buffer, n, "%-*.*s ", Row_fieldWidths[SECATTR], Row_fieldWidths[SECATTR], lp->secattr ? lp->secattr : "N/A"); + RichString_appendWide(str, attr, buffer); + return; case AUTOGROUP_ID: if (lp->autogroup_id != -1) { xSnprintf(buffer, n, "%4ld ", lp->autogroup_id);