[Ltrace-devel] patch : disable broken printf length

Mike Dupont jamesmikedupont at googlemail.com
Wed Nov 11 13:34:21 UTC 2015


Attached a dirty patch to disable the broken printf max string length
code. I dont expect it to be merged but it might be a starting point
for someone experiencing the problem that I have.

Take a look at _doprnt from libiberty for an implementation. I am
wondering why we need these lengths in the parameters anyway? I would
like the raw data so.
It might be interesting to show the result of the format string applied.

see my bug report here: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=804494

any feedback would be appreciated.

mike

-- 
James Michael DuPont
Kansas Linux Fest http://kansaslinuxfest.us
Free/Libre Open Source and Open Knowledge Association of Kansas
http://openkansas.us
Member of Free Libre Open Source Software Kosova http://www.flossk.org
Saving Wikipedia(tm) articles from deletion http://SpeedyDeletion.wikia.com
-------------- next part --------------
Index: ltrace-0.7.3/printf.c
===================================================================
--- ltrace-0.7.3.orig/printf.c
+++ ltrace-0.7.3/printf.c
@@ -97,11 +97,11 @@ drop_future_length(struct param_enum *se
 static int
 form_next_param(struct param_enum *self,
 		enum arg_type format_type, enum arg_type elt_type,
-		unsigned hlf, unsigned lng, char *len_buf, size_t len_buf_len,
+		unsigned hlf, unsigned lng, 
 		struct arg_type_info *infop)
 {
 
-  debug(DEBUG_FUNCTION, "form_next_param(lng=%d,len_buf=%s)", lng, len_buf);
+  debug(DEBUG_FUNCTION, "form_next_param(lng=%d)", lng);
   
 	/* XXX note: Some types are wrong because we lack
 	   ARGTYPE_LONGLONG, ARGTYPE_UCHAR and ARGTYPE_SCHAR.  */
@@ -130,41 +130,36 @@ form_next_param(struct param_enum *self,
 
 		struct expr_node *node = NULL;
 		int own_node;
-		if (len_buf_len != 0
-		    || self->future_length != NULL) {
-			struct tmp {
-				struct expr_node node;
-				struct arg_type_info type;
-			};
-			struct tmp *len = malloc(sizeof(*len));
-			if (len == NULL) {
-			fail:
-				free(len);
-				free(array);
-				return -1;
-			}
-
-			len->type = *type_get_simple(ARGTYPE_LONG);
-
-			long l;
-			if (self->future_length != NULL) {
-				l = *self->future_length;
-				drop_future_length(self);
-			} else {
-				l = atol(len_buf);
-			}
-
-			expr_init_const_word(&len->node, l, &len->type, 0);
-
-			node = build_zero_w_arg(&len->node, 1);
-			if (node == NULL)
-				goto fail;
-			own_node = 1;
-
-		} else {
-			node = expr_node_zero();
-			own_node = 0;
-		}
+		/* if (len_buf_len != 0 */
+		/*     || self->future_length != NULL) { */
+		/* 	struct tmp { */
+		/* 		struct expr_node node; */
+		/* 		struct arg_type_info type; */
+		/* 	}; */
+		/* 	struct tmp *len = malloc(sizeof(*len)); */
+		/* 	if (len == NULL) { */
+		/* 	fail: */
+		/* 		free(len); */
+		/* 		free(array); */
+		/* 		return -1; */
+		/* 	} */
+		/* 	len->type = *type_get_simple(ARGTYPE_LONG); */
+		/* 	long l; */
+		/* 	if (self->future_length != NULL) { */
+		/* 		l = *self->future_length; */
+		/* 		drop_future_length(self); */
+		/* 	} else { */
+		/* 		l = atol(len_buf); */
+		/* 	} */
+		/* 	expr_init_const_word(&len->node, l, &len->type, 0); */
+		/* 	node = build_zero_w_arg(&len->node, 1); */
+		/* 	if (node == NULL) */
+		/* 		goto fail; */
+		/* 	own_node = 1; */
+		/* } else { */
+                node = expr_node_zero();
+                own_node = 0;
+                //}
 		assert(node != NULL);
 
 		type_init_array(array, elt_info, 0, node, own_node);
@@ -188,8 +183,8 @@ param_printf_next(struct param_enum *sel
 	unsigned lng = 0;
 	enum arg_type format_type = ARGTYPE_VOID;
 	enum arg_type elt_type = ARGTYPE_VOID;
-	char len_buf[25] = {};
-	size_t len_buf_len = 0;
+	//char len_buf[25] = {};
+	//size_t len_buf_len = 0;
 	struct lens *lens = NULL;
 
 	for (; self->ptr < self->end; ++self->ptr) {
@@ -207,8 +202,8 @@ param_printf_next(struct param_enum *sel
 			continue;
 
 		case '*':
-			/* Length parameter given in the next
-			 * argument.  */
+			/* Min or max Length parameter given in the next
+			 * argument depending on position.  */
 			if (self->future_length == NULL)
 				/* This should really be an assert,
 				 * but we can't just fail on invalid
@@ -229,8 +224,8 @@ param_printf_next(struct param_enum *sel
 			/* Field length likewise, but we need to parse
 			 * this to attach the appropriate string
 			 * length expression.  */
-			if (len_buf_len < sizeof(len_buf) - 1)
-				len_buf[len_buf_len++] = *self->ptr;
+                  //if (len_buf_len < sizeof(len_buf) - 1)
+                  //len_buf[len_buf_len++] = *self->ptr;
 			continue;
 
 		case 'h':
@@ -329,7 +324,7 @@ param_printf_next(struct param_enum *sel
 		assert(format_type != ARGTYPE_VOID);
 
 		if (form_next_param(self, format_type, elt_type, hlf, lng,
-				    len_buf, len_buf_len, infop) < 0)
+				     infop) < 0)
 			return -1;
 
 		infop->lens = lens;


More information about the Ltrace-devel mailing list