Commit f255c526594a2836c726d1b7a1cfefda746a6511

Authored by Wiebe Cazemier
1 parent d125dc49

Don't handle packets from clients we're closing

This should prevent stale data from old clients from manipulating the
session.
Showing 2 changed files with 6 additions and 0 deletions
client.h
@@ -134,6 +134,7 @@ public: @@ -134,6 +134,7 @@ public:
134 int writeMqttPacketAndBlameThisClient(PublishCopyFactory &copyFactory, char max_qos, uint16_t packet_id); 134 int writeMqttPacketAndBlameThisClient(PublishCopyFactory &copyFactory, char max_qos, uint16_t packet_id);
135 int writeMqttPacketAndBlameThisClient(const MqttPacket &packet); 135 int writeMqttPacketAndBlameThisClient(const MqttPacket &packet);
136 bool writeBufIntoFd(); 136 bool writeBufIntoFd();
  137 + bool isBeingDisconnected() const { return disconnectWhenBytesWritten; }
137 bool readyForDisconnecting() const { return disconnectWhenBytesWritten && writebuf.usedBytes() == 0; } 138 bool readyForDisconnecting() const { return disconnectWhenBytesWritten && writebuf.usedBytes() == 0; }
138 139
139 // Do this before calling an action that makes this client ready for writing, so that the EPOLLOUT will handle it. 140 // Do this before calling an action that makes this client ready for writing, so that the EPOLLOUT will handle it.
mqttpacket.cpp
@@ -268,6 +268,11 @@ void MqttPacket::bufferToMqttPackets(CirBuf &buf, std::vector<MqttPacket> &packe @@ -268,6 +268,11 @@ void MqttPacket::bufferToMqttPackets(CirBuf &buf, std::vector<MqttPacket> &packe
268 268
269 void MqttPacket::handle() 269 void MqttPacket::handle()
270 { 270 {
  271 + // It may be a stale client. This is especially important for when a session is picked up by another client. The old client
  272 + // may still have stale data in the buffer, causing action on the session otherwise.
  273 + if (sender->isBeingDisconnected())
  274 + return;
  275 +
271 if (packetType == PacketType::Reserved) 276 if (packetType == PacketType::Reserved)
272 throw ProtocolError("Packet type 0 specified, which is reserved and invalid.", ReasonCodes::MalformedPacket); 277 throw ProtocolError("Packet type 0 specified, which is reserved and invalid.", ReasonCodes::MalformedPacket);
273 278