From 246750eb96551ff4bb538b641e166f9516c8649a Mon Sep 17 00:00:00 2001 From: Cunming Liang Date: Fri, 11 Dec 2015 09:48:57 +0800 Subject: [PATCH] eal/linux: fix Rx interrupt read error management In eal_intr_proc_rxtx_intr, negative value may be used as argument to a function expecting a positive value. If 'read' returns EAGAIN as example, the bytes_read updates to a negative value which continue be passed as argument for the next 'read'. Coverity issue: 107115 Function read(fd, &buf, bytes_read) returns a negative number. Assigning: signed variable bytes_read = read. CID 107115 (#1 of 1): Argument cannot be negative (NEGATIVE_RETURNS) bytes_read is passed to a parameter that cannot be negative. bytes_read = read(fd, &buf, bytes_read); Fixes: c9f3ec1a0f3f ("eal/linux: add Rx interrupt control function") Signed-off-by: Cunming Liang Acked-by: John McNamara Acked-by: David Marchand --- lib/librte_eal/linuxapp/eal/eal_interrupts.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c index 470d6a1f57..06b26a9e14 100644 --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c @@ -901,6 +901,7 @@ eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle) { union rte_intr_read_buffer buf; int bytes_read = 1; + int nbytes; switch (intr_handle->type) { case RTE_INTR_HANDLE_UIO: @@ -925,15 +926,15 @@ eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle) * for epoll_wait. */ do { - bytes_read = read(fd, &buf, bytes_read); - if (bytes_read < 0) { + nbytes = read(fd, &buf, bytes_read); + if (nbytes < 0) { if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) continue; RTE_LOG(ERR, EAL, "Error reading from fd %d: %s\n", fd, strerror(errno)); - } else if (bytes_read == 0) + } else if (nbytes == 0) RTE_LOG(ERR, EAL, "Read nothing from fd %d\n", fd); return; } while (1); -- 2.20.1