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

Colin King colin.king at canonical.com
Thu Jun 4 16:18:11 UTC 2015


From: Colin Ian King <colin.king at canonical.com>

On an 32 bit x86 platform another stack smashing bug occurs 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 fix this. This is the same
fix as in an earlier bug (LP: #1401184), however, I failed to fix all
the occurrances of the original bug, hence we got bitten again by this.

Also, move the define for VECTOR_SIZE to the top of the source just to
be a bit tidier.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/lib/src/fwts_klog.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c
index 0d6358b..9c51b32 100644
--- a/src/lib/src/fwts_klog.c
+++ b/src/lib/src/fwts_klog.c
@@ -34,6 +34,7 @@
  *  klog pattern matching strings data file, data stored in json format
  */
 #define KLOG_DATA_JSON_FILE		"klog.json"
+#define VECTOR_SIZE			(3)	/* Must be a multiple of 3 */
 
 /*
  *  fwts_klog_free()
@@ -260,8 +261,6 @@ 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,
@@ -553,13 +552,12 @@ static void fwts_klog_regex_find_callback(fwts_framework *fw, char *line, int re
 	re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
 	if (re != NULL) {
 		int rc;
-		int vector[1];
+		int vector[VECTOR_SIZE];
 		pcre_extra *extra = pcre_study(re, 0, &error);
 
 		if (error)
 			return;
-
-		rc = pcre_exec(re, extra, line, strlen(line), 0, 0, vector, 1);
+		rc = pcre_exec(re, extra, line, strlen(line), 0, 0, vector, VECTOR_SIZE);
 		free(extra);
 		pcre_free(re);
 		if (rc == 0)
-- 
2.1.4




More information about the fwts-devel mailing list