[PATCH] lib: fwts_log_json: do more json object out of memory checking

Colin King colin.king at canonical.com
Thu Jun 28 13:22:54 UTC 2012


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

The current json logging back-end is a bit sloppy because it
neglects to check for any out of memory conditions when json
objects are being created.  So add these checks and terminate
with some form of understandable error message on a heap failure.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/lib/src/fwts_log_json.c |   77 +++++++++++++++++++++++++++++++++----------
 1 file changed, 60 insertions(+), 17 deletions(-)

diff --git a/src/lib/src/fwts_log_json.c b/src/lib/src/fwts_log_json.c
index 75383a5..9afb74e 100644
--- a/src/lib/src/fwts_log_json.c
+++ b/src/lib/src/fwts_log_json.c
@@ -40,7 +40,17 @@ static fwts_log_json_stack_t json_stack[MAX_JSON_STACK];
 static int json_stack_index = 0;
 
 /*
- *  fwts_log_printf_son()
+ *  fwts_log_out_of_memory_json()
+ *	handle out of memory from json objects
+ */
+static void fwts_log_out_of_memory_json(void)
+{
+	fprintf(stderr, "Out of memory allocating a json object.\n");
+	exit(EXIT_FAILURE);
+}
+
+/*
+ *  fwts_log_printf_json()
  *	print to a log
  */
 static int fwts_log_print_json(
@@ -57,6 +67,7 @@ static int fwts_log_print_json(
 	time_t now;
 	json_object *header;
 	json_object *json_log = (json_object*)json_stack[json_stack_index-1].log;
+	json_object *obj;
 	char *str;
 
 	if (!((field & LOG_FIELD_MASK) & fwts_log_filter))
@@ -68,31 +79,53 @@ static int fwts_log_print_json(
 	time(&now);
 	localtime_r(&now, &tm);
 
-	header = json_object_new_object();
-	json_object_object_add(header, "line_num", json_object_new_int(log_file->line_number));
+	if ((header = json_object_new_object()) == NULL)
+		fwts_log_out_of_memory_json();
+
+	if ((obj = json_object_new_int(log_file->line_number)) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "line_num", obj);
+
 	snprintf(tmpbuf, sizeof(tmpbuf), "%2.2d/%2.2d/%-2.2d",
 		tm.tm_mday, tm.tm_mon + 1, (tm.tm_year+1900) % 100);
-	json_object_object_add(header, "date", json_object_new_string(tmpbuf));
+	if ((obj = json_object_new_string(tmpbuf)) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "date", obj);
+
 	snprintf(tmpbuf, sizeof(tmpbuf), "%2.2d:%2.2d:%2.2d",
 		tm.tm_hour, tm.tm_min, tm.tm_sec);
-	json_object_object_add(header, "time", json_object_new_string(tmpbuf));
-	json_object_object_add(header, "field_type",
-		json_object_new_string(fwts_log_field_to_str_full(field)));
+	if ((obj = json_object_new_string(tmpbuf)) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "time", obj);
+
+	if ((obj = json_object_new_string(fwts_log_field_to_str_full(field))) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "field_type", obj);
 
 	str = fwts_log_level_to_str(level);
 	if (!strcmp(str, " "))
 		str = "None";
-	json_object_object_add(header, "level",
-		json_object_new_string(str));
+	if ((obj = json_object_new_string(str)) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "level", obj);
+
+	if ((obj = json_object_new_string(*status ? status : "None")) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "status", obj);
 
-	json_object_object_add(header, "status", json_object_new_string(*status ? status : "None"));
-	json_object_object_add(header, "failure_label", json_object_new_string(label && *label ? label : "None"));
+	if ((obj = json_object_new_string(label && *label ? label : "None")) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "failure_label", obj);
 
 	/* Redundant really
-	json_object_object_add(header, "owner",
-		json_object_new_string(log->owner));
+	if ((obj = json_object_new_string(log->owner)) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "owner", obj);
 	*/
-	json_object_object_add(header, "log_text", json_object_new_string(buffer));
+
+	if ((obj = json_object_new_string(buffer)) == NULL)
+		fwts_log_out_of_memory_json();
+	json_object_object_add(header, "log_text", obj);
 
 	json_object_array_add(json_log, header);
 	log_file->line_number++;	/* This is academic really */
@@ -123,15 +156,25 @@ static void fwts_log_section_begin_json(fwts_log_file *log_file, const char *nam
 	json_object *json_obj;
 	json_object *json_log;
 
-	json_obj = json_object_new_object();
-	json_log = json_object_new_array();
+	if ((json_obj = json_object_new_object()) == NULL)
+		fwts_log_out_of_memory_json();
+
+	if ((json_log = json_object_new_array()) == NULL)
+		fwts_log_out_of_memory_json();
+
+	/*
+	 * unfortunately json_object_object_add can fail on
+	 * a strdup, but it doesn't check this and doesn't
+	 * tell us about this either. Bit lame really.
+	 */
 	json_object_object_add(json_obj, name, json_log);
 
 	json_stack[json_stack_index].obj = json_obj;
 	json_stack[json_stack_index].log = json_log;
 
 	if (json_stack_index > 0)
-		json_object_array_add(json_stack[json_stack_index-1].log, json_obj);
+		if (json_object_array_add(json_stack[json_stack_index-1].log, json_obj) != 0)
+			fwts_log_out_of_memory_json();
 
 	if (json_stack_index < MAX_JSON_STACK)
 		json_stack_index++;
-- 
1.7.10.4





More information about the fwts-devel mailing list