fix: queue USB log buffer indices within SDK size limits

This commit is contained in:
chenjintao
2026-10-20 15:01:08 +08:00
parent 07094d4a4e
commit 11facd9574
3 changed files with 76 additions and 15 deletions
+34 -7
View File
@@ -185,20 +185,29 @@ static char sent_text[4096];
QlOSStatus ql_rtos_task_sched_lock(void) { return 0; }
QlOSStatus ql_rtos_task_sched_unlock(void) { return 0; }
QlOSStatus ql_rtos_queue_create(ql_queue_t *q, u32 size, u32 count) {
assert(size == sizeof(struct log_record) && size % 4 == 0 && count == 16);
/* Model the target rejecting oversized messages (old code used 516). */
if (size > 64) return -6743;
assert(size == 4 && count == 16);
*q = (void *)1; return queue_mode == 1 ? -1 : 0;
}
QlOSStatus ql_rtos_queue_delete(ql_queue_t q) { assert(q); ++queue_deletes; return 0; }
QlOSStatus ql_rtos_queue_release(ql_queue_t q, u32 size, u8 *record, u32 timeout) {
assert(q && size == sizeof(struct log_record) && timeout == 0);
last_record = *(struct log_record *)record; return queue_mode == 2 ? -1 : 0;
unsigned int slot = *(unsigned int *)record;
assert(q && size == 4 && timeout == 0 && slot < LOG_QUEUE_DEPTH && slot_used[slot]);
last_record = log_pool[slot];
if (queue_mode == 2) return -1;
if (queue_mode != 3) release_slot(slot); /* Simulate a completed consumer. */
return 0;
}
QlOSStatus ql_rtos_queue_wait(ql_queue_t q, u8 *record, u32 size, u32 timeout) {
(void)q; (void)size; (void)timeout;
if (worker_run) {
if (++worker_reads > 1) longjmp(usb_exit, 1);
strcpy(((struct log_record *)record)->text, "test");
((struct log_record *)record)->length = 4; return 0;
unsigned int slot = reserve_slot();
assert(size == 4 && slot < LOG_QUEUE_DEPTH);
strcpy(log_pool[slot].text, "test");
log_pool[slot].length = 4;
*(unsigned int *)record = slot; return 0;
}
return -1;
}
@@ -231,14 +240,32 @@ int main(void) {
queue_mode = 2; field_log_printf("queue full\n"); assert(dropped == 1);
queue_mode = 0; memset(large, 'A', 1000); large[1000] = 0;
field_log_printf("%s", large); assert(strstr(last_record.text, "[TRUNCATED]") && last_record.length < 512);
{
unsigned int i;
ql_queue_t oversized;
assert(ql_rtos_queue_create(&oversized, 516, 16) == -6743);
for (i = 0; i < LOG_QUEUE_DEPTH; ++i) assert(!slot_used[i]);
queue_mode = 3;
for (i = 0; i < LOG_QUEUE_DEPTH; ++i) field_log_printf("held %u", i);
for (i = 0; i < LOG_QUEUE_DEPTH; ++i) {
char expected[32];
snprintf(expected, sizeof(expected), "held %u", i);
assert(slot_used[i] && strcmp(log_pool[i].text, expected) == 0);
}
field_log_printf("pool full"); assert(dropped == 2);
for (i = 0; i < LOG_QUEUE_DEPTH; ++i) release_slot(i);
queue_mode = 0;
field_log_printf("recovered"); assert(strcmp(last_record.text, "recovered") == 0);
}
write_mode = 0; assert(usb_write_all("abcdef", 6) == 0 && writes == 1 && strcmp(sent_text, "abcdef") == 0);
sent_text[0] = 0; writes = 0; write_mode = 1;
assert(usb_write_all("abcdef", 6) == 0 && writes == 2 && strcmp(sent_text, "abcdef") == 0);
write_mode = 2; assert(usb_write_all("abcdef", 6) == -1);
worker_run = 1; write_mode = 3; writes = 0; sent_text[0] = 0;
if (!setjmp(usb_exit)) usb_worker(NULL);
assert(open_count == 2 && close_count == 1 && dropped == 2);
puts("PASS: USB init rollback, no-wait queue, mirror, truncation, writes, disconnect/reopen");
assert(open_count == 2 && close_count == 1 && dropped == 3);
assert(!slot_used[0]);
puts("PASS: USB 4-byte queue, SDK size rejection, pool exhaustion/recovery, init rollback, no-wait, truncation, disconnect/reopen");
return 0;
}
'''