Commit c036ae838ca20f8cbc0899c3277c1199c7067ffc

Authored by Wiebe Cazemier
1 parent b118b047

Buffer fixes

Showing 2 changed files with 25 additions and 16 deletions
client.cpp
... ... @@ -19,16 +19,25 @@ Client::~Client()
19 19 epoll_ctl(threadData->epollfd, EPOLL_CTL_DEL, fd, NULL); // NOTE: the last NULL can cause crash on old kernels
20 20 close(fd);
21 21 free(readbuf);
  22 + free(writebuf);
22 23 }
23 24  
24 25 // false means any kind of error we want to get rid of the client for.
25 26 bool Client::readFdIntoBuffer()
26 27 {
27   - int read_size = getReadBufMaxWriteSize();
28   -
29 28 int n;
30   - while ((n = read(fd, &readbuf[wi], read_size)) != 0)
  29 + while ((n = read(fd, &readbuf[wi], getReadBufMaxWriteSize())) != 0)
31 30 {
  31 + if (n > 0)
  32 + {
  33 + wi += n;
  34 +
  35 + if (getReadBufBytesUsed() >= readBufsize)
  36 + {
  37 + growReadBuffer();
  38 + }
  39 + }
  40 +
32 41 if (n < 0)
33 42 {
34 43 if (errno == EINTR)
... ... @@ -38,15 +47,6 @@ bool Client::readFdIntoBuffer()
38 47 else
39 48 return false;
40 49 }
41   -
42   - wi += n;
43   -
44   - if (getReadBufBytesUsed() >= readBufsize)
45   - {
46   - growReadBuffer();
47   - }
48   -
49   - read_size = getReadBufMaxWriteSize();
50 50 }
51 51  
52 52 if (n == 0) // client disconnected.
... ... @@ -84,6 +84,8 @@ bool Client::writeBufIntoFd() // TODO: ignore the signal BROKEN PIPE we now also
84 84 int n;
85 85 while ((n = write(fd, &writebuf[wri], getWriteBufBytesUsed())) != 0)
86 86 {
  87 + if (n > 0)
  88 + wri += n;
87 89 if (n < 0)
88 90 {
89 91 if (errno == EINTR)
... ... @@ -93,8 +95,6 @@ bool Client::writeBufIntoFd() // TODO: ignore the signal BROKEN PIPE we now also
93 95 else
94 96 return false;
95 97 }
96   -
97   - wri += n;
98 98 }
99 99  
100 100 if (wri == wwi)
... ... @@ -148,6 +148,9 @@ bool Client::bufferToMqttPackets(std::vector&lt;MqttPacket&gt; &amp;packetQueueIn)
148 148 packetQueueIn.push_back(std::move(packet));
149 149  
150 150 ri += packet_length;
  151 +
  152 + if (ri > wi)
  153 + throw std::runtime_error("hier");
151 154 }
152 155 else
153 156 break;
... ...
client.h
... ... @@ -46,7 +46,7 @@ class Client
46 46  
47 47 size_t getReadBufMaxWriteSize()
48 48 {
49   - size_t available = readBufsize - getReadBufBytesUsed();
  49 + size_t available = readBufsize - wi;
50 50 return available;
51 51 }
52 52  
... ... @@ -54,12 +54,14 @@ class Client
54 54 {
55 55 const size_t newBufSize = readBufsize * 2;
56 56 readbuf = (char*)realloc(readbuf, newBufSize);
  57 + if (readbuf == NULL)
  58 + throw std::runtime_error("Memory allocation failure in growReadBuffer()");
57 59 readBufsize = newBufSize;
58 60 }
59 61  
60 62 size_t getWriteBufMaxWriteSize()
61 63 {
62   - size_t available = writeBufsize - getWriteBufBytesUsed();
  64 + size_t available = writeBufsize - wwi;
63 65 return available;
64 66 }
65 67  
... ... @@ -75,6 +77,10 @@ class Client
75 77  
76 78 const size_t newBufSize = writeBufsize + add_size;
77 79 writebuf = (char*)realloc(writebuf, newBufSize);
  80 +
  81 + if (writebuf == NULL)
  82 + throw std::runtime_error("Memory allocation failure in growWriteBuffer()");
  83 +
78 84 writeBufsize = newBufSize;
79 85 }
80 86  
... ...