diff --git a/docs/html/aaruformat_8h.html b/docs/html/aaruformat_8h.html index 4a8d465..ccd60d7 100644 --- a/docs/html/aaruformat_8h.html +++ b/docs/html/aaruformat_8h.html @@ -126,7 +126,7 @@ Macros

Definition at line 22 of file aaruformat.h.

-

Referenced by aaruf_create(), and aaruf_open().

+

Referenced by aaruf_create(), and aaruf_open().

@@ -144,7 +144,7 @@ Macros

Definition at line 23 of file aaruformat.h.

-

Referenced by aaruf_create(), and aaruf_open().

+

Referenced by aaruf_create(), and aaruf_open().

diff --git a/docs/html/blocks_2dump_8c.html b/docs/html/blocks_2dump_8c.html index 03ee6c9..d15c4f9 100644 --- a/docs/html/blocks_2dump_8c.html +++ b/docs/html/blocks_2dump_8c.html @@ -114,7 +114,7 @@ $(function(){initNavTree('blocks_2dump_8c.html','',''); }); Functions static void free_dump_hardware_entries_array (DumpHardwareEntriesWithData *entries, uint16_t count) static void reset_dump_hardware_context (aaruformat_context *ctx) -static bool read_dump_string (FILE *stream, const char *field_name, uint32_t length, uint32_t *remaining, uint8_t **destination) +static bool read_dump_string (FILE *stream, const char *field_name, const uint32_t length, uint32_t *remaining, uint8_t **destination) void process_dumphw_block (aaruformat_context *ctx, const IndexEntry *entry)  Processes a dump hardware block from the image stream.
@@ -148,7 +148,7 @@ Functions

Definition at line 36 of file dump.c.

-

Referenced by process_dumphw_block(), and reset_dump_hardware_context().

+

Referenced by process_dumphw_block(), and reset_dump_hardware_context().

@@ -181,16 +181,16 @@ Functions -

Definition at line 108 of file dump.c.

+

Definition at line 107 of file dump.c.

-

References aaruf_crc64_data(), AARUF_VERSION_V1, IndexEntry::blockType, bswap_64, compare_extents(), DumpHardwareHeader::crc64, aaruformat_context::dump_hardware_entries_with_data, aaruformat_context::dump_hardware_header, DumpHardwareBlock, DumpHardwareHeader::entries, DumpHardwareEntriesWithData::entry, DumpHardwareEntriesWithData::extents, DumpHardwareEntry::extents, FATAL, DumpHardwareEntriesWithData::firmware, DumpHardwareEntry::firmwareLength, free_dump_hardware_entries_array(), aaruformat_context::header, DumpHardwareHeader::identifier, AaruHeaderV2::imageMajorVersion, aaruformat_context::imageStream, DumpHardwareHeader::length, DumpHardwareEntriesWithData::manufacturer, DumpHardwareEntry::manufacturerLength, DumpHardwareEntriesWithData::model, DumpHardwareEntry::modelLength, IndexEntry::offset, read_dump_string(), reset_dump_hardware_context(), DumpHardwareEntriesWithData::revision, DumpHardwareEntry::revisionLength, DumpHardwareEntriesWithData::serial, DumpHardwareEntry::serialLength, DumpHardwareEntriesWithData::softwareName, DumpHardwareEntry::softwareNameLength, DumpHardwareEntriesWithData::softwareOperatingSystem, DumpHardwareEntry::softwareOperatingSystemLength, DumpHardwareEntriesWithData::softwareVersion, DumpHardwareEntry::softwareVersionLength, and TRACE.

+

References aaruf_crc64_data(), AARUF_VERSION_V1, IndexEntry::blockType, bswap_64, compare_extents(), DumpHardwareHeader::crc64, aaruformat_context::dump_hardware_entries_with_data, aaruformat_context::dump_hardware_header, DumpHardwareBlock, DumpHardwareHeader::entries, DumpHardwareEntriesWithData::entry, DumpHardwareEntriesWithData::extents, DumpHardwareEntry::extents, FATAL, DumpHardwareEntriesWithData::firmware, DumpHardwareEntry::firmwareLength, free_dump_hardware_entries_array(), aaruformat_context::header, DumpHardwareHeader::identifier, AaruHeaderV2::imageMajorVersion, aaruformat_context::imageStream, DumpHardwareHeader::length, DumpHardwareEntriesWithData::manufacturer, DumpHardwareEntry::manufacturerLength, DumpHardwareEntriesWithData::model, DumpHardwareEntry::modelLength, IndexEntry::offset, read_dump_string(), reset_dump_hardware_context(), DumpHardwareEntriesWithData::revision, DumpHardwareEntry::revisionLength, DumpHardwareEntriesWithData::serial, DumpHardwareEntry::serialLength, DumpHardwareEntriesWithData::softwareName, DumpHardwareEntry::softwareNameLength, DumpHardwareEntriesWithData::softwareOperatingSystem, DumpHardwareEntry::softwareOperatingSystemLength, DumpHardwareEntriesWithData::softwareVersion, DumpHardwareEntry::softwareVersionLength, and TRACE.

-

Referenced by aaruf_open().

+

Referenced by aaruf_open().

- -

◆ read_dump_string()

+ +

◆ read_dump_string()

@@ -211,7 +211,7 @@ Functions - uint32_t length, + const uint32_t length, @@ -235,7 +235,7 @@ Functions

References TRACE.

-

Referenced by process_dumphw_block().

+

Referenced by process_dumphw_block().

@@ -266,7 +266,7 @@ Functions

References aaruformat_context::dump_hardware_entries_with_data, aaruformat_context::dump_hardware_header, DumpHardwareHeader::entries, and free_dump_hardware_entries_array().

-

Referenced by process_dumphw_block().

+

Referenced by process_dumphw_block().

diff --git a/docs/html/blocks_2dump_8c.js b/docs/html/blocks_2dump_8c.js index 0026804..573145d 100644 --- a/docs/html/blocks_2dump_8c.js +++ b/docs/html/blocks_2dump_8c.js @@ -2,6 +2,6 @@ var blocks_2dump_8c = [ [ "free_dump_hardware_entries_array", "blocks_2dump_8c.html#a5145c01023659313140eb978a393b6eb", null ], [ "process_dumphw_block", "blocks_2dump_8c.html#a0e2cfc858c0551bc9bef11d5bdb85aac", null ], - [ "read_dump_string", "blocks_2dump_8c.html#aa79263803528183e28811dfb50e9bdad", null ], + [ "read_dump_string", "blocks_2dump_8c.html#aff8ea771002a521b511e11ce1ff8b3d3", null ], [ "reset_dump_hardware_context", "blocks_2dump_8c.html#a2976d361aeda7bcc7b9ad40be6b7901d", null ] ]; \ No newline at end of file diff --git a/docs/html/blocks_2dump_8c_source.html b/docs/html/blocks_2dump_8c_source.html index 939e56e..ef363cc 100644 --- a/docs/html/blocks_2dump_8c_source.html +++ b/docs/html/blocks_2dump_8c_source.html @@ -160,19 +160,19 @@ $(function(){initNavTree('blocks_2dump_8c_source.html','',''); });
63
-
64static bool read_dump_string(FILE *stream, const char *field_name, uint32_t length, uint32_t *remaining,
+
64static bool read_dump_string(FILE *stream, const char *field_name, const uint32_t length, uint32_t *remaining,
65 uint8_t **destination)
66{
67 if(length == 0) return true;
68
-
69 if(remaining == NULL || *remaining < length)
+
69 if(*remaining < length)
70 {
71 TRACE("Dump hardware %s length %u exceeds remaining payload %u", field_name, length,
72 remaining == NULL ? 0 : *remaining);
73 return false;
74 }
75
-
76 uint8_t *buffer = (uint8_t *)malloc((size_t)length + 1);
+
76 uint8_t *buffer = malloc(length);
77
78 if(buffer == NULL)
79 {
@@ -180,7 +180,7 @@ $(function(){initNavTree('blocks_2dump_8c_source.html','',''); });
81 return false;
82 }
83
-
84 size_t bytes_read = fread(buffer, 1, length, stream);
+
84 const size_t bytes_read = fread(buffer, 1, length, stream);
85
86 if(bytes_read != length)
87 {
@@ -189,268 +189,266 @@ $(function(){initNavTree('blocks_2dump_8c_source.html','',''); });
90 return false;
91 }
92
-
93 buffer[length] = 0;
-
94 *remaining -= length;
-
95 *destination = buffer;
-
96
-
97 return true;
-
98}
+
93 *remaining -= length;
+
94 *destination = buffer;
+
95
+
96 return true;
+
97}
-
99
-
-
108void process_dumphw_block(aaruformat_context *ctx, const IndexEntry *entry)
-
109{
-
110 TRACE("Entering process_dumphw_block(%p, %p)", ctx, entry);
-
111 size_t read_bytes = 0;
-
112
-
113 if(ctx == NULL || ctx->imageStream == NULL || entry == NULL)
-
114 {
-
115 FATAL("Invalid context, image stream, or index entry pointer.");
-
116 TRACE("Exiting process_dumphw_block()");
-
117 if(ctx != NULL) reset_dump_hardware_context(ctx);
-
118 return;
-
119 }
-
120
-
121 if(entry->blockType != DumpHardwareBlock)
-
122 {
-
123 TRACE("Index entry block type %u is not DumpHardwareBlock, skipping.", entry->blockType);
-
124 TRACE("Exiting process_dumphw_block()");
-
125 return;
-
126 }
-
127
-
128 if(fseek(ctx->imageStream, (long)entry->offset, SEEK_SET) < 0 || ftell(ctx->imageStream) != entry->offset)
-
129 {
-
130 FATAL("Could not seek to %" PRIu64 " as indicated by index entry...", entry->offset);
-
131 reset_dump_hardware_context(ctx);
-
132 TRACE("Exiting process_dumphw_block()");
-
133 return;
-
134 }
-
135
-
136 TRACE("Reading dump hardware block header at position %" PRIu64, entry->offset);
-
137 DumpHardwareHeader header;
-
138 read_bytes = fread(&header, 1, sizeof(header), ctx->imageStream);
-
139
-
140 if(read_bytes != sizeof(header))
-
141 {
-
142 TRACE("Could not read dump hardware block header (read %zu bytes)", read_bytes);
-
143 reset_dump_hardware_context(ctx);
-
144 TRACE("Exiting process_dumphw_block()");
-
145 return;
-
146 }
-
147
-
148 if(header.identifier != DumpHardwareBlock)
-
149 {
-
150 TRACE("Incorrect identifier 0x%08" PRIx32 " for dump hardware block at position %" PRIu64, header.identifier,
-
151 entry->offset);
-
152 reset_dump_hardware_context(ctx);
-
153 TRACE("Exiting process_dumphw_block()");
-
154 return;
-
155 }
-
156
-
157 if(header.entries > 0 && header.length == 0)
-
158 {
-
159 TRACE("Dump hardware header indicates %u entries but zero payload length", header.entries);
-
160 reset_dump_hardware_context(ctx);
-
161 TRACE("Exiting process_dumphw_block()");
-
162 return;
-
163 }
-
164
-
165 const uint32_t payload_length = header.length;
-
166
-
167 if(payload_length > 0)
-
168 {
-
169 uint8_t *payload = (uint8_t *)malloc(payload_length);
-
170
-
171 if(payload == NULL)
-
172 {
-
173 TRACE("Could not allocate %u bytes for dump hardware payload", payload_length);
-
174 reset_dump_hardware_context(ctx);
-
175 TRACE("Exiting process_dumphw_block()");
-
176 return;
-
177 }
-
178
-
179 read_bytes = fread(payload, 1, payload_length, ctx->imageStream);
-
180
-
181 if(read_bytes != payload_length)
-
182 {
-
183 TRACE("Could not read dump hardware payload, expected %u bytes got %zu", payload_length, read_bytes);
-
184 free(payload);
-
185 reset_dump_hardware_context(ctx);
-
186 TRACE("Exiting process_dumphw_block()");
-
187 return;
-
188 }
-
189
-
190 uint64_t crc64 = aaruf_crc64_data(payload, payload_length);
-
191
-
192 if(ctx->header.imageMajorVersion <= AARUF_VERSION_V1) crc64 = bswap_64(crc64);
-
193
-
194 if(crc64 != header.crc64)
-
195 {
-
196 TRACE("Dump hardware block CRC mismatch: computed 0x%" PRIx64 " expected 0x%" PRIx64, crc64, header.crc64);
-
197 free(payload);
-
198 reset_dump_hardware_context(ctx);
-
199 TRACE("Exiting process_dumphw_block()");
-
200 return;
-
201 }
-
202
-
203 free(payload);
-
204
-
205 if(fseek(ctx->imageStream, -(long)payload_length, SEEK_CUR) != 0)
-
206 {
-
207 TRACE("Could not rewind after CRC verification");
-
208 reset_dump_hardware_context(ctx);
-
209 TRACE("Exiting process_dumphw_block()");
-
210 return;
-
211 }
-
212 }
-
213
-
214 if(header.entries == 0)
-
215 {
-
216 reset_dump_hardware_context(ctx);
-
217 ctx->dump_hardware_header = header;
-
218 TRACE("Dump hardware block contains no entries. Clearing existing metadata.");
-
219 TRACE("Exiting process_dumphw_block()");
-
220 return;
-
221 }
-
222
-
223 const size_t allocation_size = (size_t)header.entries * sizeof(DumpHardwareEntriesWithData);
-
224
-
225 if(allocation_size / sizeof(DumpHardwareEntriesWithData) != header.entries)
-
226 {
-
227 TRACE("Dump hardware entries multiplication overflow (%u entries)", header.entries);
-
228 reset_dump_hardware_context(ctx);
-
229 TRACE("Exiting process_dumphw_block()");
-
230 return;
-
231 }
-
232
-
233 DumpHardwareEntriesWithData *entries =
-
234 (DumpHardwareEntriesWithData *)calloc(header.entries, sizeof(DumpHardwareEntriesWithData));
-
235
-
236 if(entries == NULL)
-
237 {
-
238 TRACE("Could not allocate %zu bytes for dump hardware entries", allocation_size);
-
239 reset_dump_hardware_context(ctx);
-
240 TRACE("Exiting process_dumphw_block()");
-
241 return;
-
242 }
-
243
-
244 uint32_t remaining_payload = payload_length;
-
245 uint16_t processed_entry = 0;
+
98
+
+ +
108{
+
109 TRACE("Entering process_dumphw_block(%p, %p)", ctx, entry);
+
110 size_t read_bytes = 0;
+
111
+
112 if(ctx == NULL || ctx->imageStream == NULL || entry == NULL)
+
113 {
+
114 FATAL("Invalid context, image stream, or index entry pointer.");
+
115 TRACE("Exiting process_dumphw_block()");
+
116 if(ctx != NULL) reset_dump_hardware_context(ctx);
+
117 return;
+
118 }
+
119
+
120 if(entry->blockType != DumpHardwareBlock)
+
121 {
+
122 TRACE("Index entry block type %u is not DumpHardwareBlock, skipping.", entry->blockType);
+
123 TRACE("Exiting process_dumphw_block()");
+
124 return;
+
125 }
+
126
+
127 if(fseek(ctx->imageStream, entry->offset, SEEK_SET) < 0 || ftell(ctx->imageStream) != entry->offset)
+
128 {
+
129 FATAL("Could not seek to %" PRIu64 " as indicated by index entry...", entry->offset);
+ +
131 TRACE("Exiting process_dumphw_block()");
+
132 return;
+
133 }
+
134
+
135 TRACE("Reading dump hardware block header at position %" PRIu64, entry->offset);
+
136 DumpHardwareHeader header;
+
137 read_bytes = fread(&header, 1, sizeof(header), ctx->imageStream);
+
138
+
139 if(read_bytes != sizeof(header))
+
140 {
+
141 TRACE("Could not read dump hardware block header (read %zu bytes)", read_bytes);
+ +
143 TRACE("Exiting process_dumphw_block()");
+
144 return;
+
145 }
+
146
+
147 if(header.identifier != DumpHardwareBlock)
+
148 {
+
149 TRACE("Incorrect identifier 0x%08" PRIx32 " for dump hardware block at position %" PRIu64, header.identifier,
+
150 entry->offset);
+ +
152 TRACE("Exiting process_dumphw_block()");
+
153 return;
+
154 }
+
155
+
156 if(header.entries > 0 && header.length == 0)
+
157 {
+
158 TRACE("Dump hardware header indicates %u entries but zero payload length", header.entries);
+ +
160 TRACE("Exiting process_dumphw_block()");
+
161 return;
+
162 }
+
163
+
164 const uint32_t payload_length = header.length;
+
165
+
166 if(payload_length > 0)
+
167 {
+
168 uint8_t *payload = malloc(payload_length);
+
169
+
170 if(payload == NULL)
+
171 {
+
172 TRACE("Could not allocate %u bytes for dump hardware payload", payload_length);
+ +
174 TRACE("Exiting process_dumphw_block()");
+
175 return;
+
176 }
+
177
+
178 read_bytes = fread(payload, 1, payload_length, ctx->imageStream);
+
179
+
180 if(read_bytes != payload_length)
+
181 {
+
182 TRACE("Could not read dump hardware payload, expected %u bytes got %zu", payload_length, read_bytes);
+
183 free(payload);
+ +
185 TRACE("Exiting process_dumphw_block()");
+
186 return;
+
187 }
+
188
+
189 uint64_t crc64 = aaruf_crc64_data(payload, payload_length);
+
190
+
191 if(ctx->header.imageMajorVersion <= AARUF_VERSION_V1) crc64 = bswap_64(crc64);
+
192
+
193 if(crc64 != header.crc64)
+
194 {
+
195 TRACE("Dump hardware block CRC mismatch: computed 0x%" PRIx64 " expected 0x%" PRIx64, crc64, header.crc64);
+
196 free(payload);
+ +
198 TRACE("Exiting process_dumphw_block()");
+
199 return;
+
200 }
+
201
+
202 free(payload);
+
203
+
204 if(fseek(ctx->imageStream, -(long)payload_length, SEEK_CUR) != 0)
+
205 {
+
206 TRACE("Could not rewind after CRC verification");
+ +
208 TRACE("Exiting process_dumphw_block()");
+
209 return;
+
210 }
+
211 }
+
212
+
213 if(header.entries == 0)
+
214 {
+ +
216 ctx->dump_hardware_header = header;
+
217 TRACE("Dump hardware block contains no entries. Clearing existing metadata.");
+
218 TRACE("Exiting process_dumphw_block()");
+
219 return;
+
220 }
+
221
+
222 const size_t allocation_size = (size_t)header.entries * sizeof(DumpHardwareEntriesWithData);
+
223
+
224 if(allocation_size / sizeof(DumpHardwareEntriesWithData) != header.entries)
+
225 {
+
226 TRACE("Dump hardware entries multiplication overflow (%u entries)", header.entries);
+ +
228 TRACE("Exiting process_dumphw_block()");
+
229 return;
+
230 }
+
231
+
232 DumpHardwareEntriesWithData *entries = calloc(header.entries, sizeof(DumpHardwareEntriesWithData));
+
233
+
234 if(entries == NULL)
+
235 {
+
236 TRACE("Could not allocate %zu bytes for dump hardware entries", allocation_size);
+ +
238 TRACE("Exiting process_dumphw_block()");
+
239 return;
+
240 }
+
241
+
242 uint32_t remaining_payload = payload_length;
+
243 uint16_t processed_entry = 0;
+
244
+
245 TRACE("Processing %u dump hardware block entries", header.entries);
246
-
247 TRACE("Processing %u dump hardware block entries", header.entries);
-
248
-
249 for(uint16_t e = 0; e < header.entries; e++)
-
250 {
-
251 processed_entry = e;
-
252 DumpHardwareEntriesWithData *current = &entries[e];
-
253
-
254 if(remaining_payload < sizeof(DumpHardwareEntry))
-
255 {
-
256 TRACE("Remaining payload %u too small for dump hardware entry %u", remaining_payload, e);
-
257 goto parse_failure;
-
258 }
+
247 for(uint16_t e = 0; e < header.entries; e++)
+
248 {
+
249 processed_entry = e;
+
250 DumpHardwareEntriesWithData *current = &entries[e];
+
251
+
252 if(remaining_payload < sizeof(DumpHardwareEntry))
+
253 {
+
254 TRACE("Remaining payload %u too small for dump hardware entry %u", remaining_payload, e);
+
255 goto parse_failure;
+
256 }
+
257
+
258 read_bytes = fread(&current->entry, 1, sizeof(DumpHardwareEntry), ctx->imageStream);
259
-
260 read_bytes = fread(&current->entry, 1, sizeof(DumpHardwareEntry), ctx->imageStream);
-
261
-
262 if(read_bytes != sizeof(DumpHardwareEntry))
-
263 {
-
264 TRACE("Could not read dump hardware entry %u header (read %zu bytes)", e, read_bytes);
-
265 goto parse_failure;
-
266 }
+
260 if(read_bytes != sizeof(DumpHardwareEntry))
+
261 {
+
262 TRACE("Could not read dump hardware entry %u header (read %zu bytes)", e, read_bytes);
+
263 goto parse_failure;
+
264 }
+
265
+
266 remaining_payload -= sizeof(DumpHardwareEntry);
267
-
268 remaining_payload -= sizeof(DumpHardwareEntry);
-
269
-
270 if(!read_dump_string(ctx->imageStream, "manufacturer", current->entry.manufacturerLength, &remaining_payload,
-
271 &current->manufacturer))
-
272 goto parse_failure;
-
273
-
274 if(!read_dump_string(ctx->imageStream, "model", current->entry.modelLength, &remaining_payload,
-
275 &current->model))
-
276 goto parse_failure;
-
277
-
278 if(!read_dump_string(ctx->imageStream, "revision", current->entry.revisionLength, &remaining_payload,
-
279 &current->revision))
-
280 goto parse_failure;
-
281
-
282 if(!read_dump_string(ctx->imageStream, "firmware", current->entry.firmwareLength, &remaining_payload,
-
283 &current->firmware))
-
284 goto parse_failure;
-
285
-
286 if(!read_dump_string(ctx->imageStream, "serial", current->entry.serialLength, &remaining_payload,
-
287 &current->serial))
-
288 goto parse_failure;
-
289
-
290 if(!read_dump_string(ctx->imageStream, "software name", current->entry.softwareNameLength, &remaining_payload,
-
291 &current->softwareName))
-
292 goto parse_failure;
-
293
-
294 if(!read_dump_string(ctx->imageStream, "software version", current->entry.softwareVersionLength,
-
295 &remaining_payload, &current->softwareVersion))
-
296 goto parse_failure;
-
297
-
298 if(!read_dump_string(ctx->imageStream, "software operating system",
-
299 current->entry.softwareOperatingSystemLength, &remaining_payload,
-
300 &current->softwareOperatingSystem))
-
301 goto parse_failure;
+
268 if(!read_dump_string(ctx->imageStream, "manufacturer", current->entry.manufacturerLength, &remaining_payload,
+
269 &current->manufacturer))
+
270 goto parse_failure;
+
271
+
272 if(!read_dump_string(ctx->imageStream, "model", current->entry.modelLength, &remaining_payload,
+
273 &current->model))
+
274 goto parse_failure;
+
275
+
276 if(!read_dump_string(ctx->imageStream, "revision", current->entry.revisionLength, &remaining_payload,
+
277 &current->revision))
+
278 goto parse_failure;
+
279
+
280 if(!read_dump_string(ctx->imageStream, "firmware", current->entry.firmwareLength, &remaining_payload,
+
281 &current->firmware))
+
282 goto parse_failure;
+
283
+
284 if(!read_dump_string(ctx->imageStream, "serial", current->entry.serialLength, &remaining_payload,
+
285 &current->serial))
+
286 goto parse_failure;
+
287
+
288 if(!read_dump_string(ctx->imageStream, "software name", current->entry.softwareNameLength, &remaining_payload,
+
289 &current->softwareName))
+
290 goto parse_failure;
+
291
+
292 if(!read_dump_string(ctx->imageStream, "software version", current->entry.softwareVersionLength,
+
293 &remaining_payload, &current->softwareVersion))
+
294 goto parse_failure;
+
295
+
296 if(!read_dump_string(ctx->imageStream, "software operating system",
+
297 current->entry.softwareOperatingSystemLength, &remaining_payload,
+
298 &current->softwareOperatingSystem))
+
299 goto parse_failure;
+
300
+
301 const uint32_t extent_count = current->entry.extents;
302
-
303 const uint32_t extent_count = current->entry.extents;
+
303 if(extent_count == 0) continue;
304
-
305 if(extent_count == 0) continue;
+
305 const size_t extent_bytes = (size_t)extent_count * sizeof(DumpExtent);
306
-
307 const size_t extent_bytes = (size_t)extent_count * sizeof(DumpExtent);
-
308
-
309 if(extent_bytes / sizeof(DumpExtent) != extent_count || extent_bytes > remaining_payload)
-
310 {
-
311 TRACE("Extent array for entry %u exceeds remaining payload (%zu bytes requested, %u left)", e, extent_bytes,
-
312 remaining_payload);
-
313 goto parse_failure;
-
314 }
+
307 if(extent_bytes / sizeof(DumpExtent) != extent_count || extent_bytes > remaining_payload)
+
308 {
+
309 TRACE("Extent array for entry %u exceeds remaining payload (%zu bytes requested, %u left)", e, extent_bytes,
+
310 remaining_payload);
+
311 goto parse_failure;
+
312 }
+
313
+
314 current->extents = (DumpExtent *)malloc(extent_bytes);
315
-
316 current->extents = (DumpExtent *)malloc(extent_bytes);
-
317
-
318 if(current->extents == NULL)
-
319 {
-
320 TRACE("Could not allocate %zu bytes for dump hardware entry %u extents", extent_bytes, e);
-
321 goto parse_failure;
-
322 }
+
316 if(current->extents == NULL)
+
317 {
+
318 TRACE("Could not allocate %zu bytes for dump hardware entry %u extents", extent_bytes, e);
+
319 goto parse_failure;
+
320 }
+
321
+
322 const size_t extents_read = fread(current->extents, sizeof(DumpExtent), extent_count, ctx->imageStream);
323
-
324 const size_t extents_read = fread(current->extents, sizeof(DumpExtent), extent_count, ctx->imageStream);
-
325
-
326 if(extents_read != extent_count)
-
327 {
-
328 TRACE("Could not read %u dump hardware extents for entry %u (read %zu)", extent_count, e, extents_read);
-
329 goto parse_failure;
-
330 }
+
324 if(extents_read != extent_count)
+
325 {
+
326 TRACE("Could not read %u dump hardware extents for entry %u (read %zu)", extent_count, e, extents_read);
+
327 goto parse_failure;
+
328 }
+
329
+
330 remaining_payload -= (uint32_t)extent_bytes;
331
-
332 remaining_payload -= (uint32_t)extent_bytes;
-
333
-
334 qsort(current->extents, extent_count, sizeof(DumpExtent), compare_extents);
-
335 TRACE("Sorted %u extents for entry %u", extent_count, e);
-
336 }
-
337
- -
339 ctx->dump_hardware_entries_with_data = entries;
-
340 ctx->dump_hardware_header = header;
-
341
-
342 if(remaining_payload != 0)
-
343 {
-
344 TRACE("Dump hardware block parsing completed with %u trailing payload bytes", remaining_payload);
-
345 }
-
346
-
347 TRACE("Exiting process_dumphw_block()");
-
348 return;
-
349
-
350parse_failure:
-
351 free_dump_hardware_entries_array(entries, processed_entry + 1);
-
352 free(entries);
- -
354 TRACE("Exiting process_dumphw_block()");
-
355}
+
332 qsort(current->extents, extent_count, sizeof(DumpExtent), compare_extents);
+
333 TRACE("Sorted %u extents for entry %u", extent_count, e);
+
334 }
+
335
+ +
337 ctx->dump_hardware_entries_with_data = entries;
+
338 ctx->dump_hardware_header = header;
+
339
+
340 if(remaining_payload != 0)
+
341 {
+
342 TRACE("Dump hardware block parsing completed with %u trailing payload bytes", remaining_payload);
+
343 }
+
344
+
345 TRACE("Exiting process_dumphw_block()");
+
346 return;
+
347
+
348parse_failure:
+
349 free_dump_hardware_entries_array(entries, processed_entry + 1);
+
350 free(entries);
+ +
352 TRACE("Exiting process_dumphw_block()");
+
353}
-
void process_dumphw_block(aaruformat_context *ctx, const IndexEntry *entry)
Processes a dump hardware block from the image stream.
Definition dump.c:108
+
void process_dumphw_block(aaruformat_context *ctx, const IndexEntry *entry)
Processes a dump hardware block from the image stream.
Definition dump.c:107
static void reset_dump_hardware_context(aaruformat_context *ctx)
Definition dump.c:54
static void free_dump_hardware_entries_array(DumpHardwareEntriesWithData *entries, uint16_t count)
Definition dump.c:36
-
static bool read_dump_string(FILE *stream, const char *field_name, uint32_t length, uint32_t *remaining, uint8_t **destination)
Definition dump.c:64
+
static bool read_dump_string(FILE *stream, const char *field_name, const uint32_t length, uint32_t *remaining, uint8_t **destination)
Definition dump.c:64
Core public constants and compile‑time limits for the Aaru container format implementation.
#define AARUF_VERSION_V1
First on‑disk version (C# implementation).
Definition consts.h:71
Central runtime context structures for libaaruformat (image state, caches, checksum buffers).
@@ -468,18 +466,18 @@ $(function(){initNavTree('blocks_2dump_8c_source.html','',''); });
#define FATAL(fmt,...)
Definition log.h:40
#define TRACE(fmt,...)
Definition log.h:25
uint8_t imageMajorVersion
Container format major version.
Definition header.h:110
-
Inclusive [start,end] logical sector range contributed by a single hardware environment.
Definition context.h:333
-
In-memory representation of a dump hardware entry plus decoded variable-length fields & extents.
Definition context.h:314
-
uint8_t * firmware
Firmware version string or NULL.
Definition context.h:320
-
uint8_t * revision
Hardware revision string or NULL.
Definition context.h:319
-
uint8_t * model
Model string or NULL.
Definition context.h:318
-
uint8_t * softwareName
Dump software name or NULL.
Definition context.h:322
-
struct DumpExtent * extents
Array of extents (entry.extents elements) or NULL.
Definition context.h:316
-
uint8_t * manufacturer
Manufacturer string (UTF-8) or NULL.
Definition context.h:317
-
uint8_t * softwareVersion
Dump software version or NULL.
Definition context.h:323
-
uint8_t * serial
Serial number string or NULL.
Definition context.h:321
-
DumpHardwareEntry entry
Fixed-size header with lengths & counts.
Definition context.h:315
-
uint8_t * softwareOperatingSystem
Host operating system string or NULL.
Definition context.h:324
+
Inclusive [start,end] logical sector range contributed by a single hardware environment.
Definition context.h:334
+
In-memory representation of a dump hardware entry plus decoded variable-length fields & extents.
Definition context.h:315
+
uint8_t * firmware
Firmware version string or NULL.
Definition context.h:321
+
uint8_t * revision
Hardware revision string or NULL.
Definition context.h:320
+
uint8_t * model
Model string or NULL.
Definition context.h:319
+
uint8_t * softwareName
Dump software name or NULL.
Definition context.h:323
+
struct DumpExtent * extents
Array of extents (entry.extents elements) or NULL.
Definition context.h:317
+
uint8_t * manufacturer
Manufacturer string (UTF-8) or NULL.
Definition context.h:318
+
uint8_t * softwareVersion
Dump software version or NULL.
Definition context.h:324
+
uint8_t * serial
Serial number string or NULL.
Definition context.h:322
+
DumpHardwareEntry entry
Fixed-size header with lengths & counts.
Definition context.h:316
+
uint8_t * softwareOperatingSystem
Host operating system string or NULL.
Definition context.h:325
Per-environment length table describing subsequent UTF-8 strings and optional extent array.
Definition dump.h:113
uint32_t softwareNameLength
Length in bytes of dumping software name string.
Definition dump.h:119
uint32_t manufacturerLength
Length in bytes of manufacturer UTF-8 string.
Definition dump.h:114
diff --git a/docs/html/blocks_2metadata_8c.html b/docs/html/blocks_2metadata_8c.html index 4c2b4ac..5ad9a41 100644 --- a/docs/html/blocks_2metadata_8c.html +++ b/docs/html/blocks_2metadata_8c.html @@ -233,7 +233,7 @@ Query Mode: To query the required buffer size, pass buffer == NULL or *length &l AARUF_ERROR_NOT_AARUFORMAT(-1) The context is invalid. This occurs when: AARUF_ERROR_METADATA_NOT_PRESENT(-30) The sector tags array is not available. This occurs when:
@@ -413,7 +413,7 @@ This function does not validate JSON syntax or schema. Corrupted JSON data will

References aaruformat_context::cicm_block, aaruformat_context::cicm_block_header, CicmBlock, FATAL, CicmMetadataBlock::identifier, aaruformat_context::image_info, ImageInfo::ImageSize, aaruformat_context::imageStream, CicmMetadataBlock::length, IndexEntry::offset, and TRACE.

-

Referenced by aaruf_open().

+

Referenced by aaruf_open().

@@ -450,7 +450,7 @@ This function does not validate JSON syntax or schema. Corrupted JSON data will

References aaruformat_context::cylinders, GeometryBlockHeader::cylinders, FATAL, aaruformat_context::geometry_block, GeometryBlock, aaruformat_context::heads, GeometryBlockHeader::heads, GeometryBlockHeader::identifier, aaruformat_context::image_info, ImageInfo::ImageSize, aaruformat_context::imageStream, IndexEntry::offset, aaruformat_context::sectors_per_track, GeometryBlockHeader::sectorsPerTrack, and TRACE.

-

Referenced by aaruf_open().

+

Referenced by aaruf_open().

@@ -487,7 +487,7 @@ This function does not validate JSON syntax or schema. Corrupted JSON data will

References MetadataBlockHeader::blockSize, IndexEntry::blockType, aaruformat_context::comments, MetadataBlockHeader::commentsLength, MetadataBlockHeader::commentsOffset, aaruformat_context::creator, MetadataBlockHeader::creatorLength, MetadataBlockHeader::creatorOffset, aaruformat_context::drive_firmware_revision, aaruformat_context::drive_manufacturer, aaruformat_context::drive_model, aaruformat_context::drive_serial_number, MetadataBlockHeader::driveFirmwareRevisionLength, MetadataBlockHeader::driveFirmwareRevisionOffset, MetadataBlockHeader::driveManufacturerLength, MetadataBlockHeader::driveManufacturerOffset, MetadataBlockHeader::driveModelLength, MetadataBlockHeader::driveModelOffset, MetadataBlockHeader::driveSerialNumberLength, MetadataBlockHeader::driveSerialNumberOffset, FATAL, MetadataBlockHeader::identifier, aaruformat_context::image_info, ImageInfo::ImageSize, aaruformat_context::imageStream, aaruformat_context::last_media_sequence, MetadataBlockHeader::lastMediaSequence, aaruformat_context::media_barcode, aaruformat_context::media_manufacturer, aaruformat_context::media_model, aaruformat_context::media_part_number, aaruformat_context::media_sequence, aaruformat_context::media_serial_number, aaruformat_context::media_title, MetadataBlockHeader::mediaBarcodeLength, MetadataBlockHeader::mediaBarcodeOffset, MetadataBlockHeader::mediaManufacturerLength, MetadataBlockHeader::mediaManufacturerOffset, MetadataBlockHeader::mediaModelLength, MetadataBlockHeader::mediaModelOffset, MetadataBlockHeader::mediaPartNumberLength, MetadataBlockHeader::mediaPartNumberOffset, MetadataBlockHeader::mediaSequence, MetadataBlockHeader::mediaSerialNumberLength, MetadataBlockHeader::mediaSerialNumberOffset, MetadataBlockHeader::mediaTitleLength, MetadataBlockHeader::mediaTitleOffset, aaruformat_context::metadata_block, aaruformat_context::metadata_block_header, IndexEntry::offset, and TRACE.

-

Referenced by aaruf_open().

+

Referenced by aaruf_open().

diff --git a/docs/html/checksum_8c.html b/docs/html/checksum_8c.html index 6b2be73..5995422 100644 --- a/docs/html/checksum_8c.html +++ b/docs/html/checksum_8c.html @@ -144,7 +144,7 @@ Functions

References ChecksumBlock, aaruformat_context::checksums, ChecksumHeader::entries, FATAL, Checksums::hasMd5, Checksums::hasSha1, Checksums::hasSha256, Checksums::hasSpamSum, ChecksumHeader::identifier, aaruformat_context::imageStream, ChecksumEntry::length, ChecksumHeader::length, Md5, Checksums::md5, MD5_DIGEST_LENGTH, IndexEntry::offset, Sha1, Checksums::sha1, SHA1_DIGEST_LENGTH, Sha256, Checksums::sha256, SHA256_DIGEST_LENGTH, SpamSum, Checksums::spamsum, TRACE, and ChecksumEntry::type.

-

Referenced by aaruf_open().

+

Referenced by aaruf_open().

diff --git a/docs/html/close_8c.html b/docs/html/close_8c.html index 55d52ce..ac2dfec 100644 --- a/docs/html/close_8c.html +++ b/docs/html/close_8c.html @@ -212,11 +212,11 @@ Functions
Note
On success the context memory itself is freed; the caller must not reuse the pointer.
-

Definition at line 3995 of file close.c.

+

Definition at line 3997 of file close.c.

-

References AARU_CALL, AARU_EXPORT, AARU_MAGIC, aaruf_close_current_block(), AARUF_ERROR_CANNOT_WRITE_HEADER, AARUF_STATUS_OK, aaruformat_context::checksums, aaruformat_context::cicm_block, mediaTagEntry::data, aaruformat_context::deduplicate, aaruformat_context::dump_hardware_entries_with_data, aaruformat_context::dump_hardware_header, aaruformat_context::ecc_cd_context, DumpHardwareHeader::entries, DumpHardwareEntriesWithData::extents, FATAL, DumpHardwareEntriesWithData::firmware, free_map(), aaruformat_context::header, aaruformat_context::imageStream, aaruformat_context::in_memory_ddt, aaruformat_context::index_entries, aaruformat_context::is_tape, aaruformat_context::is_writing, aaruformat_context::magic, DumpHardwareEntriesWithData::manufacturer, aaruformat_context::mapped_memory_ddt_size, aaruformat_context::mediaTags, aaruformat_context::metadata_block, aaruformat_context::mode2_subheaders, DumpHardwareEntriesWithData::model, aaruformat_context::readableSectorTags, DumpHardwareEntriesWithData::revision, aaruformat_context::sector_cpr_mai, aaruformat_context::sector_edc, aaruformat_context::sector_hash_map, aaruformat_context::sector_id, aaruformat_context::sector_ied, aaruformat_context::sector_prefix, aaruformat_context::sector_prefix_corrected, aaruformat_context::sector_prefix_ddt, aaruformat_context::sector_prefix_ddt2, aaruformat_context::sector_subchannel, aaruformat_context::sector_suffix, aaruformat_context::sector_suffix_corrected, aaruformat_context::sector_suffix_ddt, aaruformat_context::sector_suffix_ddt2, DumpHardwareEntriesWithData::serial, DumpHardwareEntriesWithData::softwareName, DumpHardwareEntriesWithData::softwareOperatingSystem, DumpHardwareEntriesWithData::softwareVersion, Checksums::spamsum, TRACE, aaruformat_context::track_entries, aaruformat_context::user_data_ddt, write_aaru_json_block(), write_cached_secondary_ddt(), write_checksum_block(), write_cicm_block(), write_dumphw_block(), write_dvd_long_sector_blocks(), write_dvd_title_key_decrypted_block(), write_geometry_block(), write_index_block(), write_media_tags(), write_metadata_block(), write_mode2_subheaders_block(), write_primary_ddt(), write_sector_prefix(), write_sector_prefix_ddt(), write_sector_subchannel(), write_sector_suffix(), write_sector_suffix_ddt(), write_single_level_ddt(), write_tape_ddt(), write_tape_file_block(), write_tape_partition_block(), write_tracks_block(), and aaruformat_context::writing_buffer.

+

References AARU_CALL, AARU_EXPORT, AARU_MAGIC, aaruf_close_current_block(), AARUF_ERROR_CANNOT_WRITE_HEADER, AARUF_STATUS_OK, aaruformat_context::checksums, aaruformat_context::cicm_block, mediaTagEntry::data, aaruformat_context::deduplicate, aaruformat_context::dump_hardware_entries_with_data, aaruformat_context::dump_hardware_header, aaruformat_context::ecc_cd_context, DumpHardwareHeader::entries, DumpHardwareEntriesWithData::extents, FATAL, DumpHardwareEntriesWithData::firmware, free_map(), aaruformat_context::header, aaruformat_context::imageStream, aaruformat_context::in_memory_ddt, aaruformat_context::index_entries, aaruformat_context::is_tape, aaruformat_context::is_writing, aaruformat_context::magic, DumpHardwareEntriesWithData::manufacturer, aaruformat_context::mapped_memory_ddt_size, aaruformat_context::mediaTags, aaruformat_context::metadata_block, aaruformat_context::mode2_subheaders, DumpHardwareEntriesWithData::model, aaruformat_context::readableSectorTags, DumpHardwareEntriesWithData::revision, aaruformat_context::sector_cpr_mai, aaruformat_context::sector_edc, aaruformat_context::sector_hash_map, aaruformat_context::sector_id, aaruformat_context::sector_ied, aaruformat_context::sector_prefix, aaruformat_context::sector_prefix_corrected, aaruformat_context::sector_prefix_ddt, aaruformat_context::sector_prefix_ddt2, aaruformat_context::sector_subchannel, aaruformat_context::sector_suffix, aaruformat_context::sector_suffix_corrected, aaruformat_context::sector_suffix_ddt, aaruformat_context::sector_suffix_ddt2, DumpHardwareEntriesWithData::serial, DumpHardwareEntriesWithData::softwareName, DumpHardwareEntriesWithData::softwareOperatingSystem, DumpHardwareEntriesWithData::softwareVersion, Checksums::spamsum, TRACE, aaruformat_context::track_entries, aaruformat_context::user_data_ddt, write_aaru_json_block(), write_cached_secondary_ddt(), write_checksum_block(), write_cicm_block(), write_dumphw_block(), write_dvd_long_sector_blocks(), write_dvd_title_key_decrypted_block(), write_geometry_block(), write_index_block(), write_media_tags(), write_metadata_block(), write_mode2_subheaders_block(), write_primary_ddt(), write_sector_prefix(), write_sector_prefix_ddt(), write_sector_subchannel(), write_sector_suffix(), write_sector_suffix_ddt(), write_single_level_ddt(), write_tape_ddt(), write_tape_file_block(), write_tape_partition_block(), write_tracks_block(), and aaruformat_context::writing_buffer.

-

Referenced by aaruf_open().

+

Referenced by aaruf_open().

@@ -328,11 +328,11 @@ Distinction from CICM XML: