dir: make untracked cache extension hash size independent
Instead of using a struct with a flex array member to read and write the untracked cache extension, use a shorter, fixed-length struct and add the name and hash data explicitly. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ebe4df59c4
commit
3899b88b49
28
dir.c
28
dir.c
@ -2545,13 +2545,9 @@ struct ondisk_untracked_cache {
|
||||
struct stat_data info_exclude_stat;
|
||||
struct stat_data excludes_file_stat;
|
||||
uint32_t dir_flags;
|
||||
unsigned char info_exclude_sha1[20];
|
||||
unsigned char excludes_file_sha1[20];
|
||||
char exclude_per_dir[FLEX_ARRAY];
|
||||
};
|
||||
|
||||
#define ouc_offset(x) offsetof(struct ondisk_untracked_cache, x)
|
||||
#define ouc_size(len) (ouc_offset(exclude_per_dir) + len + 1)
|
||||
|
||||
struct write_data {
|
||||
int index; /* number of written untracked_cache_dir */
|
||||
@ -2634,20 +2630,21 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra
|
||||
struct write_data wd;
|
||||
unsigned char varbuf[16];
|
||||
int varint_len;
|
||||
size_t len = strlen(untracked->exclude_per_dir);
|
||||
const unsigned hashsz = the_hash_algo->rawsz;
|
||||
|
||||
FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len);
|
||||
ouc = xcalloc(1, sizeof(*ouc));
|
||||
stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);
|
||||
stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);
|
||||
hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.oid.hash);
|
||||
hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.oid.hash);
|
||||
ouc->dir_flags = htonl(untracked->dir_flags);
|
||||
|
||||
varint_len = encode_varint(untracked->ident.len, varbuf);
|
||||
strbuf_add(out, varbuf, varint_len);
|
||||
strbuf_addbuf(out, &untracked->ident);
|
||||
|
||||
strbuf_add(out, ouc, ouc_size(len));
|
||||
strbuf_add(out, ouc, sizeof(*ouc));
|
||||
strbuf_add(out, untracked->ss_info_exclude.oid.hash, hashsz);
|
||||
strbuf_add(out, untracked->ss_excludes_file.oid.hash, hashsz);
|
||||
strbuf_add(out, untracked->exclude_per_dir, strlen(untracked->exclude_per_dir) + 1);
|
||||
FREE_AND_NULL(ouc);
|
||||
|
||||
if (!untracked->root) {
|
||||
@ -2834,6 +2831,9 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
|
||||
int ident_len;
|
||||
ssize_t len;
|
||||
const char *exclude_per_dir;
|
||||
const unsigned hashsz = the_hash_algo->rawsz;
|
||||
const unsigned offset = sizeof(struct ondisk_untracked_cache);
|
||||
const unsigned exclude_per_dir_offset = offset + 2 * hashsz;
|
||||
|
||||
if (sz <= 1 || end[-1] != '\0')
|
||||
return NULL;
|
||||
@ -2845,7 +2845,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
|
||||
ident = (const char *)next;
|
||||
next += ident_len;
|
||||
|
||||
if (next + ouc_size(0) > end)
|
||||
if (next + exclude_per_dir_offset + 1 > end)
|
||||
return NULL;
|
||||
|
||||
uc = xcalloc(1, sizeof(*uc));
|
||||
@ -2853,15 +2853,15 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
|
||||
strbuf_add(&uc->ident, ident, ident_len);
|
||||
load_oid_stat(&uc->ss_info_exclude,
|
||||
next + ouc_offset(info_exclude_stat),
|
||||
next + ouc_offset(info_exclude_sha1));
|
||||
next + offset);
|
||||
load_oid_stat(&uc->ss_excludes_file,
|
||||
next + ouc_offset(excludes_file_stat),
|
||||
next + ouc_offset(excludes_file_sha1));
|
||||
next + offset + hashsz);
|
||||
uc->dir_flags = get_be32(next + ouc_offset(dir_flags));
|
||||
exclude_per_dir = (const char *)next + ouc_offset(exclude_per_dir);
|
||||
exclude_per_dir = (const char *)next + exclude_per_dir_offset;
|
||||
uc->exclude_per_dir = xstrdup(exclude_per_dir);
|
||||
/* NUL after exclude_per_dir is covered by sizeof(*ouc) */
|
||||
next += ouc_size(strlen(exclude_per_dir));
|
||||
next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1;
|
||||
if (next >= end)
|
||||
goto done2;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user