Additional error handling for rarer states.

Ensure std::map::at is not blindly applied without checking that the key
actually exists.

Fixes crashes where u2f client on PC/browser expects channel open, but
service has been restarted.
This commit is contained in:
2019-09-08 20:27:47 +01:00
parent 528662a081
commit 701127496c
4 changed files with 20 additions and 9 deletions

View File

@@ -44,17 +44,20 @@ void Controller::handleTransaction() {
lastMessage = chrono::system_clock::now();
auto opChannel = msg->cid;
auto opChannelID = msg->cid;
if (msg->cmd == U2FHID_INIT) {
opChannel = nextChannel();
auto channel = Channel{ opChannel };
opChannelID = nextChannel();
auto channel = Channel{ opChannelID };
try {
channels.emplace(opChannel, channel); // In case of wrap-around replace existing one
channels.emplace(opChannelID, channel); // In case of wrap-around replace existing one
} catch (...) {
channels.insert(make_pair(opChannel, channel));
channels.insert(make_pair(opChannelID, channel));
}
} else if (channels.find(opChannelID) == channels.end()) {
U2FMessage::error(opChannelID, ERR_CHANNEL_BUSY);
return;
}
#ifdef DEBUG_MSGS
@@ -62,7 +65,7 @@ void Controller::handleTransaction() {
clog << "cid: " << msg->cid << ", cmd: " << static_cast<unsigned int>(msg->cmd) << endl;
#endif
channels.at(opChannel).handle(msg);
channels.at(opChannelID).handle(msg);
}
uint32_t Controller::nextChannel() {