2012/10/16 Ildar Ismagilov <devix84@...9...>:
In function Req_cache::remove on ports-foc/src/lib/l4lx/genode_block.cc file:
void remove(void *packet, void **request) { int idx = _find(packet);
if (idx < 0) { *request = 0; PERR("Req cache entry not found!"); } *request = _cache[idx].req; // <--- if idx is -1, this negative index used for access _cache array elements _cache[idx].pkt = 0; _cache[idx].req = 0; }
should be:
void remove(void *packet, void **request) { int idx = _find(packet);
if (idx < 0) { *request = 0; PERR("Req cache entry not found!"); } else { *request = _cache[idx].req; _cache[idx].pkt = 0; _cache[idx].req = 0; } }
-- Best regards Ildar
Test case is intensive usage of block driver:
If "devices[idx]->cache()->insert(addr, req);" function called from genode_block_request when Req_cache::_cache array is full, the Req_cache::_find(0) return -1, and data don't added to Req_cache::_cache array. Next "devices[idx]->cache()->remove(session->tx()->packet_content(packet), &req)" function call from "genode_block_collect_responses" will delete data from Req_cache::_cache array but Req_cache::_find(packet) will return -1 because previous "Req_cache::insert" call not inserted item to Req_cache::_cache array and this bug appears.