Skip to content

Commit 35af60e

Browse files
committed
Harden PYC byte-reader size check ##crash
1 parent 838df53 commit 35af60e

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

libr/bin/format/pyc/marshal.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ static double get_float64(RBuffer *buffer, bool *error) {
7676
}
7777

7878
static ut8 *get_bytes(RBuffer *buffer, ut32 size) {
79+
if (size >= ST32_MAX) {
80+
return NULL;
81+
}
7982
ut8 *ret = R_NEWS0 (ut8, size + 1);
8083
if (ret && r_buf_read (buffer, ret, size) < size) {
8184
free (ret);
@@ -330,11 +333,11 @@ static pyc_object *get_complex_object(PycUnmarshalCtx *ctx, RBuffer *buffer) {
330333
} else {
331334
n1 = get_st32 (buffer, &error);
332335
}
333-
if (error || n1 < 1) {
336+
if (error || n1 < 1 || n1 >= ST32_MAX) {
334337
free (ret);
335338
return NULL;
336339
}
337-
ut8 *s1 = malloc (n1 + 1);
340+
ut8 *s1 = malloc ((ut32)n1 + 1);
338341
if (!s1) {
339342
free (ret);
340343
return NULL;
@@ -353,11 +356,15 @@ static pyc_object *get_complex_object(PycUnmarshalCtx *ctx, RBuffer *buffer) {
353356
} else {
354357
n2 = get_st32 (buffer, &error);
355358
}
356-
if (error || n2 < 1) {
359+
if (error || n2 < 1 || n2 >= ST32_MAX) {
360+
R_FREE (s1);
361+
R_FREE (ret);
357362
return NULL;
358363
}
359-
ut8 *s2 = malloc (n2 + 1);
364+
ut8 *s2 = malloc ((ut32)n2 + 1);
360365
if (!s2) {
366+
R_FREE (s1);
367+
R_FREE (ret);
361368
return NULL;
362369
}
363370
/* object contain string representation of the number */

0 commit comments

Comments
 (0)