Let me know if this is acceptable.

On Wed, Nov 11, 2015 at 8:34 AM, Mike  Dupont
<jamesmikedup...@googlemail.com> wrote:
> 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



-- 
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
Index: ltrace-0.7.3/printf.c
===================================================================
--- ltrace-0.7.3.orig/printf.c
+++ ltrace-0.7.3/printf.c
@@ -97,8 +97,8 @@ 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)
 {
        /* XXX note: Some types are wrong because we lack
           ARGTYPE_LONGLONG, ARGTYPE_UCHAR and ARGTYPE_SCHAR.  */
@@ -130,38 +130,5 @@ 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;
-               }
+               node = expr_node_zero();
+               own_node = 0;

                assert(node != NULL);
 
                type_init_array(array, elt_info, 0, node, own_node);
@@ -188,8 +183,6 @@ 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;
        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,6 @@ 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;
                        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;

Reply via email to