Skip to content

Commit 2c08f3f

Browse files
committed
attr: Use HEAP memory instead of large variables on stack
Signed-off-by: Dan Nechita <dan.nechita@analog.com>
1 parent 7ccfbda commit 2c08f3f

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

attr.c

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -356,10 +356,15 @@ int iio_attr_get_range(const struct iio_attr *attr, double *min, double *step, d
356356
if (!string_ends_with(iio_attr_get_name(attr), "available"))
357357
return -ENXIO;
358358

359-
char buf[MAX_ATTR_VALUE];
360-
ret = iio_attr_read_raw(attr, buf, sizeof(buf));
361-
if (ret < 0)
359+
char *buf = malloc(MAX_ATTR_VALUE);
360+
if (!buf)
361+
return -ENOMEM;
362+
363+
ret = iio_attr_read_raw(attr, buf, MAX_ATTR_VALUE);
364+
if (ret < 0) {
365+
free(buf);
362366
return (int) ret;
367+
}
363368

364369
// Expect format: [min step max]
365370
#if defined(_MSC_VER)
@@ -373,9 +378,11 @@ int iio_attr_get_range(const struct iio_attr *attr, double *min, double *step, d
373378
*step = lstep;
374379
*max = lmax;
375380
} else {
381+
free(buf);
376382
return -EOPNOTSUPP;
377383
}
378384

385+
free(buf);
379386
return 0;
380387
}
381388

@@ -402,17 +409,26 @@ int iio_attr_get_available(const struct iio_attr *attr, char ***list, size_t *co
402409
if (!string_ends_with(iio_attr_get_name(attr), "available"))
403410
return -ENXIO;
404411

405-
char buf[MAX_ATTR_VALUE];
406-
ret = (int)iio_attr_read_raw(attr, buf, sizeof(buf));
407-
if (ret < 0)
412+
char *buf = malloc(MAX_ATTR_VALUE);
413+
if (!buf)
414+
return -ENOMEM;
415+
416+
ret = (int)iio_attr_read_raw(attr, buf, MAX_ATTR_VALUE);
417+
if (ret < 0) {
418+
free(buf);
408419
return ret;
420+
}
409421

410-
if (buf[0] == '[')
422+
if (buf[0] == '[') {
423+
free(buf);
411424
return -EOPNOTSUPP;
425+
}
412426

413427
local_list = malloc(capacity * sizeof(char *));
414-
if (!local_list)
428+
if (!local_list) {
429+
free(buf);
415430
return -ENOMEM;
431+
}
416432

417433
char *token = iio_strtok_r(buf, " \n", &saveptr);
418434
while (token) {
@@ -425,6 +441,7 @@ int iio_attr_get_available(const struct iio_attr *attr, char ***list, size_t *co
425441
for (; i < n; ++i)
426442
free(local_list[i]);
427443
free(local_list);
444+
free(buf);
428445
return -ENOMEM;
429446
}
430447
local_list = tmp;
@@ -433,6 +450,8 @@ int iio_attr_get_available(const struct iio_attr *attr, char ***list, size_t *co
433450
token = iio_strtok_r(NULL, " \n", &saveptr);
434451
}
435452

453+
free(buf);
454+
436455
*list = local_list;
437456
*count = n;
438457

0 commit comments

Comments
 (0)