commit 51ef347
default
·
2023-06-18 18:08:51 +0000 UTC
parent 551bf92
Added some more checks to _object_fn_by_md5().
1 files changed,
+17,
-26
M
data.c
M
data.c
+17,
-26
1@@ -545,18 +545,24 @@ xs_list *index_list_desc(const char *fn, int skip, int show)
2
3 static xs_str *_object_fn_by_md5(const char *md5, const char *func)
4 {
5- /* object deleted in an index; fail, but don't bark */
6- if (md5[0] == '-')
7- return NULL;
8+ xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]);
9+ int ok = 1;
10
11+ /* an object deleted from an index; fail but don't bark */
12+ if (md5[0] == '-')
13+ ok = 0;
14+ else
15 if (!xs_is_hex(md5) || strlen(md5) != 32) {
16 srv_log(xs_fmt("_object_fn_by_md5() [from %s()]: bad md5 '%s'", func, md5));
17- return NULL;
18+ ok = 0;
19 }
20
21- xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]);
22-
23- mkdirx(bfn);
24+ if (ok)
25+ mkdirx(bfn);
26+ else {
27+ xs_free(bfn);
28+ bfn = xs_fmt("%s/object/invalid", srv_basedir);
29+ }
30
31 return xs_fmt("%s/%s.json", bfn, md5);
32 }
33@@ -573,7 +579,7 @@ int object_here_by_md5(const char *id)
34 /* checks if an object is already downloaded */
35 {
36 xs *fn = _object_fn_by_md5(id, "object_here_by_md5");
37- return fn && mtime(fn) > 0.0;
38+ return mtime(fn) > 0.0;
39 }
40
41
42@@ -589,16 +595,9 @@ int object_get_by_md5(const char *md5, xs_dict **obj)
43 /* returns a stored object, optionally of the requested type */
44 {
45 int status = 404;
46- xs *fn = NULL;
47+ xs *fn = _object_fn_by_md5(md5, "object_get_my_md5");
48 FILE *f;
49
50- /* objects deleted in indexes start with - */
51- if (md5[0] == '-')
52- return status;
53-
54- if (xs_is_null((fn = _object_fn_by_md5(md5, "object_get_my_md5"))))
55- return 500;
56-
57 if ((f = fopen(fn, "r")) != NULL) {
58 flock(fileno(f), LOCK_SH);
59
60@@ -702,9 +701,6 @@ int object_del_by_md5(const char *md5)
61 int status = 404;
62 xs *fn = _object_fn_by_md5(md5, "object_del_by_md5");
63
64- if (xs_is_null(fn))
65- return 500;
66-
67 if (unlink(fn) != -1) {
68 status = 200;
69
70@@ -742,7 +738,7 @@ int object_del_if_unref(const char *id)
71 int n_links;
72 int ret = 0;
73
74- if (fn && mtime_nl(fn, &n_links) > 0.0 && n_links < 2)
75+ if (mtime_nl(fn, &n_links) > 0.0 && n_links < 2)
76 ret = object_del(id);
77
78 return ret;
79@@ -752,7 +748,7 @@ int object_del_if_unref(const char *id)
80 double object_ctime_by_md5(const char *md5)
81 {
82 xs *fn = _object_fn_by_md5(md5, "object_ctime_by_md5");
83- return fn ? f_ctime(fn) : 0.0;
84+ return f_ctime(fn);
85 }
86
87
88@@ -813,8 +809,6 @@ int object_parent(const char *md5, char *buf, int size)
89 /* returns the object parent, if any */
90 {
91 xs *fn = _object_fn_by_md5(md5, "object_parent");
92- if (xs_is_null(fn))
93- return 0;
94
95 fn = xs_replace_i(fn, ".json", "_p.idx");
96 return index_first(fn, buf, size);
97@@ -827,9 +821,6 @@ int object_admire(const char *id, const char *actor, int like)
98 int status = 200;
99 xs *fn = _object_fn(id, "object_admire");
100
101- if (xs_is_null(fn))
102- return 500;
103-
104 fn = xs_replace_i(fn, ".json", like ? "_l.idx" : "_a.idx");
105
106 if (!index_in(fn, actor)) {