diff options
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 29 |
1 files changed, 22 insertions, 7 deletions
| @@ -543,10 +543,12 @@ xs_list *index_list_desc(const char *fn, int skip, int show) | |||
| 543 | 543 | ||
| 544 | /** objects **/ | 544 | /** objects **/ |
| 545 | 545 | ||
| 546 | xs_str *_object_fn_by_md5(const char *md5) | 546 | static xs_str *_object_fn_by_md5(const char *md5) |
| 547 | { | 547 | { |
| 548 | if (!xs_is_hex(md5)) | 548 | if (!xs_is_hex(md5) || strlen(md5) != 32) { |
| 549 | srv_log(xs_fmt("_object_fn_by_md5(): '%s' not hex", md5)); | 549 | srv_log(xs_fmt("_object_fn_by_md5(): bad md5 '%s'", md5)); |
| 550 | return NULL; | ||
| 551 | } | ||
| 550 | 552 | ||
| 551 | xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]); | 553 | xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]); |
| 552 | 554 | ||
| @@ -567,7 +569,7 @@ int object_here_by_md5(const char *id) | |||
| 567 | /* checks if an object is already downloaded */ | 569 | /* checks if an object is already downloaded */ |
| 568 | { | 570 | { |
| 569 | xs *fn = _object_fn_by_md5(id); | 571 | xs *fn = _object_fn_by_md5(id); |
| 570 | return mtime(fn) > 0.0; | 572 | return fn && mtime(fn) > 0.0; |
| 571 | } | 573 | } |
| 572 | 574 | ||
| 573 | 575 | ||
| @@ -586,6 +588,11 @@ int object_get_by_md5(const char *md5, xs_dict **obj) | |||
| 586 | xs *fn = _object_fn_by_md5(md5); | 588 | xs *fn = _object_fn_by_md5(md5); |
| 587 | FILE *f; | 589 | FILE *f; |
| 588 | 590 | ||
| 591 | if (xs_is_null(fn)) { | ||
| 592 | srv_log(xs_fmt("object_get_by_md5(): bad md5 '%s'", md5)); | ||
| 593 | return 500; | ||
| 594 | } | ||
| 595 | |||
| 589 | if ((f = fopen(fn, "r")) != NULL) { | 596 | if ((f = fopen(fn, "r")) != NULL) { |
| 590 | flock(fileno(f), LOCK_SH); | 597 | flock(fileno(f), LOCK_SH); |
| 591 | 598 | ||
| @@ -689,6 +696,11 @@ int object_del_by_md5(const char *md5) | |||
| 689 | int status = 404; | 696 | int status = 404; |
| 690 | xs *fn = _object_fn_by_md5(md5); | 697 | xs *fn = _object_fn_by_md5(md5); |
| 691 | 698 | ||
| 699 | if (xs_is_null(fn)) { | ||
| 700 | srv_log(xs_fmt("object_del_by_md5(): bad md5 '%s'", md5)); | ||
| 701 | return 500; | ||
| 702 | } | ||
| 703 | |||
| 692 | if (unlink(fn) != -1) { | 704 | if (unlink(fn) != -1) { |
| 693 | status = 200; | 705 | status = 200; |
| 694 | 706 | ||
| @@ -736,7 +748,7 @@ int object_del_if_unref(const char *id) | |||
| 736 | double object_ctime_by_md5(const char *md5) | 748 | double object_ctime_by_md5(const char *md5) |
| 737 | { | 749 | { |
| 738 | xs *fn = _object_fn_by_md5(md5); | 750 | xs *fn = _object_fn_by_md5(md5); |
| 739 | return f_ctime(fn); | 751 | return fn ? f_ctime(fn) : 0.0; |
| 740 | } | 752 | } |
| 741 | 753 | ||
| 742 | 754 | ||
| @@ -793,10 +805,13 @@ xs_list *object_announces(const char *id) | |||
| 793 | } | 805 | } |
| 794 | 806 | ||
| 795 | 807 | ||
| 796 | int object_parent(const char *id, char *buf, int size) | 808 | int object_parent(const char *md5, char *buf, int size) |
| 797 | /* returns the object parent, if any */ | 809 | /* returns the object parent, if any */ |
| 798 | { | 810 | { |
| 799 | xs *fn = _object_fn_by_md5(id); | 811 | xs *fn = _object_fn_by_md5(md5); |
| 812 | if (xs_is_null(fn)) | ||
| 813 | return 0; | ||
| 814 | |||
| 800 | fn = xs_replace_i(fn, ".json", "_p.idx"); | 815 | fn = xs_replace_i(fn, ".json", "_p.idx"); |
| 801 | return index_first(fn, buf, size); | 816 | return index_first(fn, buf, size); |
| 802 | } | 817 | } |