Coverage Report

Created: 2026-03-09 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/util-linux/libblkid/src/superblocks/nvidia_raid.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
3
 * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
4
 *
5
 * Inspired by libvolume_id by
6
 *     Kay Sievers <kay.sievers@vrfy.org>
7
 *
8
 * This file may be redistributed under the terms of the
9
 * GNU Lesser General Public License.
10
 */
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <unistd.h>
14
#include <string.h>
15
#include <stdint.h>
16
17
#include "superblocks.h"
18
19
struct nv_metadata {
20
  uint8_t   vendor[8];
21
  uint32_t  size;
22
  uint32_t  chksum;
23
  uint16_t  version;
24
} __attribute__((packed));
25
26
10.6k
#define NVIDIA_SIGNATURE    "NVIDIA  "
27
5.32k
#define NVIDIA_SUPERBLOCK_SIZE    120
28
29
30
static int nvraid_verify_checksum(blkid_probe pr, const struct nv_metadata *nv,
31
          size_t bufsiz)
32
0
{
33
0
  uint32_t csum = le32_to_cpu(nv->chksum);
34
0
  uint32_t count = le32_to_cpu(nv->size);
35
36
0
  if (count > bufsiz / sizeof(uint32_t))
37
0
    return 0;
38
39
0
  for (size_t i = 0; i < count; i++)
40
0
    csum += le32_to_cpu(((uint32_t *) nv)[i]);
41
0
  return blkid_probe_verify_csum(pr, csum, le32_to_cpu(nv->chksum));
42
0
}
43
44
static int probe_nvraid(blkid_probe pr,
45
    const struct blkid_idmag *mag __attribute__((__unused__)))
46
5.32k
{
47
5.32k
  uint64_t off;
48
5.32k
  struct nv_metadata *nv;
49
50
5.32k
  if (!S_ISREG(pr->mode) && !blkid_probe_is_wholedisk(pr))
51
0
    return 1;
52
53
5.32k
  off = ((pr->size / 0x200) - 2) * 0x200;
54
5.32k
  nv = (struct nv_metadata *)
55
5.32k
    blkid_probe_get_buffer(pr,
56
5.32k
        off,
57
5.32k
        NVIDIA_SUPERBLOCK_SIZE);
58
5.32k
  if (!nv)
59
0
    return errno ? -errno : 1;
60
61
5.32k
  if (memcmp(nv->vendor, NVIDIA_SIGNATURE, sizeof(NVIDIA_SIGNATURE)-1) != 0)
62
5.32k
    return 1;
63
0
  if (le32_to_cpu(nv->size) != NVIDIA_SUPERBLOCK_SIZE / 4)
64
0
    return 1;
65
0
  if (!nvraid_verify_checksum(pr, nv, NVIDIA_SUPERBLOCK_SIZE))
66
0
    return 1;
67
0
  if (blkid_probe_sprintf_version(pr, "%u", le16_to_cpu(nv->version)) != 0)
68
0
    return 1;
69
0
  if (blkid_probe_set_magic(pr, off, sizeof(nv->vendor),
70
0
        (unsigned char *) nv->vendor))
71
0
    return 1;
72
0
  return 0;
73
0
}
74
75
const struct blkid_idinfo nvraid_idinfo = {
76
  .name   = "nvidia_raid_member",
77
  .usage    = BLKID_USAGE_RAID,
78
  .minsz    = 0x10000,
79
  .probefunc  = probe_nvraid,
80
  .magics   = BLKID_NONE_MAGIC
81
};
82
83