- Replace sprintf with snprintf (1024-byte errbuf) in hmmmm.c, base_device.c,
compose_device.c, config.c
- Fix WRITE_MEM macro: use smartAddrWriteHandlers for write ident (was
incorrectly reading from smartAddrReadHandlers)
- Replace alloca with malloc+free in dispatchMemAccessNotifications
- Guard closeBaseDevice against NULL lib/partial initialization
- Simplify intercept context storage to single contiguous allocation
- Add NULL checks after calloc in config handler with proper cleanup
- Guard find_device_by_id against zero-length path
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Config is now loaded at runtime via WebSocket (ConfigCtrlMessage)
instead of from hardcoded TOML files. The emulator starts with no
devices and waits for clients to send configuration.
- Define FlatBuffers schemas: EmulationConfig, ComposeDeviceConfig,
BaseDeviceConfig with recursive DeviceConfig union
- Rename MemSegment.start → addr (flatcc builder/reader name collision)
- Add ConfigCtrlMessage handler: validates STILL state, walks the
device tree depth-first, assigns numeric IDs, responds with
DeviceIdMappingNotif or ConfigLoadError
- Add fb_build_config_device_id_mapping() and fb_build_config_error()
FlatBuffer builders
- Remove hardcoded device loading from main.c; iterate dynamically
loaded devices in the exec loop
- Fix double-free: freeConf() already frees the struct itself, remove
redundant free() calls in config.c and base_device.c
- Fix heap-buffer-overflow in device parseSpecsFromConfig: malloc
for segment name was missing +1 for the null terminator
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>