commit 723efdb

default  ·  2023-06-16 08:04:29 +0000 UTC
parent 1b1cb2d
Added some logging on corrupted md5 ids.
1 files changed,  +22, -7
M data.c
M data.c
+22, -7
 1@@ -543,10 +543,12 @@ xs_list *index_list_desc(const char *fn, int skip, int show)
 2 
 3 /** objects **/
 4 
 5-xs_str *_object_fn_by_md5(const char *md5)
 6+static xs_str *_object_fn_by_md5(const char *md5)
 7 {
 8-    if (!xs_is_hex(md5))
 9-        srv_log(xs_fmt("_object_fn_by_md5(): '%s' not hex", md5));
10+    if (!xs_is_hex(md5) || strlen(md5) != 32) {
11+        srv_log(xs_fmt("_object_fn_by_md5(): bad md5 '%s'", md5));
12+        return NULL;
13+    }
14 
15     xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]);
16 
17@@ -567,7 +569,7 @@ int object_here_by_md5(const char *id)
18 /* checks if an object is already downloaded */
19 {
20     xs *fn = _object_fn_by_md5(id);
21-    return mtime(fn) > 0.0;
22+    return fn && mtime(fn) > 0.0;
23 }
24 
25 
26@@ -586,6 +588,11 @@ int object_get_by_md5(const char *md5, xs_dict **obj)
27     xs *fn     = _object_fn_by_md5(md5);
28     FILE *f;
29 
30+    if (xs_is_null(fn)) {
31+        srv_log(xs_fmt("object_get_by_md5(): bad md5 '%s'", md5));
32+        return 500;
33+    }
34+
35     if ((f = fopen(fn, "r")) != NULL) {
36         flock(fileno(f), LOCK_SH);
37 
38@@ -689,6 +696,11 @@ int object_del_by_md5(const char *md5)
39     int status = 404;
40     xs *fn     = _object_fn_by_md5(md5);
41 
42+    if (xs_is_null(fn)) {
43+        srv_log(xs_fmt("object_del_by_md5(): bad md5 '%s'", md5));
44+        return 500;
45+    }
46+
47     if (unlink(fn) != -1) {
48         status = 200;
49 
50@@ -736,7 +748,7 @@ int object_del_if_unref(const char *id)
51 double object_ctime_by_md5(const char *md5)
52 {
53     xs *fn = _object_fn_by_md5(md5);
54-    return f_ctime(fn);
55+    return fn ? f_ctime(fn) : 0.0;
56 }
57 
58 
59@@ -793,10 +805,13 @@ xs_list *object_announces(const char *id)
60 }
61 
62 
63-int object_parent(const char *id, char *buf, int size)
64+int object_parent(const char *md5, char *buf, int size)
65 /* returns the object parent, if any */
66 {
67-    xs *fn = _object_fn_by_md5(id);
68+    xs *fn = _object_fn_by_md5(md5);
69+    if (xs_is_null(fn))
70+        return 0;
71+
72     fn = xs_replace_i(fn, ".json", "_p.idx");
73     return index_first(fn, buf, size);
74 }