From: Karel Zak Date: Thu, 7 May 2020 13:23:03 +0000 (+0200) Subject: lscpu: add lscpu_read_vulnerabilities() X-Git-Tag: v2.37-rc1~368 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0796923aa8ec67877326a663880f09554ac02b1c;p=thirdparty%2Futil-linux.git lscpu: add lscpu_read_vulnerabilities() Signed-off-by: Karel Zak --- diff --git a/sys-utils/lscpu-api.h b/sys-utils/lscpu-api.h index 8aa1c2b11e..aa686aa14a 100644 --- a/sys-utils/lscpu-api.h +++ b/sys-utils/lscpu-api.h @@ -34,7 +34,6 @@ UL_DEBUG_DECLARE_MASK(lscpu); struct lscpu_cputype { int refcount; - char *arch; char *vendor; char *machinetype; /* s390 */ char *family; @@ -85,6 +84,11 @@ struct lscpu_arch { bit64:1; }; +struct lscpu_vulnerability { + char *name; + char *text; +}; + struct lscpu_cxt { int maxcpus; /* size in bits of kernel cpu mask */ const char *prefix; /* path to /sys and /proc snapshot or NULL */ @@ -117,6 +121,9 @@ struct lscpu_cxt { struct lscpu_arch *arch; + struct lscpu_vulnerability *vuls; /* array of CPU vulnerabilities */ + size_t nvuls; /* number of CPU vulnerabilities */ + unsigned int noalive; }; @@ -130,6 +137,7 @@ int lscpu_read_cpuinfo(struct lscpu_cxt *cxt); int lscpu_read_architecture(struct lscpu_cxt *cxt); int lscpu_read_cpulists(struct lscpu_cxt *cxt); int lscpu_read_extra(struct lscpu_cxt *cxt); +int lscpu_read_vulnerabilities(struct lscpu_cxt *cxt); struct lscpu_cpu *lscpu_new_cpu(void); void lscpu_ref_cpu(struct lscpu_cpu *cpu); diff --git a/sys-utils/lscpu-cputype.c b/sys-utils/lscpu-cputype.c index b221c8d1c4..2540b2b227 100644 --- a/sys-utils/lscpu-cputype.c +++ b/sys-utils/lscpu-cputype.c @@ -4,6 +4,8 @@ #include "lscpu-api.h" +#include "fileutils.h" + UL_DEBUG_DEFINE_MASK(lscpu); UL_DEBUG_DEFINE_MASKNAMES(lscpu) = UL_DEBUG_EMPTY_MASKNAMES; @@ -592,15 +594,78 @@ int lscpu_read_extra(struct lscpu_cxt *cxt) if (!ntypes) goto nortas; - desc->physsockets = strbe16toh(buf, 4); - desc->physchips = strbe16toh(buf, 6); - desc->physcoresperchip = strbe16toh(buf, 8); + ct->physsockets = strbe16toh(buf, 4); + ct->physchips = strbe16toh(buf, 6); + ct->physcoresperchip = strbe16toh(buf, 8); nortas: } #endif return 0; } +static int cmp_vulnerability_name(const void *a0, const void *b0) +{ + const struct lscpu_vulnerability + *a = (const struct lscpu_vulnerability *) a0, + *b = (const struct lscpu_vulnerability *) b0; + return strcmp(a->name, b->name); +} + +int lscpu_read_vulnerabilities(struct lscpu_cxt *cxt) +{ + struct dirent *d; + DIR *dir; + size_t n = 0; + + assert(cxt); + + dir = ul_path_opendir(cxt->syscpu, "vulnerabilities"); + if (!dir) + return 0; + + cxt->nvuls = n = 0; + while (xreaddir(dir)) + n++; + if (!n) + return 0; + + rewinddir(dir); + cxt->vuls = xcalloc(n, sizeof(struct lscpu_vulnerability)); + + while (cxt->nvuls < n && (d = xreaddir(dir))) { + char *str, *p; + struct lscpu_vulnerability *vu; + +#ifdef _DIRENT_HAVE_D_TYPE + if (d->d_type == DT_DIR || d->d_type == DT_UNKNOWN) + continue; +#endif + if (ul_path_readf_string(cxt->syscpu, &str, + "vulnerabilities/%s", d->d_name) <= 0) + continue; + + vu = &cxt->vuls[cxt->nvuls++]; + + /* Name */ + vu->name = xstrdup(d->d_name); + *vu->name = toupper(*vu->name); + strrep(vu->name, '_', ' '); + + /* Description */ + vu->text = str; + p = (char *) startswith(vu->text, "Mitigation"); + if (p) { + *p = ';'; + strrem(vu->text, ':'); + } + } + closedir(dir); + + qsort(cxt->vuls, cxt->nvuls, + sizeof(struct lscpu_vulnerability), cmp_vulnerability_name); + + return 0; +} #ifdef TEST_PROGRAM_CPUTYPE /* TODO: move to lscpu.c */ @@ -638,6 +703,12 @@ void lscpu_free_context(struct lscpu_cxt *cxt) free(cxt->arch); free(cxt->cputypes); free(cxt->cpus); + + for (i = 0; i < cxt->nvuls; i++) { + free(cxt->vuls[i].name); + free(cxt->vuls[i].text); + } + free(cxt->vuls); free(cxt); } @@ -659,6 +730,7 @@ int main(int argc, char **argv) lscpu_read_architecture(cxt); lscpu_read_cpulists(cxt); lscpu_read_extra(cxt); + lscpu_read_vulnerabilities(cxt); lscpu_free_context(cxt); return EXIT_SUCCESS;