ACK: [PATCH] lib: fwts_alloc: re-work the memory parsing again
ivanhu
ivan.hu at canonical.com
Tue Jun 13 01:55:43 UTC 2017
On 06/12/2017 05:34 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Unfortunately the previous fix of mine causes tainted variable warnings
> on CoverityScan static analysis. I'm putting the original code back and
> adding a file position check to fix the bug that the previous patch fixed.
> The issue is that fscanf on the last line of a /proc/self/maps may cause
> an infinite loop if it does not parse with the expected input and we don't
> hit the EOF. So instead, check that the parsing isn't stuck on file position
> and if it has not moved forward then we break out of the loop.
>
> Fixes: 56ca0bef8cea79 ("lib: fwts_alloc: only parse mem info once we have a valid line read in")
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/lib/src/fwts_alloc.c | 19 +++++++++++++++----
> 1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/src/lib/src/fwts_alloc.c b/src/lib/src/fwts_alloc.c
> index e65b181e..4f136777 100644
> --- a/src/lib/src/fwts_alloc.c
> +++ b/src/lib/src/fwts_alloc.c
> @@ -234,12 +234,12 @@ static void *fwts_low_mmap(const size_t requested_size)
> {
> FILE *fp;
> char pathname[1024];
> - char buffer[4096];
> void *addr_start;
> void *addr_end;
> void *last_addr_end = NULL;
> void *first_addr_start = NULL;
> void *ret = MAP_FAILED;
> + long pos, prev_pos = 0;
>
> if (requested_size == 0) /* Illegal */
> return MAP_FAILED;
> @@ -252,9 +252,20 @@ static void *fwts_low_mmap(const size_t requested_size)
> if (!fp)
> return fwts_low_mmap_walkdown(requested_size);
>
> - while (fgets(buffer, sizeof(buffer) - 1, fp)) {
> - if (sscanf(buffer, "%p-%p %*s %*x %*s %*u %1023s\n",
> - &addr_start, &addr_end, pathname) != 3)
> + while (!feof(fp)) {
> + int n;
> +
> + n = fscanf(fp, "%p-%p %*s %*x %*s %*u %1023s\n",
> + &addr_start, &addr_end, pathname);
> +
> + /* At same point of previous scanf, then force a loop exit */
> + pos = ftell(fp);
> + if (pos == prev_pos)
> + break;
> + prev_pos = pos;
> +
> + /* We need exactly 3 parsed items of data */
> + if (n != 3)
> continue;
> /*
> * Sanity check data
Acked-by: Ivan Hu <ivan.hu at canonical.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/fwts-devel/attachments/20170613/bf9646cc/attachment.html>
More information about the fwts-devel
mailing list