Coverage Report

Created: 2024-05-21 06:33

/src/util-linux/libblkid/src/superblocks/reiserfs.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (C) 1999, 2001 by Andries Brouwer
3
 * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
4
 * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
5
 *
6
 * This file may be redistributed under the terms of the
7
 * GNU Lesser General Public License.
8
 */
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <unistd.h>
12
#include <string.h>
13
#include <stdint.h>
14
15
#include "superblocks.h"
16
17
struct reiserfs_super_block {
18
  uint32_t  rs_blocks_count;
19
  uint32_t  rs_free_blocks;
20
  uint32_t  rs_root_block;
21
  uint32_t  rs_journal_block;
22
  uint32_t  rs_journal_dev;
23
  uint32_t  rs_orig_journal_size;
24
  uint32_t  rs_dummy2[5];
25
  uint16_t  rs_blocksize;
26
  uint16_t  rs_dummy3[3];
27
  unsigned char rs_magic[12];
28
  uint32_t  rs_dummy4[5];
29
  unsigned char rs_uuid[16];
30
  char    rs_label[16];
31
} __attribute__((packed));
32
33
struct reiser4_super_block {
34
  unsigned char rs4_magic[16];
35
  uint8_t   rs4_dummy[3];
36
  uint8_t   rs4_blocksize;
37
  unsigned char rs4_uuid[16];
38
  unsigned char rs4_label[16];
39
  uint64_t  rs4_dummy2;
40
} __attribute__((packed));
41
42
static int probe_reiser(blkid_probe pr, const struct blkid_idmag *mag)
43
110
{
44
110
  const struct reiserfs_super_block *rs;
45
110
  unsigned int blocksize;
46
47
110
  rs = blkid_probe_get_sb(pr, mag, struct reiserfs_super_block);
48
110
  if (!rs)
49
0
    return errno ? -errno : 1;
50
51
110
  blocksize = le16_to_cpu(rs->rs_blocksize);
52
53
  /* The blocksize must be at least 512B */
54
110
  if ((blocksize >> 9) == 0)
55
41
    return 1;
56
57
  /* If the superblock is inside the journal, we have the wrong one */
58
69
  if (mag->kboff / (blocksize >> 9) > le32_to_cpu(rs->rs_journal_block) / 2)
59
6
    return 1;
60
61
  /* LABEL/UUID are only valid for later versions of Reiserfs v3.6. */
62
63
  if (mag->magic[6] == '2' || mag->magic[6] == '3') {
63
0
    if (*rs->rs_label)
64
0
      blkid_probe_set_label(pr,
65
0
          (unsigned char *) rs->rs_label,
66
0
          sizeof(rs->rs_label));
67
0
    blkid_probe_set_uuid(pr, rs->rs_uuid);
68
0
  }
69
70
63
  if (mag->magic[6] == '3')
71
0
    blkid_probe_set_version(pr, "JR");
72
63
  else if (mag->magic[6] == '2')
73
0
    blkid_probe_set_version(pr, "3.6");
74
63
  else
75
63
    blkid_probe_set_version(pr, "3.5");
76
77
63
  blkid_probe_set_fsblocksize(pr, blocksize);
78
63
  blkid_probe_set_block_size(pr, blocksize);
79
80
63
  return 0;
81
69
}
82
83
static int probe_reiser4(blkid_probe pr, const struct blkid_idmag *mag)
84
0
{
85
0
  const struct reiser4_super_block *rs4;
86
0
  unsigned int blocksize;
87
88
0
  rs4 = blkid_probe_get_sb(pr, mag, struct reiser4_super_block);
89
0
  if (!rs4)
90
0
    return errno ? -errno : 1;
91
92
0
  blocksize = rs4->rs4_blocksize * 256;
93
94
0
  if (*rs4->rs4_label)
95
0
    blkid_probe_set_label(pr, rs4->rs4_label, sizeof(rs4->rs4_label));
96
0
  blkid_probe_set_uuid(pr, rs4->rs4_uuid);
97
0
  blkid_probe_set_version(pr, "4");
98
99
0
  blkid_probe_set_fsblocksize(pr, blocksize);
100
0
  blkid_probe_set_block_size(pr, blocksize);
101
102
0
  return 0;
103
0
}
104
105
106
const struct blkid_idinfo reiser_idinfo =
107
{
108
  .name   = "reiserfs",
109
  .usage    = BLKID_USAGE_FILESYSTEM,
110
  .probefunc  = probe_reiser,
111
  .minsz    = 128 * 1024,
112
  .magics   =
113
  {
114
    { .magic = "ReIsErFs",  .len = 8, .kboff = 8,  .sboff = 0x34 },
115
    { .magic = "ReIsEr2Fs", .len = 9, .kboff = 64, .sboff = 0x34 },
116
    { .magic = "ReIsEr3Fs", .len = 9, .kboff = 64, .sboff = 0x34 },
117
    { .magic = "ReIsErFs",  .len = 8, .kboff = 64, .sboff = 0x34 },
118
    { .magic = "ReIsErFs",  .len = 8, .kboff =  8, .sboff = 20   },
119
    { NULL }
120
  }
121
};
122
123
const struct blkid_idinfo reiser4_idinfo =
124
{
125
  .name   = "reiser4",
126
  .usage    = BLKID_USAGE_FILESYSTEM,
127
  .probefunc  = probe_reiser4,
128
  .minsz    = 128 * 1024,
129
  .magics   =
130
  {
131
    { .magic = "ReIsEr4", .len = 7, .kboff = 64 },
132
    { NULL }
133
  }
134
};
135
136
137
138