Skip to content

Commit 73d4abe

Browse files
Merge pull request #258 from ACRIOS-Systems/bugfix/memory_smashing_with_big_length
MessageBuffer usage improvement
2 parents 5a4ab2a + 9b6d823 commit 73d4abe

File tree

1 file changed

+64
-53
lines changed

1 file changed

+64
-53
lines changed

erpc_c/infra/erpc_message_buffer.cpp

Lines changed: 64 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -22,59 +22,66 @@ using namespace std;
2222

2323
erpc_status_t MessageBuffer::read(uint16_t offset, void *data, uint32_t length)
2424
{
25-
erpc_status_t err;
25+
erpc_status_t err = kErpcStatus_Success;
2626

27-
if ((offset + length) > m_len)
28-
{
29-
err = kErpcStatus_BufferOverrun;
30-
}
31-
else
27+
if (length > 0U)
3228
{
33-
if (length > 0U)
29+
if (data == NULL)
30+
{
31+
err = kErpcStatus_MemoryError;
32+
}
33+
else if ((offset + length) > m_len || (offset + length) < offset)
34+
{
35+
err = kErpcStatus_BufferOverrun;
36+
}
37+
else
3438
{
3539
(void)memcpy(data, &m_buf[offset], length);
3640
}
37-
38-
err = kErpcStatus_Success;
3941
}
4042

4143
return err;
4244
}
4345

4446
erpc_status_t MessageBuffer::write(uint16_t offset, const void *data, uint32_t length)
4547
{
46-
erpc_status_t err;
48+
erpc_status_t err = kErpcStatus_Success;
4749

48-
if ((offset + length) > m_len)
50+
if (length > 0U)
4951
{
50-
err = kErpcStatus_BufferOverrun;
51-
}
52-
else
53-
{
54-
if (length > 0U)
52+
if (data == NULL)
5553
{
56-
(void)memcpy(m_buf, data, length);
54+
err = kErpcStatus_MemoryError;
55+
}
56+
else if ((offset + length) > m_len || (offset + length) < offset)
57+
{
58+
err = kErpcStatus_BufferOverrun;
59+
}
60+
else
61+
{
62+
(void)memcpy(&m_buf[offset], data, length);
5763
}
58-
59-
err = kErpcStatus_Success;
6064
}
6165

6266
return err;
6367
}
6468

6569
erpc_status_t MessageBuffer::copy(const MessageBuffer *other)
6670
{
71+
erpc_status_t err;
72+
73+
erpc_assert(other != NULL);
6774
erpc_assert(m_len >= other->m_len);
6875

6976
m_used = other->m_used;
70-
(void)memcpy(m_buf, other->m_buf, m_used);
77+
err = this->write(0, other->m_buf, m_used);
7178

72-
return kErpcStatus_Success;
79+
return err;
7380
}
7481

7582
void MessageBuffer::swap(MessageBuffer *other)
7683
{
77-
erpc_assert(other);
84+
erpc_assert(other != NULL);
7885

7986
MessageBuffer temp(*other);
8087

@@ -88,6 +95,8 @@ void MessageBuffer::swap(MessageBuffer *other)
8895

8996
void MessageBuffer::Cursor::set(MessageBuffer *buffer)
9097
{
98+
erpc_assert(buffer != NULL);
99+
91100
m_buffer = buffer;
92101
// RPMSG when nested calls are enabled can set NULL buffer.
93102
// erpc_assert(buffer->get() && "Data buffer wasn't set to MessageBuffer.");
@@ -100,23 +109,24 @@ erpc_status_t MessageBuffer::Cursor::read(void *data, uint32_t length)
100109
{
101110
erpc_assert(m_pos && "Data buffer wasn't set to MessageBuffer.");
102111

103-
erpc_status_t err;
112+
erpc_status_t err = kErpcStatus_Success;
104113

105-
if ((length > 0U) && (data == NULL))
114+
if (length > 0)
106115
{
107-
err = kErpcStatus_MemoryError;
108-
}
109-
else if (length > m_remaining)
110-
{
111-
err = kErpcStatus_BufferOverrun;
112-
}
113-
else
114-
{
115-
(void)memcpy(data, m_pos, length);
116-
m_pos += length;
117-
m_remaining -= length;
118-
119-
err = kErpcStatus_Success;
116+
if (data == NULL)
117+
{
118+
err = kErpcStatus_MemoryError;
119+
}
120+
else if (length > m_remaining)
121+
{
122+
err = kErpcStatus_BufferOverrun;
123+
}
124+
else
125+
{
126+
(void)memcpy(data, m_pos, length);
127+
m_pos += length;
128+
m_remaining -= length;
129+
}
120130
}
121131

122132
return err;
@@ -126,24 +136,25 @@ erpc_status_t MessageBuffer::Cursor::write(const void *data, uint32_t length)
126136
{
127137
erpc_assert(m_pos && "Data buffer wasn't set to MessageBuffer.");
128138

129-
erpc_status_t err;
139+
erpc_status_t err = kErpcStatus_Success;
130140

131-
if ((length > 0U) && (data == NULL))
141+
if (length > 0)
132142
{
133-
err = kErpcStatus_MemoryError;
134-
}
135-
else if (length > m_remaining)
136-
{
137-
err = kErpcStatus_BufferOverrun;
138-
}
139-
else
140-
{
141-
(void)memcpy(m_pos, data, length);
142-
m_pos += length;
143-
m_remaining -= length;
144-
m_buffer->setUsed(m_buffer->getUsed() + length);
145-
146-
err = kErpcStatus_Success;
143+
if (data == NULL)
144+
{
145+
err = kErpcStatus_MemoryError;
146+
}
147+
else if (length > m_remaining)
148+
{
149+
err = kErpcStatus_BufferOverrun;
150+
}
151+
else
152+
{
153+
(void)memcpy(m_pos, data, length);
154+
m_pos += length;
155+
m_remaining -= length;
156+
m_buffer->setUsed(m_buffer->getUsed() + length);
157+
}
147158
}
148159

149160
return err;

0 commit comments

Comments
 (0)