From f5bc22b18e3c3042dbf7e4ecc38e046b13a2a992 Mon Sep 17 00:00:00 2001 From: Esa Peuha Date: Fri, 5 Jun 2015 20:28:28 +0530 Subject: Fix ps -o %r infinite loop * libps/fmt.c (_fmt_create): When nothing at all was recognized, break out instead of looping. --- libps/fmt.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'libps/fmt.c') diff --git a/libps/fmt.c b/libps/fmt.c index 0465555d..580b097e 100644 --- a/libps/fmt.c +++ b/libps/fmt.c @@ -68,6 +68,8 @@ _fmt_create (char *src, int posix, struct ps_fmt_specs *fmt_specs, src = new_fmt->src; while (*src != '\0') { + char *start = src; + if (field - fields == fields_alloced) /* Time to grow FIELDS to make room for more. */ { @@ -172,6 +174,19 @@ _fmt_create (char *src, int posix, struct ps_fmt_specs *fmt_specs, /* This field spec doesn't have a name, so use its flags fields to set the global ones, and skip it. */ { + /* if we didn't use any chars, don't loop indefinitely */ + if (src == start) + { + if (err_string) + asprintf (err_string, "%s: Unknown format spec", src); + + FREE (new_fmt->src); + FREE (new_fmt); + FREE (fields); + + return EINVAL; + } + global_clr_flags = clr_flags; global_inv_flags = inv_flags; continue; -- cgit v1.2.3