ACK: [PATCH] lib: fwts_klog: fix vector size and handle errors from pcre_exec (LP: #1401184)

Alex Hung alex.hung at canonical.com
Wed Dec 17 04:08:42 UTC 2014


On 12/11/2014 01:23 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
> 
> On ARM32 platforms I detected a stack smashing bug where pcre_exec scribbles
> over the stack because the vector being passed to pcre_exec is not a multiple
> of 3 in size (as the API requires).
> 
> Make the vector overly large multiple of 3 to avoid any future stack smashing
> and also handle errors from pcre_exec in case the regular expressions get
> broken or miscompiled because of other errors.
> 
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/lib/src/fwts_klog.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 42 insertions(+), 3 deletions(-)
> 
> diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c
> index 8b4a9ed..b38a02e 100644
> --- a/src/lib/src/fwts_klog.c
> +++ b/src/lib/src/fwts_klog.c
> @@ -258,6 +258,8 @@ static char *fwts_klog_unique_label(const char *str)
>  	return buffer;
>  }
>  
> +#define VECTOR_SIZE	(3)	/* Must be a multiple of 3 */
> +
>  void fwts_klog_scan_patterns(fwts_framework *fw,
>  	char *line,
>  	int  repeated,
> @@ -266,7 +268,7 @@ void fwts_klog_scan_patterns(fwts_framework *fw,
>  	int *errors)
>  {
>  	fwts_klog_pattern *pattern = (fwts_klog_pattern *)private;
> -	int vector[1];
> +	int vector[VECTOR_SIZE];
>  	static char *advice =
>  		"This is a bug picked up by the kernel, but as yet, the "
>  		"firmware test suite has no diagnostic advice for this particular problem.";
> @@ -277,8 +279,45 @@ void fwts_klog_scan_patterns(fwts_framework *fw,
>  		bool matched = false;
>  		switch (pattern->compare_mode) {
>  		case FWTS_COMPARE_REGEX:
> -			if (pattern->re)
> -				matched = (pcre_exec(pattern->re, pattern->extra, line, strlen(line), 0, 0, vector, 1) == 0);
> +			if (pattern->re) {
> +				int ret = pcre_exec(pattern->re, pattern->extra, line, strlen(line), 0, 0, vector, VECTOR_SIZE);
> +				if (ret < 0) {
> +					char *errmsg = NULL;
> +					/*
> +					 *  We should handle -ve conditions other
> +					 *  than PCRE_ERROR_NOMATCH as pcre internal
> +					 *  errors..
> +					 */
> +					switch (ret) {
> +					case PCRE_ERROR_NOMATCH:
> +						break;
> +					case PCRE_ERROR_NULL:
> +						errmsg = "internal NULL error";
> +						break;
> +					case PCRE_ERROR_BADOPTION:
> +						errmsg = "invalid option passed to pcre_exec()";
> +						break;
> +					case PCRE_ERROR_BADMAGIC:
> +						errmsg = "bad magic number, (corrupt regular expression)";
> +						break;
> +					case PCRE_ERROR_UNKNOWN_NODE:
> +						errmsg = "compiled regular expression broken";
> +						break;
> +					case PCRE_ERROR_NOMEMORY:
> +						errmsg = "out of memory";
> +						break;
> +					default:
> +						errmsg = "unknown error";
> +						break;
> +					}
> +					if (errmsg)
> +						fwts_log_info(fw, "regular expression engine error: %s.", errmsg);
> +				}
> +				else {
> +					/* A successful regular expression match! */
> +					matched = true;
> +				}
> +			}
>  			break;
>  		case FWTS_COMPARE_STRING:
>  		default:
> 

Acked-by: Alex Hung <alex.hung at canonical.com>



More information about the fwts-devel mailing list