diff options
| -rw-r--r-- | tools/perf/util/strbuf.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c index 3d1cf5bf7f18..9005fbe0780e 100644 --- a/tools/perf/util/strbuf.c +++ b/tools/perf/util/strbuf.c | |||
| @@ -98,19 +98,25 @@ static int strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap) | |||
| 98 | 98 | ||
| 99 | va_copy(ap_saved, ap); | 99 | va_copy(ap_saved, ap); |
| 100 | len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); | 100 | len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); |
| 101 | if (len < 0) | 101 | if (len < 0) { |
| 102 | va_end(ap_saved); | ||
| 102 | return len; | 103 | return len; |
| 104 | } | ||
| 103 | if (len > strbuf_avail(sb)) { | 105 | if (len > strbuf_avail(sb)) { |
| 104 | ret = strbuf_grow(sb, len); | 106 | ret = strbuf_grow(sb, len); |
| 105 | if (ret) | 107 | if (ret) { |
| 108 | va_end(ap_saved); | ||
| 106 | return ret; | 109 | return ret; |
| 110 | } | ||
| 107 | len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved); | 111 | len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved); |
| 108 | va_end(ap_saved); | 112 | va_end(ap_saved); |
| 109 | if (len > strbuf_avail(sb)) { | 113 | if (len > strbuf_avail(sb)) { |
| 110 | pr_debug("this should not happen, your vsnprintf is broken"); | 114 | pr_debug("this should not happen, your vsnprintf is broken"); |
| 115 | va_end(ap_saved); | ||
| 111 | return -EINVAL; | 116 | return -EINVAL; |
| 112 | } | 117 | } |
| 113 | } | 118 | } |
| 119 | va_end(ap_saved); | ||
| 114 | return strbuf_setlen(sb, sb->len + len); | 120 | return strbuf_setlen(sb, sb->len + len); |
| 115 | } | 121 | } |
| 116 | 122 | ||
