Skip to content

Commit a09fae5

Browse files
rlubosfabiobaltieri
authored andcommitted
net: lwm2m: plain_text: Check for int64_t overflow when parsing integer
Verify if the integer value being parsed does not overflow int64_t type and report an error in such cases. Signed-off-by: Robert Lubos <[email protected]>
1 parent d9395d8 commit a09fae5

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,26 +181,30 @@ static int plain_text_read_int(struct lwm2m_input_context *in, int64_t *value,
181181
{
182182
int i = 0;
183183
bool neg = false;
184-
uint8_t tmp;
184+
uint64_t temp;
185+
uint8_t c;
185186

186187
if (in->offset >= in->in_cpkt->offset) {
187188
/* No remaining data in the payload. */
188189
return -ENODATA;
189190
}
190191

191192
/* initialize values to 0 */
192-
*value = 0;
193+
temp = 0;
193194

194195
while (in->offset < in->in_cpkt->offset) {
195-
if (buf_read_u8(&tmp, CPKT_BUF_READ(in->in_cpkt),
196+
if (buf_read_u8(&c, CPKT_BUF_READ(in->in_cpkt),
196197
&in->offset) < 0) {
197198
break;
198199
}
199200

200-
if (tmp == '-' && accept_sign && i == 0) {
201+
if (c == '-' && accept_sign && i == 0) {
201202
neg = true;
202-
} else if (isdigit(tmp) != 0) {
203-
*value = *value * 10 + (tmp - '0');
203+
} else if (isdigit(c) != 0) {
204+
temp = temp * 10ULL + (c - '0');
205+
if (temp > ((uint64_t)INT64_MAX + (neg ? 1ULL : 0ULL))) {
206+
return -EINVAL;
207+
}
204208
} else {
205209
/* anything else stop reading */
206210
in->offset--;
@@ -210,9 +214,7 @@ static int plain_text_read_int(struct lwm2m_input_context *in, int64_t *value,
210214
i++;
211215
}
212216

213-
if (neg) {
214-
*value = -*value;
215-
}
217+
*value = neg ? -temp : temp;
216218

217219
return i;
218220
}

0 commit comments

Comments
 (0)