Thread (28 messages) flat view 28 messages, 3 authors, 2016-12-12

Re: [PATCH v8 18/19] branch: use ref-filter printing APIs

From: Karthik Nayak <hidden>
Date: 2016-12-12 11:20:56

On Fri, Dec 9, 2016 at 7:33 PM, Jeff King [off-list ref] wrote:
On Wed, Dec 07, 2016 at 09:06:26PM +0530, Karthik Nayak wrote:
quoted
+const char *quote_literal_for_format(const char *s)
 {
+     struct strbuf buf = STRBUF_INIT;

+     strbuf_reset(&buf);
+     while (*s) {
+             const char *ep = strchrnul(s, '%');
+             if (s < ep)
+                     strbuf_add(&buf, s, ep - s);
+             if (*ep == '%') {
+                     strbuf_addstr(&buf, "%%");
+                     s = ep + 1;
+             } else {
+                     s = ep;
+             }
      }
+     return buf.buf;
 }
You should use strbuf_detach() to return the buffer from a strbuf.
Otherwise it is undefined whether the pointer is allocated or not (and
whether it needs to be freed).

In this case, if "s" is empty, buf.buf would point to a string literal,
but otherwise to allocated memory. strbuf_detach() normalizes that.

But...
quoted
+                         branch_get_color(BRANCH_COLOR_REMOTE), maxwidth, quote_literal_for_format(remote_prefix),
This caller never stores the return value, and it ends up leaking. So I
wonder if you wanted "static struct strbuf" in the first place (and that
would explain the strbuf_reset() in your function).

-Peff
Ah! Yes this should be 'static struct strbuf' indeed, I blindly copied Junio's
suggestion.

strbuf_detach() is also a better way to go.

Thanks.

-- 
Regards,
Karthik Nayak
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help