has_cachedir_tag: Keep statuc allocated buffer for paths.
Этот коммит содержится в:
родитель
4a6efeba3d
Коммит
dc316e26f5
@ -108,18 +108,29 @@ void exclude_clear() {
|
|||||||
#define CACHEDIR_TAG_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
|
#define CACHEDIR_TAG_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
|
||||||
|
|
||||||
int has_cachedir_tag(const char *name) {
|
int has_cachedir_tag(const char *name) {
|
||||||
int path_l;
|
static path_l = 1024;
|
||||||
char *path;
|
static char *path = NULL;
|
||||||
|
int l;
|
||||||
const int signature_l = sizeof CACHEDIR_TAG_SIGNATURE - 1;
|
const int signature_l = sizeof CACHEDIR_TAG_SIGNATURE - 1;
|
||||||
char buf[signature_l];
|
char buf[signature_l];
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int match = 0;
|
int match = 0;
|
||||||
|
|
||||||
path_l = strlen(name) + sizeof CACHEDIR_TAG_FILENAME + 2;
|
// Compute the required length for `path`.
|
||||||
|
l = strlen(name) + sizeof CACHEDIR_TAG_FILENAME + 2;
|
||||||
|
if((l > path_l) || (path == NULL)) {
|
||||||
|
// We always at least double the size to prevent too frequent
|
||||||
|
// re-allocation.
|
||||||
|
path_l = path_l * 2;
|
||||||
|
if(path_l < l)
|
||||||
|
path_l = l;
|
||||||
|
// We don't need to copy the content of `path`, so it's more efficient
|
||||||
|
// to use `free` + `malloc`. (Calling `free(NULL)` is allowed.)
|
||||||
|
free(path);
|
||||||
path = malloc(path_l);
|
path = malloc(path_l);
|
||||||
|
}
|
||||||
snprintf(path, path_l, "%s/%s", name, CACHEDIR_TAG_FILENAME);
|
snprintf(path, path_l, "%s/%s", name, CACHEDIR_TAG_FILENAME);
|
||||||
f = fopen(path, "rb");
|
f = fopen(path, "rb");
|
||||||
free(path);
|
|
||||||
|
|
||||||
if(f != NULL) {
|
if(f != NULL) {
|
||||||
match = ((fread(buf, 1, signature_l, f) == signature_l) &&
|
match = ((fread(buf, 1, signature_l, f) == signature_l) &&
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user