summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2006-11-24 18:35:00 +0000
committerWayne Davison <wayned@samba.org>2006-11-24 18:35:00 +0000
commit4ea4acf17ba245e64a0d549e030fa9def99750ea (patch)
tree24c55f41d15eb377879289d091d0adc5dbe34064 /io.c
parent3a993aa4bfb2b968012dc40eb1b4fd3fa4a81c6c (diff)
downloadrsync-4ea4acf17ba245e64a0d549e030fa9def99750ea.tar.gz
rsync-4ea4acf17ba245e64a0d549e030fa9def99750ea.tar.bz2
rsync-4ea4acf17ba245e64a0d549e030fa9def99750ea.zip
- Added checking of SIZEOF_INT64 to the new code in read_longint().
- Improved the SIZEOF_INT64 checking code in write_longint().
Diffstat (limited to 'io.c')
-rw-r--r--io.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/io.c b/io.c
index dd51c99e..79fb7e93 100644
--- a/io.c
+++ b/io.c
@@ -917,6 +917,12 @@ int64 read_longint(int f)
int cnt;
readfd(f, b, 3);
cnt = int_byte_cnt[CVAL(b, 0)];
+#if SIZEOF_INT64 < 8
+ if (cnt > 5 || (cnt == 5 && (CVAL(b,0)&0x3F || CVAL(b,1)&0x80))) {
+ rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n");
+ exit_cleanup(RERR_UNSUPPORTED);
+ }
+#endif
if (cnt > 3)
readfd(f, b + 3, cnt - 3);
switch (cnt) {
@@ -929,6 +935,7 @@ int64 read_longint(int f)
case 5:
num = NVAL5(b, 0xC0);
break;
+#if SIZEOF_INT64 >= 8
case 6:
num = NVAL6(b, 0xE0);
break;
@@ -941,8 +948,9 @@ int64 read_longint(int f)
case 9:
num = NVAL8(b+1, 0);
break;
+#endif
default:
- exit_cleanup(RERR_PROTOCOL); // XXX impossible
+ exit_cleanup(RERR_PROTOCOL); /* impossible... */
}
}
@@ -1344,6 +1352,16 @@ void write_longint(int f, int64 x)
b[2] = (char)(x >> 8);
b[3] = (char)x;
writefd(f, b, 4);
+#if SIZEOF_INT64 < 8
+ } else {
+ b[0] = 0xC0;
+ b[1] = (char)(x >> 24);
+ b[2] = (char)(x >> 16);
+ b[3] = (char)(x >> 8);
+ b[4] = (char)x;
+ writefd(f, b, 5);
+ }
+#else
} else if (x < ((int64)1<<(5*8-3))) {
b[0] = (char)((x >> 32) | 0xC0);
b[1] = (char)(x >> 24);
@@ -1351,7 +1369,6 @@ void write_longint(int f, int64 x)
b[3] = (char)(x >> 8);
b[4] = (char)x;
writefd(f, b, 5);
-#if SIZEOF_INT64 >= 8
} else if (x < ((int64)1<<(6*8-4))) {
b[0] = (char)((x >> 40) | 0xE0);
b[1] = (char)(x >> 32);
@@ -1391,8 +1408,8 @@ void write_longint(int f, int64 x)
b[7] = (char)(x >> 8);
b[8] = (char)x;
writefd(f, b, 9);
-#endif
}
+#endif
}
void write_buf(int f, const char *buf, size_t len)