diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/probe-event.c | 246 | ||||
-rw-r--r-- | tools/perf/util/probe-event.h | 2 | ||||
-rw-r--r-- | tools/perf/util/probe-finder.c | 14 |
3 files changed, 93 insertions, 169 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index a9774628c6f6..85d82f4dc5e9 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -1673,69 +1673,51 @@ out: | |||
1673 | } | 1673 | } |
1674 | 1674 | ||
1675 | /* Compose only probe arg */ | 1675 | /* Compose only probe arg */ |
1676 | int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len) | 1676 | char *synthesize_perf_probe_arg(struct perf_probe_arg *pa) |
1677 | { | 1677 | { |
1678 | struct perf_probe_arg_field *field = pa->field; | 1678 | struct perf_probe_arg_field *field = pa->field; |
1679 | int ret; | 1679 | struct strbuf buf; |
1680 | char *tmp = buf; | 1680 | char *ret; |
1681 | 1681 | ||
1682 | strbuf_init(&buf, 64); | ||
1682 | if (pa->name && pa->var) | 1683 | if (pa->name && pa->var) |
1683 | ret = e_snprintf(tmp, len, "%s=%s", pa->name, pa->var); | 1684 | strbuf_addf(&buf, "%s=%s", pa->name, pa->var); |
1684 | else | 1685 | else |
1685 | ret = e_snprintf(tmp, len, "%s", pa->name ? pa->name : pa->var); | 1686 | strbuf_addstr(&buf, pa->name ?: pa->var); |
1686 | if (ret <= 0) | ||
1687 | goto error; | ||
1688 | tmp += ret; | ||
1689 | len -= ret; | ||
1690 | 1687 | ||
1691 | while (field) { | 1688 | while (field) { |
1692 | if (field->name[0] == '[') | 1689 | if (field->name[0] == '[') |
1693 | ret = e_snprintf(tmp, len, "%s", field->name); | 1690 | strbuf_addstr(&buf, field->name); |
1694 | else | 1691 | else |
1695 | ret = e_snprintf(tmp, len, "%s%s", | 1692 | strbuf_addf(&buf, "%s%s", field->ref ? "->" : ".", |
1696 | field->ref ? "->" : ".", field->name); | 1693 | field->name); |
1697 | if (ret <= 0) | ||
1698 | goto error; | ||
1699 | tmp += ret; | ||
1700 | len -= ret; | ||
1701 | field = field->next; | 1694 | field = field->next; |
1702 | } | 1695 | } |
1703 | 1696 | ||
1704 | if (pa->type) { | 1697 | if (pa->type) |
1705 | ret = e_snprintf(tmp, len, ":%s", pa->type); | 1698 | strbuf_addf(&buf, ":%s", pa->type); |
1706 | if (ret <= 0) | 1699 | |
1707 | goto error; | 1700 | ret = strbuf_detach(&buf, NULL); |
1708 | tmp += ret; | ||
1709 | len -= ret; | ||
1710 | } | ||
1711 | 1701 | ||
1712 | return tmp - buf; | ||
1713 | error: | ||
1714 | pr_debug("Failed to synthesize perf probe argument: %d\n", ret); | ||
1715 | return ret; | 1702 | return ret; |
1716 | } | 1703 | } |
1717 | 1704 | ||
1718 | /* Compose only probe point (not argument) */ | 1705 | /* Compose only probe point (not argument) */ |
1719 | static char *synthesize_perf_probe_point(struct perf_probe_point *pp) | 1706 | static char *synthesize_perf_probe_point(struct perf_probe_point *pp) |
1720 | { | 1707 | { |
1721 | char *buf, *tmp; | 1708 | struct strbuf buf; |
1722 | char offs[32] = "", line[32] = "", file[32] = ""; | 1709 | char *tmp; |
1723 | int ret, len; | 1710 | int len; |
1724 | 1711 | ||
1725 | buf = zalloc(MAX_CMDLEN); | 1712 | strbuf_init(&buf, 64); |
1726 | if (buf == NULL) { | 1713 | if (pp->function) { |
1727 | ret = -ENOMEM; | 1714 | strbuf_addstr(&buf, pp->function); |
1728 | goto error; | 1715 | if (pp->offset) |
1729 | } | 1716 | strbuf_addf(&buf, "+%lu", pp->offset); |
1730 | if (pp->offset) { | 1717 | else if (pp->line) |
1731 | ret = e_snprintf(offs, 32, "+%lu", pp->offset); | 1718 | strbuf_addf(&buf, ":%d", pp->line); |
1732 | if (ret <= 0) | 1719 | else if (pp->retprobe) |
1733 | goto error; | 1720 | strbuf_addstr(&buf, "%return"); |
1734 | } | ||
1735 | if (pp->line) { | ||
1736 | ret = e_snprintf(line, 32, ":%d", pp->line); | ||
1737 | if (ret <= 0) | ||
1738 | goto error; | ||
1739 | } | 1721 | } |
1740 | if (pp->file) { | 1722 | if (pp->file) { |
1741 | tmp = pp->file; | 1723 | tmp = pp->file; |
@@ -1744,25 +1726,12 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp) | |||
1744 | tmp = strchr(pp->file + len - 30, '/'); | 1726 | tmp = strchr(pp->file + len - 30, '/'); |
1745 | tmp = tmp ? tmp + 1 : pp->file + len - 30; | 1727 | tmp = tmp ? tmp + 1 : pp->file + len - 30; |
1746 | } | 1728 | } |
1747 | ret = e_snprintf(file, 32, "@%s", tmp); | 1729 | strbuf_addf(&buf, "@%s", tmp); |
1748 | if (ret <= 0) | 1730 | if (!pp->function && pp->line) |
1749 | goto error; | 1731 | strbuf_addf(&buf, ":%d", pp->line); |
1750 | } | 1732 | } |
1751 | 1733 | ||
1752 | if (pp->function) | 1734 | return strbuf_detach(&buf, NULL); |
1753 | ret = e_snprintf(buf, MAX_CMDLEN, "%s%s%s%s%s", pp->function, | ||
1754 | offs, pp->retprobe ? "%return" : "", line, | ||
1755 | file); | ||
1756 | else | ||
1757 | ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", file, line); | ||
1758 | if (ret <= 0) | ||
1759 | goto error; | ||
1760 | |||
1761 | return buf; | ||
1762 | error: | ||
1763 | pr_debug("Failed to synthesize perf probe point: %d\n", ret); | ||
1764 | free(buf); | ||
1765 | return NULL; | ||
1766 | } | 1735 | } |
1767 | 1736 | ||
1768 | #if 0 | 1737 | #if 0 |
@@ -1791,45 +1760,30 @@ char *synthesize_perf_probe_command(struct perf_probe_event *pev) | |||
1791 | #endif | 1760 | #endif |
1792 | 1761 | ||
1793 | static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref, | 1762 | static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref, |
1794 | char **buf, size_t *buflen, | 1763 | struct strbuf *buf, int depth) |
1795 | int depth) | ||
1796 | { | 1764 | { |
1797 | int ret; | ||
1798 | if (ref->next) { | 1765 | if (ref->next) { |
1799 | depth = __synthesize_probe_trace_arg_ref(ref->next, buf, | 1766 | depth = __synthesize_probe_trace_arg_ref(ref->next, buf, |
1800 | buflen, depth + 1); | 1767 | depth + 1); |
1801 | if (depth < 0) | 1768 | if (depth < 0) |
1802 | goto out; | 1769 | goto out; |
1803 | } | 1770 | } |
1804 | 1771 | strbuf_addf(buf, "%+ld(", ref->offset); | |
1805 | ret = e_snprintf(*buf, *buflen, "%+ld(", ref->offset); | ||
1806 | if (ret < 0) | ||
1807 | depth = ret; | ||
1808 | else { | ||
1809 | *buf += ret; | ||
1810 | *buflen -= ret; | ||
1811 | } | ||
1812 | out: | 1772 | out: |
1813 | return depth; | 1773 | return depth; |
1814 | |||
1815 | } | 1774 | } |
1816 | 1775 | ||
1817 | static int synthesize_probe_trace_arg(struct probe_trace_arg *arg, | 1776 | static int synthesize_probe_trace_arg(struct probe_trace_arg *arg, |
1818 | char *buf, size_t buflen) | 1777 | struct strbuf *buf) |
1819 | { | 1778 | { |
1820 | struct probe_trace_arg_ref *ref = arg->ref; | 1779 | struct probe_trace_arg_ref *ref = arg->ref; |
1821 | int ret, depth = 0; | 1780 | int depth = 0; |
1822 | char *tmp = buf; | ||
1823 | 1781 | ||
1824 | /* Argument name or separator */ | 1782 | /* Argument name or separator */ |
1825 | if (arg->name) | 1783 | if (arg->name) |
1826 | ret = e_snprintf(buf, buflen, " %s=", arg->name); | 1784 | strbuf_addf(buf, " %s=", arg->name); |
1827 | else | 1785 | else |
1828 | ret = e_snprintf(buf, buflen, " "); | 1786 | strbuf_addch(buf, ' '); |
1829 | if (ret < 0) | ||
1830 | return ret; | ||
1831 | buf += ret; | ||
1832 | buflen -= ret; | ||
1833 | 1787 | ||
1834 | /* Special case: @XXX */ | 1788 | /* Special case: @XXX */ |
1835 | if (arg->value[0] == '@' && arg->ref) | 1789 | if (arg->value[0] == '@' && arg->ref) |
@@ -1837,60 +1791,41 @@ static int synthesize_probe_trace_arg(struct probe_trace_arg *arg, | |||
1837 | 1791 | ||
1838 | /* Dereferencing arguments */ | 1792 | /* Dereferencing arguments */ |
1839 | if (ref) { | 1793 | if (ref) { |
1840 | depth = __synthesize_probe_trace_arg_ref(ref, &buf, | 1794 | depth = __synthesize_probe_trace_arg_ref(ref, buf, 1); |
1841 | &buflen, 1); | ||
1842 | if (depth < 0) | 1795 | if (depth < 0) |
1843 | return depth; | 1796 | return depth; |
1844 | } | 1797 | } |
1845 | 1798 | ||
1846 | /* Print argument value */ | 1799 | /* Print argument value */ |
1847 | if (arg->value[0] == '@' && arg->ref) | 1800 | if (arg->value[0] == '@' && arg->ref) |
1848 | ret = e_snprintf(buf, buflen, "%s%+ld", arg->value, | 1801 | strbuf_addf(buf, "%s%+ld", arg->value, arg->ref->offset); |
1849 | arg->ref->offset); | ||
1850 | else | 1802 | else |
1851 | ret = e_snprintf(buf, buflen, "%s", arg->value); | 1803 | strbuf_addstr(buf, arg->value); |
1852 | if (ret < 0) | ||
1853 | return ret; | ||
1854 | buf += ret; | ||
1855 | buflen -= ret; | ||
1856 | 1804 | ||
1857 | /* Closing */ | 1805 | /* Closing */ |
1858 | while (depth--) { | 1806 | while (depth--) |
1859 | ret = e_snprintf(buf, buflen, ")"); | 1807 | strbuf_addch(buf, ')'); |
1860 | if (ret < 0) | ||
1861 | return ret; | ||
1862 | buf += ret; | ||
1863 | buflen -= ret; | ||
1864 | } | ||
1865 | /* Print argument type */ | 1808 | /* Print argument type */ |
1866 | if (arg->type) { | 1809 | if (arg->type) |
1867 | ret = e_snprintf(buf, buflen, ":%s", arg->type); | 1810 | strbuf_addf(buf, ":%s", arg->type); |
1868 | if (ret <= 0) | ||
1869 | return ret; | ||
1870 | buf += ret; | ||
1871 | } | ||
1872 | 1811 | ||
1873 | return buf - tmp; | 1812 | return 0; |
1874 | } | 1813 | } |
1875 | 1814 | ||
1876 | char *synthesize_probe_trace_command(struct probe_trace_event *tev) | 1815 | char *synthesize_probe_trace_command(struct probe_trace_event *tev) |
1877 | { | 1816 | { |
1878 | struct probe_trace_point *tp = &tev->point; | 1817 | struct probe_trace_point *tp = &tev->point; |
1879 | char *buf; | 1818 | struct strbuf buf; |
1880 | int i, len, ret; | 1819 | char *ret = NULL; |
1881 | 1820 | int i; | |
1882 | buf = zalloc(MAX_CMDLEN); | ||
1883 | if (buf == NULL) | ||
1884 | return NULL; | ||
1885 | |||
1886 | len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s ", tp->retprobe ? 'r' : 'p', | ||
1887 | tev->group, tev->event); | ||
1888 | if (len <= 0) | ||
1889 | goto error; | ||
1890 | 1821 | ||
1891 | /* Uprobes must have tp->module */ | 1822 | /* Uprobes must have tp->module */ |
1892 | if (tev->uprobes && !tp->module) | 1823 | if (tev->uprobes && !tp->module) |
1893 | goto error; | 1824 | return NULL; |
1825 | |||
1826 | strbuf_init(&buf, 32); | ||
1827 | strbuf_addf(&buf, "%c:%s/%s ", tp->retprobe ? 'r' : 'p', | ||
1828 | tev->group, tev->event); | ||
1894 | /* | 1829 | /* |
1895 | * If tp->address == 0, then this point must be a | 1830 | * If tp->address == 0, then this point must be a |
1896 | * absolute address uprobe. | 1831 | * absolute address uprobe. |
@@ -1904,34 +1839,23 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev) | |||
1904 | 1839 | ||
1905 | /* Use the tp->address for uprobes */ | 1840 | /* Use the tp->address for uprobes */ |
1906 | if (tev->uprobes) | 1841 | if (tev->uprobes) |
1907 | ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s:0x%lx", | 1842 | strbuf_addf(&buf, "%s:0x%lx", tp->module, tp->address); |
1908 | tp->module, tp->address); | ||
1909 | else if (!strncmp(tp->symbol, "0x", 2)) | 1843 | else if (!strncmp(tp->symbol, "0x", 2)) |
1910 | /* Absolute address. See try_to_find_absolute_address() */ | 1844 | /* Absolute address. See try_to_find_absolute_address() */ |
1911 | ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s0x%lx", | 1845 | strbuf_addf(&buf, "%s%s0x%lx", tp->module ?: "", |
1912 | tp->module ?: "", tp->module ? ":" : "", | 1846 | tp->module ? ":" : "", tp->address); |
1913 | tp->address); | ||
1914 | else | 1847 | else |
1915 | ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s%s+%lu", | 1848 | strbuf_addf(&buf, "%s%s%s+%lu", tp->module ?: "", |
1916 | tp->module ?: "", tp->module ? ":" : "", | 1849 | tp->module ? ":" : "", tp->symbol, tp->offset); |
1917 | tp->symbol, tp->offset); | ||
1918 | |||
1919 | if (ret <= 0) | ||
1920 | goto error; | ||
1921 | len += ret; | ||
1922 | 1850 | ||
1923 | for (i = 0; i < tev->nargs; i++) { | 1851 | for (i = 0; i < tev->nargs; i++) |
1924 | ret = synthesize_probe_trace_arg(&tev->args[i], buf + len, | 1852 | if (synthesize_probe_trace_arg(&tev->args[i], &buf) < 0) |
1925 | MAX_CMDLEN - len); | ||
1926 | if (ret <= 0) | ||
1927 | goto error; | 1853 | goto error; |
1928 | len += ret; | ||
1929 | } | ||
1930 | 1854 | ||
1931 | return buf; | 1855 | ret = strbuf_detach(&buf, NULL); |
1932 | error: | 1856 | error: |
1933 | free(buf); | 1857 | strbuf_release(&buf); |
1934 | return NULL; | 1858 | return ret; |
1935 | } | 1859 | } |
1936 | 1860 | ||
1937 | static int find_perf_probe_point_from_map(struct probe_trace_point *tp, | 1861 | static int find_perf_probe_point_from_map(struct probe_trace_point *tp, |
@@ -2013,7 +1937,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp, | |||
2013 | static int convert_to_perf_probe_event(struct probe_trace_event *tev, | 1937 | static int convert_to_perf_probe_event(struct probe_trace_event *tev, |
2014 | struct perf_probe_event *pev, bool is_kprobe) | 1938 | struct perf_probe_event *pev, bool is_kprobe) |
2015 | { | 1939 | { |
2016 | char buf[64] = ""; | 1940 | struct strbuf buf = STRBUF_INIT; |
2017 | int i, ret; | 1941 | int i, ret; |
2018 | 1942 | ||
2019 | /* Convert event/group name */ | 1943 | /* Convert event/group name */ |
@@ -2036,9 +1960,9 @@ static int convert_to_perf_probe_event(struct probe_trace_event *tev, | |||
2036 | if (tev->args[i].name) | 1960 | if (tev->args[i].name) |
2037 | pev->args[i].name = strdup(tev->args[i].name); | 1961 | pev->args[i].name = strdup(tev->args[i].name); |
2038 | else { | 1962 | else { |
2039 | ret = synthesize_probe_trace_arg(&tev->args[i], | 1963 | strbuf_init(&buf, 32); |
2040 | buf, 64); | 1964 | ret = synthesize_probe_trace_arg(&tev->args[i], &buf); |
2041 | pev->args[i].name = strdup(buf); | 1965 | pev->args[i].name = strbuf_detach(&buf, NULL); |
2042 | } | 1966 | } |
2043 | if (pev->args[i].name == NULL && ret >= 0) | 1967 | if (pev->args[i].name == NULL && ret >= 0) |
2044 | ret = -ENOMEM; | 1968 | ret = -ENOMEM; |
@@ -2216,37 +2140,37 @@ static int perf_probe_event__sprintf(const char *group, const char *event, | |||
2216 | const char *module, | 2140 | const char *module, |
2217 | struct strbuf *result) | 2141 | struct strbuf *result) |
2218 | { | 2142 | { |
2219 | int i, ret; | 2143 | int i; |
2220 | char buf[128]; | 2144 | char *buf; |
2221 | char *place; | ||
2222 | 2145 | ||
2223 | /* Synthesize only event probe point */ | 2146 | if (asprintf(&buf, "%s:%s", group, event) < 0) |
2224 | place = synthesize_perf_probe_point(&pev->point); | 2147 | return -errno; |
2225 | if (!place) | 2148 | strbuf_addf(result, " %-20s (on ", buf); |
2226 | return -EINVAL; | 2149 | free(buf); |
2227 | 2150 | ||
2228 | ret = e_snprintf(buf, 128, "%s:%s", group, event); | 2151 | /* Synthesize only event probe point */ |
2229 | if (ret < 0) | 2152 | buf = synthesize_perf_probe_point(&pev->point); |
2230 | goto out; | 2153 | if (!buf) |
2154 | return -ENOMEM; | ||
2155 | strbuf_addstr(result, buf); | ||
2156 | free(buf); | ||
2231 | 2157 | ||
2232 | strbuf_addf(result, " %-20s (on %s", buf, place); | ||
2233 | if (module) | 2158 | if (module) |
2234 | strbuf_addf(result, " in %s", module); | 2159 | strbuf_addf(result, " in %s", module); |
2235 | 2160 | ||
2236 | if (pev->nargs > 0) { | 2161 | if (pev->nargs > 0) { |
2237 | strbuf_add(result, " with", 5); | 2162 | strbuf_add(result, " with", 5); |
2238 | for (i = 0; i < pev->nargs; i++) { | 2163 | for (i = 0; i < pev->nargs; i++) { |
2239 | ret = synthesize_perf_probe_arg(&pev->args[i], | 2164 | buf = synthesize_perf_probe_arg(&pev->args[i]); |
2240 | buf, 128); | 2165 | if (!buf) |
2241 | if (ret < 0) | 2166 | return -ENOMEM; |
2242 | goto out; | ||
2243 | strbuf_addf(result, " %s", buf); | 2167 | strbuf_addf(result, " %s", buf); |
2168 | free(buf); | ||
2244 | } | 2169 | } |
2245 | } | 2170 | } |
2246 | strbuf_addch(result, ')'); | 2171 | strbuf_addch(result, ')'); |
2247 | out: | 2172 | |
2248 | free(place); | 2173 | return 0; |
2249 | return ret; | ||
2250 | } | 2174 | } |
2251 | 2175 | ||
2252 | /* Show an event */ | 2176 | /* Show an event */ |
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index e54e7b011577..e2209623f981 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h | |||
@@ -120,7 +120,7 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev); | |||
120 | /* Events to command string */ | 120 | /* Events to command string */ |
121 | char *synthesize_perf_probe_command(struct perf_probe_event *pev); | 121 | char *synthesize_perf_probe_command(struct perf_probe_event *pev); |
122 | char *synthesize_probe_trace_command(struct probe_trace_event *tev); | 122 | char *synthesize_probe_trace_command(struct probe_trace_event *tev); |
123 | int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len); | 123 | char *synthesize_perf_probe_arg(struct perf_probe_arg *pa); |
124 | 124 | ||
125 | /* Check the perf_probe_event needs debuginfo */ | 125 | /* Check the perf_probe_event needs debuginfo */ |
126 | bool perf_probe_event_need_dwarf(struct perf_probe_event *pev); | 126 | bool perf_probe_event_need_dwarf(struct perf_probe_event *pev); |
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index b3bd0fba0237..9f688758b000 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c | |||
@@ -553,7 +553,7 @@ static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) | |||
553 | static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf) | 553 | static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf) |
554 | { | 554 | { |
555 | Dwarf_Die vr_die; | 555 | Dwarf_Die vr_die; |
556 | char buf[32], *ptr; | 556 | char *buf, *ptr; |
557 | int ret = 0; | 557 | int ret = 0; |
558 | 558 | ||
559 | /* Copy raw parameters */ | 559 | /* Copy raw parameters */ |
@@ -563,13 +563,13 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf) | |||
563 | if (pf->pvar->name) | 563 | if (pf->pvar->name) |
564 | pf->tvar->name = strdup(pf->pvar->name); | 564 | pf->tvar->name = strdup(pf->pvar->name); |
565 | else { | 565 | else { |
566 | ret = synthesize_perf_probe_arg(pf->pvar, buf, 32); | 566 | buf = synthesize_perf_probe_arg(pf->pvar); |
567 | if (ret < 0) | 567 | if (!buf) |
568 | return ret; | 568 | return -ENOMEM; |
569 | ptr = strchr(buf, ':'); /* Change type separator to _ */ | 569 | ptr = strchr(buf, ':'); /* Change type separator to _ */ |
570 | if (ptr) | 570 | if (ptr) |
571 | *ptr = '_'; | 571 | *ptr = '_'; |
572 | pf->tvar->name = strdup(buf); | 572 | pf->tvar->name = buf; |
573 | } | 573 | } |
574 | if (pf->tvar->name == NULL) | 574 | if (pf->tvar->name == NULL) |
575 | return -ENOMEM; | 575 | return -ENOMEM; |
@@ -1334,8 +1334,8 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data) | |||
1334 | if (ret2 == 0) { | 1334 | if (ret2 == 0) { |
1335 | strlist__add(vl->vars, | 1335 | strlist__add(vl->vars, |
1336 | strbuf_detach(&buf, NULL)); | 1336 | strbuf_detach(&buf, NULL)); |
1337 | } | 1337 | } else |
1338 | strbuf_release(&buf); | 1338 | strbuf_release(&buf); |
1339 | } | 1339 | } |
1340 | } | 1340 | } |
1341 | 1341 | ||