OSDN Git Service

ice: ice_aq_check_events: fix off-by-one check when filling buffer
authorPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Tue, 8 Aug 2023 21:54:15 +0000 (17:54 -0400)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 17 Aug 2023 20:59:46 +0000 (13:59 -0700)
Allow task's event buffer to be filled also in the case that it's size
is exactly the size of the message.

Fixes: d69ea414c9b4 ("ice: implement device flash update via devlink")
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_main.c

index 0f04347..872bd55 100644 (file)
@@ -1357,6 +1357,7 @@ int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout,
 static void ice_aq_check_events(struct ice_pf *pf, u16 opcode,
                                struct ice_rq_event_info *event)
 {
+       struct ice_rq_event_info *task_ev;
        struct ice_aq_task *task;
        bool found = false;
 
@@ -1365,15 +1366,15 @@ static void ice_aq_check_events(struct ice_pf *pf, u16 opcode,
                if (task->state || task->opcode != opcode)
                        continue;
 
-               memcpy(&task->event->desc, &event->desc, sizeof(event->desc));
-               task->event->msg_len = event->msg_len;
+               task_ev = task->event;
+               memcpy(&task_ev->desc, &event->desc, sizeof(event->desc));
+               task_ev->msg_len = event->msg_len;
 
                /* Only copy the data buffer if a destination was set */
-               if (task->event->msg_buf &&
-                   task->event->buf_len > event->buf_len) {
-                       memcpy(task->event->msg_buf, event->msg_buf,
+               if (task_ev->msg_buf && task_ev->buf_len >= event->buf_len) {
+                       memcpy(task_ev->msg_buf, event->msg_buf,
                               event->buf_len);
-                       task->event->buf_len = event->buf_len;
+                       task_ev->buf_len = event->buf_len;
                }
 
                task->state = ICE_AQ_TASK_COMPLETE;