From 42f8b9badb6ca6111ca4e63d7e2ad382e27dc048 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Mon, 25 Sep 2017 11:25:50 +0200 Subject: [PATCH] rcinput: fix corrupted iterator on input device hot-unplug Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/ae06722b979b25ee926805395d96c24fc9c30ccc Author: Stefan Seyfried Date: 2017-09-25 (Mon, 25 Sep 2017) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/driver/rcinput.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/driver/rcinput.cpp b/src/driver/rcinput.cpp index 0d19b46d1..35e983034 100644 --- a/src/driver/rcinput.cpp +++ b/src/driver/rcinput.cpp @@ -1302,7 +1302,10 @@ void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint6 } } - for (std::vector::iterator i = indev.begin(); i != indev.end(); ++i) { + /* iterate backwards or the vector will be corrupted by the indev.erase(i) */ + std::vector::iterator i = indev.end(); + while (i != indev.begin()) { + --i; if (((*i).fd != -1) && (FD_ISSET((*i).fd, &rfds))) { uint64_t now_pressed = 0; t_input_event ev; @@ -1314,7 +1317,7 @@ void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint6 if (errno == ENODEV) { /* hot-unplugged? */ ::close((*i).fd); - indev.erase(i); + i = indev.erase(i); } continue; }