[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