Arm's firmware team assembles an incoming firmware update image from a sequence of binary chunks received over the wire. QA has reported both crashes during long-running update sessions and steadily rising memory usage across repeated updates.
#include <stdlib.h>
#include <string.h>
typedef struct {
char *buffer;
size_t size;
} FirmwareImage;
FirmwareImage *load_firmware_chunk(const char *chunk, size_t chunk_len) {
FirmwareImage *image = malloc(sizeof(FirmwareImage));
image->buffer = malloc(chunk_len);
strcpy(image->buffer, chunk);
image->size = chunk_len;
return image;
}
void append_chunk(FirmwareImage *image, const char *chunk, size_t chunk_len) {
char *new_buffer = malloc(image->size + chunk_len);
memcpy(new_buffer, image->buffer, image->size);
memcpy(new_buffer + image->size, chunk, chunk_len);
image->buffer = new_buffer;
image->size += chunk_len;
}
void free_firmware(FirmwareImage *image) {
free(image);
}
Spot the errors in this C program, including memory leaks and buffer overflows, and explain how you would correct them. Chunks are raw binary data, not text, and may contain embedded zero bytes or lack any terminating zero byte at all.
def fix_firmware_image(chunk, chunk_len):