X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8cae71ebc3aaddb61068cb1b5ae279f1e8f90b68..a3e18c763a3bef045177aafc8be349b210d91cad:/flist.c diff --git a/flist.c b/flist.c index 3dadeab4..1d5fbff2 100644 --- a/flist.c +++ b/flist.c @@ -22,6 +22,7 @@ */ #include "rsync.h" +#include "rounding.h" extern int verbose; extern int list_only; @@ -515,7 +516,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, char thisname[MAXPATHLEN]; unsigned int l1 = 0, l2 = 0; int alloc_len, basename_len, dirname_len, linkname_len; - int extra_len = (flist_extra_cnt - 1) * EXTRA_LEN; + int extra_len = flist_extra_cnt * EXTRA_LEN; int first_hlink_ndx = -1; OFF_T file_length; char *basename, *dirname, *bp; @@ -668,11 +669,16 @@ static struct file_struct *recv_file_entry(struct file_list *flist, if (file_length > 0xFFFFFFFFu && S_ISREG(mode)) extra_len += EXTRA_LEN; +#if EXTRA_ROUNDING > 0 + if (extra_len & (EXTRA_ROUNDING * EXTRA_LEN)) + extra_len = (extra_len | (EXTRA_ROUNDING * EXTRA_LEN)) + EXTRA_LEN; +#endif + alloc_len = FILE_STRUCT_LEN + extra_len + basename_len + dirname_len + linkname_len; bp = pool_alloc(flist->file_pool, alloc_len, "recv_file_entry"); - memset(bp, 0, FILE_STRUCT_LEN + extra_len); + memset(bp, 0, extra_len + FILE_STRUCT_LEN); bp += extra_len; file = (struct file_struct *)bp; bp += FILE_STRUCT_LEN; @@ -740,7 +746,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, #ifdef SUPPORT_LINKS if (linkname_len) { - bp = (char*)F_BASENAME(file) + basename_len; + bp = (char*)file->basename + basename_len; if (first_hlink_ndx >= 0) { struct file_struct *first = flist->files[first_hlink_ndx]; memcpy(bp, F_SYMLINK(first), linkname_len); @@ -815,7 +821,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, char thisname[MAXPATHLEN]; char linkname[MAXPATHLEN]; int alloc_len, basename_len, dirname_len, linkname_len; - int extra_len = (flist_extra_cnt - 1) * EXTRA_LEN; + int extra_len = flist_extra_cnt * EXTRA_LEN; char *basename, *dirname, *bp; if (!flist || !flist->count) /* Ignore lastdir when invalid. */ @@ -937,6 +943,11 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, if (st.st_size > 0xFFFFFFFFu && S_ISREG(st.st_mode)) extra_len += EXTRA_LEN; +#if EXTRA_ROUNDING > 0 + if (extra_len & (EXTRA_ROUNDING * EXTRA_LEN)) + extra_len = (extra_len | (EXTRA_ROUNDING * EXTRA_LEN)) + EXTRA_LEN; +#endif + alloc_len = FILE_STRUCT_LEN + extra_len + basename_len + dirname_len + linkname_len; if (flist) @@ -946,7 +957,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, out_of_memory("make_file"); } - memset(bp, 0, FILE_STRUCT_LEN + extra_len); + memset(bp, 0, extra_len + FILE_STRUCT_LEN); bp += extra_len; file = (struct file_struct *)bp; bp += FILE_STRUCT_LEN; @@ -997,7 +1008,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, #ifdef SUPPORT_LINKS if (linkname_len) { - bp = (char*)F_BASENAME(file) + basename_len; + bp = (char*)file->basename + basename_len; memcpy(bp, linkname, linkname_len); } #endif @@ -1038,8 +1049,12 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, /* Only called for temporary file_struct entries created by make_file(). */ void unmake_file(struct file_struct *file) { - int extra_cnt = flist_extra_cnt - 1 + LEN64_BUMP(file); - free(file->extras - extra_cnt); + int extra_cnt = flist_extra_cnt + LEN64_BUMP(file); +#if EXTRA_ROUNDING > 0 + if (extra_cnt & EXTRA_ROUNDING) + extra_cnt = (extra_cnt | EXTRA_ROUNDING) + 1; +#endif + free(REQ_EXTRA(file, extra_cnt)); } static struct file_struct *send_file_name(int f, struct file_list *flist, @@ -1570,7 +1585,8 @@ int flist_find(struct file_list *flist, struct file_struct *f) */ void clear_file(struct file_struct *file) { - memset((char*)file + EXTRA_LEN, 0, FILE_STRUCT_LEN - EXTRA_LEN + 1); + /* The +1 zeros out the first char of the basename. */ + memset(file, 0, FILE_STRUCT_LEN + 1); /* In an empty entry, dir.depth is an offset to the next non-empty * entry. Likewise for len32 in the opposite direction. We assume * that we're alone for now since flist_find() will adjust the counts @@ -1795,7 +1811,7 @@ static void output_flist(struct file_list *flist) dir = slash = ""; else slash = "/"; - name = F_BASENAME(file); + name = file->basename; trail = S_ISDIR(file->mode) ? "/" : ""; } else dir = slash = name = trail = ""; @@ -1846,7 +1862,7 @@ int f_name_cmp(struct file_struct *f1, struct file_struct *f2) c1 = c2 = NULL; if (!c1) { type1 = S_ISDIR(f1->mode) ? t_path : t_ITEM; - c1 = (uchar*)F_BASENAME(f1); + c1 = (const uchar*)f1->basename; if (type1 == t_PATH && *c1 == '.' && !c1[1]) { type1 = t_ITEM; state1 = s_TRAILING; @@ -1859,7 +1875,7 @@ int f_name_cmp(struct file_struct *f1, struct file_struct *f2) } if (!c2) { type2 = S_ISDIR(f2->mode) ? t_path : t_ITEM; - c2 = (uchar*)F_BASENAME(f2); + c2 = (const uchar*)f2->basename; if (type2 == t_PATH && *c2 == '.' && !c2[1]) { type2 = t_ITEM; state2 = s_TRAILING; @@ -1883,7 +1899,7 @@ int f_name_cmp(struct file_struct *f1, struct file_struct *f2) break; case s_SLASH: type1 = S_ISDIR(f1->mode) ? t_path : t_ITEM; - c1 = (uchar*)F_BASENAME(f1); + c1 = (const uchar*)f1->basename; if (type1 == t_PATH && *c1 == '.' && !c1[1]) { type1 = t_ITEM; state1 = s_TRAILING; @@ -1913,7 +1929,7 @@ int f_name_cmp(struct file_struct *f1, struct file_struct *f2) break; case s_SLASH: type2 = S_ISDIR(f2->mode) ? t_path : t_ITEM; - c2 = (uchar*)F_BASENAME(f2); + c2 = (const uchar*)f2->basename; if (type2 == t_PATH && *c2 == '.' && !c2[1]) { type2 = t_ITEM; state2 = s_TRAILING; @@ -1968,9 +1984,9 @@ char *f_name(struct file_struct *f, char *fbuf) int len = strlen(f->dirname); memcpy(fbuf, f->dirname, len); fbuf[len] = '/'; - strlcpy(fbuf + len + 1, F_BASENAME(f), MAXPATHLEN - (len + 1)); + strlcpy(fbuf + len + 1, f->basename, MAXPATHLEN - (len + 1)); } else - strlcpy(fbuf, F_BASENAME(f), MAXPATHLEN); + strlcpy(fbuf, f->basename, MAXPATHLEN); return fbuf; }