Changes by: uvman
Update of /cvs/linux-ntfs/ntfsprogs/libntfs
In directory delta357:/tmp/cvs-serv4713/libntfs
Modified Files:
compress.c
Log Message:
I was assuming memmove() would copy byte by byte if it detects a smaller than word gap. Anton pointed out that it doesn't, glibc sources confirm, the C99 standard claims otherwise. Revert the compress.c patch as implementation is more important than specification.
Index: compress.c
===================================================================
RCS file: /cvs/linux-ntfs/ntfsprogs/libntfs/compress.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -p -r1.18 -r1.19
--- compress.c 28 Oct 2006 23:35:56 -0000 1.18
+++ compress.c 29 Oct 2006 08:59:21 -0000 1.19
@@ -166,7 +166,7 @@ do_next_tag:
tag = *cb++;
/* Parse the eight tokens described by the tag. */
for (token = 0; token < 8; token++, tag >>= 1) {
- u16 lg, pt, length;
+ u16 lg, pt, length, max_non_overlap;
register u16 i;
u8 *dest_back_addr;
@@ -214,9 +214,27 @@ do_next_tag:
/* Verify destination is in range. */
if (dest + length > dest_sb_end)
goto return_overflow;
- /* memmove() is safe with overlapping blocks. */
- memmove(dest, dest_back_addr, length);
- dest += length;
+ /* The number of non-overlapping bytes. */
+ max_non_overlap = dest - dest_back_addr;
+ if (length <= max_non_overlap) {
+ /* The byte sequence doesn't overlap, just copy it. */
+ memcpy(dest, dest_back_addr, length);
+ /* Advance destination pointer. */
+ dest += length;
+ } else {
+ /*
+ * The byte sequence does overlap, copy non-overlapping
+ * part and then do a slow byte by byte copy for the
+ * overlapping part. Also, advance the destination
+ * pointer.
+ */
+ memcpy(dest, dest_back_addr, max_non_overlap);
+ dest += max_non_overlap;
+ dest_back_addr += max_non_overlap;
+ length -= max_non_overlap;
+ while (length--)
+ *dest++ = *dest_back_addr++;
+ }
/* Advance source position and continue with the next token. */
cb += 2;
}
|