commit f13ff90
green
·
2026-03-17 16:18:11 +0000 UTC
parent b51c8f1
fix: more memory leaks
2 files changed,
+14,
-6
M
html.c
+13,
-5
1@@ -645,12 +645,13 @@ xs_list *recipient_list(snac *snac, const xs_dict *msg, int expand_public)
2
3 while (xs_list_iter(&l, &v)) {
4 if (expand_public) {
5+ xs *followers_url = xs_fmt("%s/followers", snac->actor);
6 if (strcmp(v, public_address) == 0 ||
7 /* check if it's a followers collection URL */
8 (xs_type(v) == XSTYPE_STRING &&
9- strcmp(v, xs_fmt("%s/followers", snac->actor)) == 0) ||
10+ strcmp(v, followers_url) == 0) ||
11 (xs_type(v) == XSTYPE_LIST &&
12- xs_list_in(v, xs_fmt("%s/followers", snac->actor)) != -1)) {
13+ xs_list_in(v, followers_url) != -1)) {
14 /* iterate the followers and add them */
15 xs *fwers = follower_list(snac);
16 const char *actor;
17@@ -1624,6 +1625,7 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o)
18 else if (*eid == '%') {
19 content = xs_url_dec_emoji(xs_dup(eid));
20 if (content == NULL) {
21+ xs_free(n_msg);
22 return NULL;
23 }
24 }
25@@ -1631,8 +1633,10 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o)
26 content = xs_fmt(":%s:", eid);
27 const char *emo = xs_dict_get(emjs, content);
28
29- if (emo == NULL)
30+ if (emo == NULL) {
31+ xs_free(n_msg);
32 return NULL;
33+ }
34
35 if (xs_match(emo, "https://*|http://*")) { /* emoji is an URL to an image */
36 icon = xs_dict_set(icon, "type", "Image");
37@@ -1667,9 +1671,10 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o)
38
39 accounts = xs_list_append(accounts, snac->actor);
40
41+ xs *to_duplicate = xs_dup(xs_list_get(xs_dict_get(n_msg, "to"), 1));
42 n_msg = xs_dict_set(n_msg, "content", content);
43 n_msg = xs_dict_set(n_msg, "accounts", accounts);
44- n_msg = xs_dict_set(n_msg, "attributedTo", xs_list_get(xs_dict_get(n_msg, "to"), 1));
45+ n_msg = xs_dict_set(n_msg, "attributedTo", to_duplicate);
46 n_msg = xs_dict_set(n_msg, "accountId", snac->uid);
47 n_msg = xs_dict_set(n_msg, "tag", tag);
48
49@@ -1679,6 +1684,7 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o)
50 return n_msg;
51 }
52
53+ xs_free(n_msg);
54 return NULL;
55 }
56
57@@ -1710,13 +1716,14 @@ xs_dict *msg_emoji_unreact(snac *user, const char *mid, const char *eid)
58 if (strlen(eid) == 12 && *eid == '%') {
59 eid = xs_url_dec(eid);
60 if (eid == NULL) {
61+ xs_free(msg);
62 return NULL;
63 }
64 }
65
66 /* lets get all emotes for this msg, and compare it to our content */
67 while (xs_list_next(emotes, &v, &c)) {
68- xs_dict *e = NULL;
69+ xs *e = NULL;
70 if (valid_status(object_get_by_md5(v, &e))) {
71 const char *content = xs_dict_get(e, "content");
72 const char *id = xs_dict_get(e, "id");
73@@ -1730,6 +1737,7 @@ xs_dict *msg_emoji_unreact(snac *user, const char *mid, const char *eid)
74 }
75 }
76
77+ xs_free(msg);
78 return NULL;
79 }
80
M
html.c
+1,
-1
1@@ -5572,7 +5572,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
2
3 eid = xs_strip_chars_i(eid, ":");
4
5- const xs_dict *ret = msg_emoji_init(&snac, id, eid);
6+ xs *ret = msg_emoji_init(&snac, id, eid);
7 /* fails if either invalid or already reacted */
8 if (!ret)
9 ret = msg_emoji_unreact(&snac, id, eid);