Rather, send them a patch to fix it.... what was I thinking.  :)

In any event, don't break OpenOCD's perfectly acceptable code.

On Mon, 2009-11-30 at 02:28 -0800, Zach Welch wrote:
> The proper solution: tell the maintainers of your vsnprintf to improve
> their implementation! ;) --Z
> 
> On Mon, 2009-11-30 at 02:20 -0800, Zach Welch wrote:
> > Do not apply.  The old implementation was total crap, and your vsnprintf
> > implementation must be too.  That's not our problem, and it can be
> > worked around without destroying the improvements for others.
> > 
> > Use a single 'char' on the stack.  One character should be enough.
> > 
> > --Z
> > 
> > On Mon, 2009-11-30 at 10:16 +0100, Øyvind Harboe wrote:
> > > Whether or not vsnprintf() allows NULL as pointer to destination
> > > string to calculate length depends on the implementation.
> > > 
> > > Revert more efficient, but non-portable implementation.
> > > 
> > > This reverts commit 338a674faa96ae321560efa3f1b1e8122d61aac4.
> > > ---
> > >  src/helper/log.c |   43 +++++++++++++++++++++++++++----------------
> > >  1 files changed, 27 insertions(+), 16 deletions(-)
> > > 
> > > diff --git a/src/helper/log.c b/src/helper/log.c
> > > index 3067ecc..f1aa6d7 100644
> > > --- a/src/helper/log.c
> > > +++ b/src/helper/log.c
> > > @@ -417,26 +417,37 @@ int log_remove_callback(log_callback_fn fn, void 
> > > *priv)
> > >  /* return allocated string w/printf() result */
> > >  char *alloc_vprintf(const char *fmt, va_list ap)
> > >  {
> > > - va_list ap_copy;
> > > - int len;
> > > - char *string;
> > > + /* no buffer at the beginning, force realloc to do the job */
> > > + char *string = NULL;
> > >  
> > > - /* determine the length of the buffer needed */
> > > - va_copy(ap_copy, ap);
> > > - len = vsnprintf(NULL, 0, fmt, ap_copy);
> > > - va_end(ap_copy);
> > > + /* start with buffer size suitable for typical messages */
> > > + int size = 128;
> > >  
> > > - /* allocate and make room for terminating zero. */
> > > - /* FIXME: The old version always allocated at least one byte extra and
> > > -  * other code depend on that. They should be probably be fixed, but for
> > > -  * now reserve the extra byte. */
> > > - string = malloc(len + 2);
> > > - if (string == NULL)
> > > -         return NULL;
> > > + for (;;)
> > > + {
> > > +         char *t = string;
> > > +         va_list ap_copy;
> > > +         int ret;
> > > +         string = realloc(string, size);
> > > +         if (string == NULL)
> > > +         {
> > > +                 if (t != NULL)
> > > +                         free(t);
> > > +                 return NULL;
> > > +         }
> > >  
> > > - /* do the real work */
> > > - vsnprintf(string, len + 1, fmt, ap);
> > > +         va_copy(ap_copy, ap);
> > > +
> > > +         ret = vsnprintf(string, size, fmt, ap_copy);
> > > +         /* NB! The result of the vsnprintf() might be an *EMPTY* 
> > > string! */
> > > +         if ((ret >= 0) && ((ret + 1) < size))
> > > +                 break;
> > > +
> > > +         /* there was just enough or not enough space, allocate more in 
> > > the next round */
> > > +         size *= 2; /* double the buffer size */
> > > + }
> > >  
> > > + /* the returned buffer is by principle guaranteed to be at least one 
> > > character longer */
> > >   return string;
> > >  }
> > >  
> > 
> > 
> > _______________________________________________
> > Openocd-development mailing list
> > Openocd-development@lists.berlios.de
> > https://lists.berlios.de/mailman/listinfo/openocd-development
> 
> 
> _______________________________________________
> Openocd-development mailing list
> Openocd-development@lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/openocd-development


_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to