void test_ListenerTask_GrowReadBuf_should_grow_the_listeners_read_buffer(void) { l->read_buf = calloc(100, sizeof(uint8_t)); TEST_ASSERT(l->read_buf); l->read_buf_size = 100; TEST_ASSERT_TRUE(ListenerTask_GrowReadBuf(l, 200)); TEST_ASSERT_EQUAL(200, l->read_buf_size); TEST_ASSERT(l->read_buf); memset(&l->read_buf[0], 0xFF, 200); // write to notify valgrind free(l->read_buf); }
void test_ListenerTask_GrowReadBuf_should_expose_failures(void) { l->read_buf = calloc(100, sizeof(uint8_t)); uint8_t *orig_read_buf = l->read_buf; TEST_ASSERT(l->read_buf); l->read_buf_size = 100; // force realloc failure TEST_ASSERT_FALSE(ListenerTask_GrowReadBuf(l, (size_t)-1)); TEST_ASSERT_EQUAL(100, l->read_buf_size); TEST_ASSERT_EQUAL(orig_read_buf, l->read_buf); free(l->read_buf); }
static bool sink_socket_read(struct bus *b, listener *l, connection_info *ci, ssize_t size) { BUS_LOG_SNPRINTF(b, 3, LOG_LISTENER, b->udata, 64, "read %zd bytes, calling sink CB", size); #if DUMP_READ printf("\n"); for (int i = 0; i < size; i++) { if (i > 0 && (i & 15) == 0) { printf("\n"); } printf("%02x ", l->read_buf[i]); } printf("\n\n"); #endif bus_sink_cb_res_t sres = b->sink_cb(l->read_buf, size, ci->udata); if (sres.full_msg_buffer) { BUS_LOG(b, 3, LOG_LISTENER, "calling unpack CB", b->udata); bus_unpack_cb_res_t ures = b->unpack_cb(sres.full_msg_buffer, ci->udata); BUS_LOG_SNPRINTF(b, 3, LOG_LISTENER, b->udata, 64, "process_unpacked_message: ok? %d, seq_id:%lld", ures.ok, (long long)ures.u.success.seq_id); process_unpacked_message(l, ci, ures); } ci->to_read_size = sres.next_read; BUS_LOG_SNPRINTF(b, 3, LOG_LISTENER, b->udata, 64, "expecting next read to have %zd bytes", ci->to_read_size); /* Grow read buffer if necessary. */ if (ci->to_read_size > l->read_buf_size) { if (!ListenerTask_GrowReadBuf(l, ci->to_read_size)) { BUS_LOG_SNPRINTF(b, 3, LOG_MEMORY, b->udata, 128, "Read buffer realloc failure for %p (%zd to %zd)", l->read_buf, l->read_buf_size, ci->to_read_size); BUS_ASSERT(b, b->udata, false); } } return true; }