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)) {