]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: add lscpu_read_vulnerabilities()
authorKarel Zak <kzak@redhat.com>
Thu, 7 May 2020 13:23:03 +0000 (15:23 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 13 Nov 2020 08:19:02 +0000 (09:19 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
sys-utils/lscpu-api.h
sys-utils/lscpu-cputype.c

index 8aa1c2b11e0efc3600793e065dec05b3cf63aa70..aa686aa14a6a73b7ef79625ef34e00988bf8bfbf 100644 (file)
@@ -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);
index b221c8d1c45a03df9b497ca9d72bbad6ca20c4cd..2540b2b227b60df6da7e75c2a55d13f66225ad1f 100644 (file)
@@ -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;