Coverage Report

Created: 2025-07-11 06:31

/work/fu-uf2-struct.c
Line
Count
Source (jump to first uncovered line)
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include "fu-uf2-struct.h"
5
#include "fu-byte-array.h"
6
#include "fu-mem-private.h"
7
#include "fu-string.h"
8
9
#ifdef G_LOG_DOMAIN
10
  #undef G_LOG_DOMAIN
11
#endif
12
0
#define G_LOG_DOMAIN "FuStruct"
13
/* getters */
14
/**
15
 * fu_struct_uf2_get_magic0: (skip):
16
 **/
17
static guint32
18
fu_struct_uf2_get_magic0(const FuStructUf2 *st)
19
1.29k
{
20
1.29k
    g_return_val_if_fail(st != NULL, 0x0);
21
1.29k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
22
1.29k
}
23
/**
24
 * fu_struct_uf2_get_magic1: (skip):
25
 **/
26
static guint32
27
fu_struct_uf2_get_magic1(const FuStructUf2 *st)
28
1.21k
{
29
1.21k
    g_return_val_if_fail(st != NULL, 0x0);
30
1.21k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
31
1.21k
}
32
/**
33
 * fu_struct_uf2_get_flags: (skip):
34
 **/
35
guint32
36
fu_struct_uf2_get_flags(const FuStructUf2 *st)
37
1.01k
{
38
1.01k
    g_return_val_if_fail(st != NULL, 0x0);
39
1.01k
    return fu_memread_uint32(st->data + 8, G_LITTLE_ENDIAN);
40
1.01k
}
41
/**
42
 * fu_struct_uf2_get_target_addr: (skip):
43
 **/
44
guint32
45
fu_struct_uf2_get_target_addr(const FuStructUf2 *st)
46
398
{
47
398
    g_return_val_if_fail(st != NULL, 0x0);
48
398
    return fu_memread_uint32(st->data + 12, G_LITTLE_ENDIAN);
49
398
}
50
/**
51
 * fu_struct_uf2_get_payload_size: (skip):
52
 **/
53
guint32
54
fu_struct_uf2_get_payload_size(const FuStructUf2 *st)
55
1.01k
{
56
1.01k
    g_return_val_if_fail(st != NULL, 0x0);
57
1.01k
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
58
1.01k
}
59
/**
60
 * fu_struct_uf2_get_block_no: (skip):
61
 **/
62
guint32
63
fu_struct_uf2_get_block_no(const FuStructUf2 *st)
64
1.03k
{
65
1.03k
    g_return_val_if_fail(st != NULL, 0x0);
66
1.03k
    return fu_memread_uint32(st->data + 20, G_LITTLE_ENDIAN);
67
1.03k
}
68
/**
69
 * fu_struct_uf2_get_num_blocks: (skip):
70
 **/
71
guint32
72
fu_struct_uf2_get_num_blocks(const FuStructUf2 *st)
73
935
{
74
935
    g_return_val_if_fail(st != NULL, 0x0);
75
935
    return fu_memread_uint32(st->data + 24, G_LITTLE_ENDIAN);
76
935
}
77
/**
78
 * fu_struct_uf2_get_family_id: (skip):
79
 **/
80
guint32
81
fu_struct_uf2_get_family_id(const FuStructUf2 *st)
82
980
{
83
980
    g_return_val_if_fail(st != NULL, 0x0);
84
980
    return fu_memread_uint32(st->data + 28, G_LITTLE_ENDIAN);
85
980
}
86
/**
87
 * fu_struct_uf2_get_data: (skip):
88
 **/
89
const guint8 *
90
fu_struct_uf2_get_data(const FuStructUf2 *st, gsize *bufsz)
91
932
{
92
932
    g_return_val_if_fail(st != NULL, NULL);
93
932
    if (bufsz != NULL)
94
0
        *bufsz = 476;
95
932
    return st->data + 32;
96
932
}
97
/**
98
 * fu_struct_uf2_get_magic_end: (skip):
99
 **/
100
static guint32
101
fu_struct_uf2_get_magic_end(const FuStructUf2 *st)
102
1.19k
{
103
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
104
1.19k
    return fu_memread_uint32(st->data + 508, G_LITTLE_ENDIAN);
105
1.19k
}
106
107
/* setters */
108
/**
109
 * fu_struct_uf2_set_magic0: (skip):
110
 **/
111
static void
112
fu_struct_uf2_set_magic0(FuStructUf2 *st, guint32 value)
113
902
{
114
902
    g_return_if_fail(st != NULL);
115
902
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
116
902
}
117
/**
118
 * fu_struct_uf2_set_magic1: (skip):
119
 **/
120
static void
121
fu_struct_uf2_set_magic1(FuStructUf2 *st, guint32 value)
122
902
{
123
902
    g_return_if_fail(st != NULL);
124
902
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
125
902
}
126
/**
127
 * fu_struct_uf2_set_flags: (skip):
128
 **/
129
void
130
fu_struct_uf2_set_flags(FuStructUf2 *st, guint32 value)
131
902
{
132
902
    g_return_if_fail(st != NULL);
133
902
    fu_memwrite_uint32(st->data + 8, value, G_LITTLE_ENDIAN);
134
902
}
135
/**
136
 * fu_struct_uf2_set_target_addr: (skip):
137
 **/
138
void
139
fu_struct_uf2_set_target_addr(FuStructUf2 *st, guint32 value)
140
902
{
141
902
    g_return_if_fail(st != NULL);
142
902
    fu_memwrite_uint32(st->data + 12, value, G_LITTLE_ENDIAN);
143
902
}
144
/**
145
 * fu_struct_uf2_set_payload_size: (skip):
146
 **/
147
void
148
fu_struct_uf2_set_payload_size(FuStructUf2 *st, guint32 value)
149
902
{
150
902
    g_return_if_fail(st != NULL);
151
902
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
152
902
}
153
/**
154
 * fu_struct_uf2_set_block_no: (skip):
155
 **/
156
void
157
fu_struct_uf2_set_block_no(FuStructUf2 *st, guint32 value)
158
902
{
159
902
    g_return_if_fail(st != NULL);
160
902
    fu_memwrite_uint32(st->data + 20, value, G_LITTLE_ENDIAN);
161
902
}
162
/**
163
 * fu_struct_uf2_set_num_blocks: (skip):
164
 **/
165
void
166
fu_struct_uf2_set_num_blocks(FuStructUf2 *st, guint32 value)
167
902
{
168
902
    g_return_if_fail(st != NULL);
169
902
    fu_memwrite_uint32(st->data + 24, value, G_LITTLE_ENDIAN);
170
902
}
171
/**
172
 * fu_struct_uf2_set_family_id: (skip):
173
 **/
174
void
175
fu_struct_uf2_set_family_id(FuStructUf2 *st, guint32 value)
176
902
{
177
902
    g_return_if_fail(st != NULL);
178
902
    fu_memwrite_uint32(st->data + 28, value, G_LITTLE_ENDIAN);
179
902
}
180
/**
181
 * fu_struct_uf2_set_data: (skip):
182
 **/
183
gboolean
184
fu_struct_uf2_set_data(FuStructUf2 *st, const guint8 *buf, gsize bufsz, GError **error)
185
902
{
186
902
    g_return_val_if_fail(st != NULL, FALSE);
187
902
    g_return_val_if_fail(buf != NULL, FALSE);
188
902
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
189
902
    return fu_memcpy_safe(st->data, st->len, 32, buf, bufsz, 0x0, bufsz, error);
190
902
}
191
/**
192
 * fu_struct_uf2_set_magic_end: (skip):
193
 **/
194
static void
195
fu_struct_uf2_set_magic_end(FuStructUf2 *st, guint32 value)
196
902
{
197
902
    g_return_if_fail(st != NULL);
198
902
    fu_memwrite_uint32(st->data + 508, value, G_LITTLE_ENDIAN);
199
902
}
200
/**
201
 * fu_struct_uf2_new: (skip):
202
 **/
203
FuStructUf2 *
204
fu_struct_uf2_new(void)
205
902
{
206
902
    FuStructUf2 *st = g_byte_array_sized_new(512);
207
902
    fu_byte_array_set_size(st, 512, 0x0);
208
902
    fu_struct_uf2_set_magic0(st, 0x0A324655);
209
902
    fu_struct_uf2_set_magic1(st, 0x9E5D5157);
210
902
    fu_struct_uf2_set_magic_end(st, 0x0AB16F30);
211
902
    return st;
212
902
}
213
/**
214
 * fu_struct_uf2_to_string: (skip):
215
 **/
216
static gchar *
217
fu_struct_uf2_to_string(const FuStructUf2 *st)
218
0
{
219
0
    g_autoptr(GString) str = g_string_new("FuStructUf2:\n");
220
0
    g_return_val_if_fail(st != NULL, NULL);
221
0
    g_string_append_printf(str, "  flags: 0x%x\n",
222
0
                           (guint) fu_struct_uf2_get_flags(st));
223
0
    g_string_append_printf(str, "  target_addr: 0x%x\n",
224
0
                           (guint) fu_struct_uf2_get_target_addr(st));
225
0
    g_string_append_printf(str, "  payload_size: 0x%x\n",
226
0
                           (guint) fu_struct_uf2_get_payload_size(st));
227
0
    g_string_append_printf(str, "  block_no: 0x%x\n",
228
0
                           (guint) fu_struct_uf2_get_block_no(st));
229
0
    g_string_append_printf(str, "  num_blocks: 0x%x\n",
230
0
                           (guint) fu_struct_uf2_get_num_blocks(st));
231
0
    g_string_append_printf(str, "  family_id: 0x%x\n",
232
0
                           (guint) fu_struct_uf2_get_family_id(st));
233
0
    {
234
0
        gsize bufsz = 0;
235
0
        const guint8 *buf = fu_struct_uf2_get_data(st, &bufsz);
236
0
        g_autoptr(GString) tmp = g_string_new(NULL);
237
0
        for (gsize i = 0; i < bufsz; i++)
238
0
            g_string_append_printf(tmp, "%02X", buf[i]);
239
0
        g_string_append_printf(str, "  data: 0x%s\n", tmp->str);
240
0
    }
241
0
    if (str->len > 0)
242
0
        g_string_set_size(str, str->len - 1);
243
0
    return g_string_free(g_steal_pointer(&str), FALSE);
244
0
}
245
static gboolean
246
fu_struct_uf2_validate_internal(FuStructUf2 *st, GError **error)
247
1.22k
{
248
1.22k
    g_return_val_if_fail(st != NULL, FALSE);
249
1.22k
    if (fu_struct_uf2_get_magic0(st) != 0x0A324655) {
250
66
        g_set_error(error,
251
66
                    FWUPD_ERROR,
252
66
                    FWUPD_ERROR_INVALID_DATA,
253
66
                    "constant FuStructUf2.magic0 was not valid, "
254
66
                    "expected 0x%x and got 0x%x",
255
66
                    (guint) 0x0A324655,
256
66
                    (guint) fu_struct_uf2_get_magic0(st));
257
66
        return FALSE;
258
66
    }
259
1.15k
    if (fu_struct_uf2_get_magic1(st) != 0x9E5D5157) {
260
54
        g_set_error(error,
261
54
                    FWUPD_ERROR,
262
54
                    FWUPD_ERROR_INVALID_DATA,
263
54
                    "constant FuStructUf2.magic1 was not valid, "
264
54
                    "expected 0x%x and got 0x%x",
265
54
                    (guint) 0x9E5D5157,
266
54
                    (guint) fu_struct_uf2_get_magic1(st));
267
54
        return FALSE;
268
54
    }
269
1.10k
    if (fu_struct_uf2_get_magic_end(st) != 0x0AB16F30) {
270
90
        g_set_error(error,
271
90
                    FWUPD_ERROR,
272
90
                    FWUPD_ERROR_INVALID_DATA,
273
90
                    "constant FuStructUf2.magic_end was not valid, "
274
90
                    "expected 0x%x and got 0x%x",
275
90
                    (guint) 0x0AB16F30,
276
90
                    (guint) fu_struct_uf2_get_magic_end(st));
277
90
        return FALSE;
278
90
    }
279
1.01k
    return TRUE;
280
1.10k
}
281
static gboolean
282
fu_struct_uf2_parse_internal(FuStructUf2 *st, GError **error)
283
1.22k
{
284
1.22k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
285
0
        g_autofree gchar *str = fu_struct_uf2_to_string(st);
286
0
        g_debug("%s", str);
287
0
    }
288
1.22k
    if (!fu_struct_uf2_validate_internal(st, error))
289
210
        return FALSE;
290
1.01k
    return TRUE;
291
1.22k
}
292
293
/**
294
 * fu_struct_uf2_parse: (skip):
295
 **/
296
FuStructUf2 *
297
fu_struct_uf2_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
298
1.26k
{
299
1.26k
    g_autoptr(GByteArray) st = g_byte_array_new();
300
1.26k
    g_return_val_if_fail(buf != NULL, NULL);
301
1.26k
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
302
1.26k
    if (!fu_memchk_read(bufsz, offset, 512, error)) {
303
40
        g_prefix_error(error, "invalid struct FuStructUf2: ");
304
40
        return NULL;
305
40
    }
306
1.22k
    g_byte_array_append(st, buf + offset, 512);
307
1.22k
    if (!fu_struct_uf2_parse_internal(st, error))
308
210
        return NULL;
309
1.01k
    return g_steal_pointer(&st);
310
1.22k
}