Hi no problems it is not a bugfix at all, usually just better to copy a const char instead of casting it in this sort of situation. Nothing else.
Best regards. On 28 February 2016 at 22:58, Willy Tarreau <w...@1wt.eu> wrote: > Hi David, > > Sorry for the delay, but each time I looked at it I started to scratch my > head wondering about the real purpose of the change and/or the reason for > the current code currently being that way. > > On Thu, Feb 18, 2016 at 09:58:49PM +0000, David CARLIER wrote: > > HI all, > > > > There is a tiny patch proposal for the log component. > > > From f1924d813f37cd6444d9251605fdd823efb7fe20 Mon Sep 17 00:00:00 2001 > From: David Carlier <devne...@gmail.com> > Date: Thu, 18 Feb 2016 21:46:48 +0000 > Subject: [PATCH] CLEANUP: log > > The string to be escaped is not marked at const, > and it would be safer to copy instead of casting. > > --- > src/log.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/src/log.c b/src/log.c > index 3e25bc7..94864e1 100644 > --- a/src/log.c > +++ b/src/log.c > @@ -831,13 +831,19 @@ char *lf_text_len(char *dst, const char *src, size_t > len, size_t size, struct lo > if (src && len) { > if (node->options & LOG_OPT_ESC) { > struct chunk chunk; > - char *ret; > + char *ret, *ssrc; > > - chunk_initlen(&chunk, (char *)src, 0, len); > + ssrc = my_strndup(src, len); > + if (ssrc == NULL) > + return NULL; > + chunk_initlen(&chunk, ssrc, 0, len); > ret = escape_chunk(dst, dst + size, '\\', > rfc5424_escape_map, &chunk); > - if (ret == NULL || *ret != '\0') > + if (ret == NULL || *ret != '\0') { > + chunk_destroy(&chunk); > return NULL; > + } > len = ret - dst; > + chunk_destroy(&chunk); > } > else { > if (++len > size) > > We cannot afford to call strndup() for each log element to be escaped, it > adds too much overhead, it performs a malloc()! I'd suggest two approaches > (I haven't looked at the calling places) : > - either you simply use another chunk as a temporary holder for that > part ; > - or we check if it's acceptable to change the const char* for a char * > in the argument and expect the caller to have a R/W buffer itself. > > Hmmm just thinking about it, it looks like we don't modify src anyway here, > so it's even more overkill to strdup() something we're not going to change. > > Thus I'd rather go for something much cleaner : let's add a new function > "chunk_initlen_const()" to chunk.h taking a const char* and a length, and > performing the cast itself, as well as leaving the size to zero (so that > we can't modify the contents). Then you just have to make use of it in the > function above and the problem is gone. It's possible that other cases > exist as well by the way. > > Best regards, > Willy > >