Skip to content

Commit

Permalink
raw/skeleton: fix selftest
Browse files Browse the repository at this point in the history
[ upstream commit 365ec3c4fe599048c67cc79817ae9dfa090753cc ]

ASan reported issues in this driver.

rte_rawdev_obj_t context object points at a uint16_t.
skeleton_rawdev_enqueue_bufs() and skeleton_rawdev_dequeue_bufs() were
incorrectly casting to an int.

The enqueue/dequeue selftest had a leak on the enqueued string and was
wrong in passing a rte_rawdev_buf pointer array.
Fix this by allocating buffers on the stack and check that returned
string is the expected one.

Bugzilla ID: 999
Fixes: 61c592a ("raw/skeleton: introduce skeleton rawdev driver")
Fixes: 55ca1b0 ("raw/skeleton: add test cases")

Signed-off-by: David Marchand <david.marchand@redhat.com>
Tested-by:  Yu Jiang <yux.jiang@intel.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
  • Loading branch information
david-marchand authored and kevintraynor committed Mar 21, 2023
1 parent fe4b055 commit 7dd9b2a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 30 deletions.
4 changes: 2 additions & 2 deletions drivers/raw/skeleton/skeleton_rawdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ static int skeleton_rawdev_enqueue_bufs(struct rte_rawdev *dev,
* help in complex implementation which require more information than
* just an integer - for example, a queue-pair.
*/
q_id = *((int *)context);
q_id = *((uint16_t *)context);

for (i = 0; i < count; i++)
queue_buf[q_id].bufs[i] = buffers[i]->buf_addr;
Expand All @@ -443,7 +443,7 @@ static int skeleton_rawdev_dequeue_bufs(struct rte_rawdev *dev,
* help in complex implementation which require more information than
* just an integer - for example, a queue-pair.
*/
q_id = *((int *)context);
q_id = *((uint16_t *)context);

for (i = 0; i < count; i++)
buffers[i]->buf_addr = queue_buf[q_id].bufs[i];
Expand Down
48 changes: 20 additions & 28 deletions drivers/raw/skeleton/skeleton_rawdev_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,42 +368,34 @@ static int
test_rawdev_enqdeq(void)
{
int ret;
unsigned int count = 1;
uint16_t queue_id = 0;
struct rte_rawdev_buf buffers[1];
struct rte_rawdev_buf *deq_buffers = NULL;

buffers[0].buf_addr = malloc(strlen(TEST_DEV_NAME) + 3);
if (!buffers[0].buf_addr)
goto cleanup;
snprintf(buffers[0].buf_addr, strlen(TEST_DEV_NAME) + 2, "%s%d",
struct rte_rawdev_buf buffer;
struct rte_rawdev_buf *buffers[1];
struct rte_rawdev_buf deq_buffer;
struct rte_rawdev_buf *deq_buffers[1];

buffers[0] = &buffer;
buffer.buf_addr = malloc(strlen(TEST_DEV_NAME) + 3);
if (!buffer.buf_addr)
return TEST_FAILED;
snprintf(buffer.buf_addr, strlen(TEST_DEV_NAME) + 2, "%s%d",
TEST_DEV_NAME, 0);

ret = rte_rawdev_enqueue_buffers(test_dev_id,
(struct rte_rawdev_buf **)&buffers,
count, &queue_id);
RTE_TEST_ASSERT_EQUAL((unsigned int)ret, count,
ret = rte_rawdev_enqueue_buffers(test_dev_id, buffers,
RTE_DIM(buffers), &queue_id);
RTE_TEST_ASSERT_EQUAL((unsigned int)ret, RTE_DIM(buffers),
"Unable to enqueue buffers");

deq_buffers = malloc(sizeof(struct rte_rawdev_buf) * count);
if (!deq_buffers)
goto cleanup;

ret = rte_rawdev_dequeue_buffers(test_dev_id,
(struct rte_rawdev_buf **)&deq_buffers,
count, &queue_id);
RTE_TEST_ASSERT_EQUAL((unsigned int)ret, count,
deq_buffers[0] = &deq_buffer;
ret = rte_rawdev_dequeue_buffers(test_dev_id, deq_buffers,
RTE_DIM(deq_buffers), &queue_id);
RTE_TEST_ASSERT_EQUAL((unsigned int)ret, RTE_DIM(buffers),
"Unable to dequeue buffers");
RTE_TEST_ASSERT_EQUAL(deq_buffers[0]->buf_addr, buffers[0]->buf_addr,
"Did not retrieve expected object");

if (deq_buffers)
free(deq_buffers);

free(buffer.buf_addr);
return TEST_SUCCESS;
cleanup:
if (buffers[0].buf_addr)
free(buffers[0].buf_addr);

return TEST_FAILED;
}

static void skeldev_test_run(int (*setup)(void),
Expand Down

0 comments on commit 7dd9b2a

Please sign in to comment.