Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
A small optimization to the symlink-send code, and an extra sanity
[rsync/rsync.git]
/
flist.c
diff --git
a/flist.c
b/flist.c
index
c4459b1
..
245a7ef
100644
(file)
--- a/
flist.c
+++ b/
flist.c
@@
-441,19
+441,19
@@
void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
if (l2 > 255)
flags |= XMIT_LONG_NAME;
if (l2 > 255)
flags |= XMIT_LONG_NAME;
- /* We must make sure we don't send a zero flag
s
byte or
+ /* We must make sure we don't send a zero flag
-
byte or
* the other end will terminate the flist transfer. */
* the other end will terminate the flist transfer. */
- if (
flags == 0
&& !S_ISDIR(mode))
+ if (
!(flags & 0xFF)
&& !S_ISDIR(mode))
flags |= XMIT_TOP_DIR; /* NOTE: no meaning for non-dir */
if (protocol_version >= 28) {
flags |= XMIT_TOP_DIR; /* NOTE: no meaning for non-dir */
if (protocol_version >= 28) {
- if ((flags & 0xFF00) ||
flags == 0
) {
+ if ((flags & 0xFF00) ||
!(flags & 0xFF)
) {
flags |= XMIT_EXTENDED_FLAGS;
write_byte(f, flags);
write_byte(f, flags >> 8);
} else
write_byte(f, flags);
} else {
flags |= XMIT_EXTENDED_FLAGS;
write_byte(f, flags);
write_byte(f, flags >> 8);
} else
write_byte(f, flags);
} else {
- if (
flags == 0
)
+ if (
!(flags & 0xFF)
)
flags |= XMIT_LONG_NAME;
write_byte(f, flags);
}
flags |= XMIT_LONG_NAME;
write_byte(f, flags);
}
@@
-490,8
+490,9
@@
void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
#if SUPPORT_LINKS
if (preserve_links && S_ISLNK(mode)) {
#if SUPPORT_LINKS
if (preserve_links && S_ISLNK(mode)) {
- write_int(f, strlen(file->u.link));
- write_buf(f, file->u.link, strlen(file->u.link));
+ int len = strlen(file->u.link);
+ write_int(f, len);
+ write_buf(f, file->u.link, len);
}
#endif
}
#endif
@@
-643,14
+644,14
@@
void receive_file_entry(struct file_struct **fptr, unsigned short flags, int f)
}
if (preserve_links && S_ISLNK(mode)) {
}
if (preserve_links && S_ISLNK(mode)) {
- int l = read_int(f);
- if (l
< 0
) {
- rprintf(FERROR, "overflow: l
=%d\n", l
);
+ int l
en
= read_int(f);
+ if (l
en < 0 || len >= MAXPATHLEN
) {
+ rprintf(FERROR, "overflow: l
en=%d\n", len
);
overflow("receive_file_entry");
}
overflow("receive_file_entry");
}
- if (!(file->u.link = new_array(char, l + 1)))
+ if (!(file->u.link = new_array(char, l
en
+ 1)))
out_of_memory("receive_file_entry 2");
out_of_memory("receive_file_entry 2");
- read_sbuf(f, file->u.link, l);
+ read_sbuf(f, file->u.link, l
en
);
if (sanitize_paths)
sanitize_path(file->u.link, file->dirname);
}
if (sanitize_paths)
sanitize_path(file->u.link, file->dirname);
}
@@
-725,7
+726,7
@@
struct file_struct *make_file(char *fname, struct string_area **ap,
char sum[SUM_LENGTH];
char *p;
char thisname[MAXPATHLEN];
char sum[SUM_LENGTH];
char *p;
char thisname[MAXPATHLEN];
- char link
buf
[MAXPATHLEN];
+ char link
name
[MAXPATHLEN];
unsigned short flags = 0;
if (strlcpy(thisname, fname, sizeof thisname)
unsigned short flags = 0;
if (strlcpy(thisname, fname, sizeof thisname)
@@
-739,7
+740,7
@@
struct file_struct *make_file(char *fname, struct string_area **ap,
memset(sum, 0, SUM_LENGTH);
memset(sum, 0, SUM_LENGTH);
- if (readlink_stat(thisname, &st, link
buf
) != 0) {
+ if (readlink_stat(thisname, &st, link
name
) != 0) {
int save_errno = errno;
if (errno == ENOENT && exclude_level != NO_EXCLUDES) {
/* either symlink pointing nowhere or file that
int save_errno = errno;
if (errno == ENOENT && exclude_level != NO_EXCLUDES) {
/* either symlink pointing nowhere or file that
@@
-829,7
+830,7
@@
struct file_struct *make_file(char *fname, struct string_area **ap,
#if SUPPORT_LINKS
if (S_ISLNK(st.st_mode))
#if SUPPORT_LINKS
if (S_ISLNK(st.st_mode))
- file->u.link = STRDUP(ap, link
buf
);
+ file->u.link = STRDUP(ap, link
name
);
#endif
if (always_checksum && S_ISREG(st.st_mode)) {
#endif
if (always_checksum && S_ISREG(st.st_mode)) {