[PATCH 02/10] make overflow test on delta base offset work regardless of variable size

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Junio C Hamano <junkio@...>
Cc: <git@...>, Nicolas Pitre <nico@...>
Date: Monday, April 9, 2007 - 1:06 am

This patch introduces the MSB() macro to obtain the desired number of
most significant bits from a given variable independently of the variable
type.

It is then used to better implement the overflow test on the OBJ_OFS_DELTA
base offset variable with the property of always working correctly
regardless of the type/size of that variable.

Signed-off-by: Nicolas Pitre <nico@cam.org>
---
 builtin-pack-objects.c   |    2 +-
 builtin-unpack-objects.c |    2 +-
 git-compat-util.h        |    8 ++++++++
 index-pack.c             |    2 +-
 sha1_file.c              |    2 +-
 5 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 6bff17b..ee607a0 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1014,7 +1014,7 @@ static void check_object(struct object_entry *entry)
 				ofs = c & 127;
 				while (c & 128) {
 					ofs += 1;
-					if (!ofs || ofs & ~(~0UL >> 7))
+					if (!ofs || MSB(ofs, 7))
 						die("delta base offset overflow in pack for %s",
 						    sha1_to_hex(entry->sha1));
 					c = buf[used_0++];
diff --git a/builtin-unpack-objects.c b/builtin-unpack-objects.c
index 3956c56..63f7db6 100644
--- a/builtin-unpack-objects.c
+++ b/builtin-unpack-objects.c
@@ -209,7 +209,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
 		base_offset = c & 127;
 		while (c & 128) {
 			base_offset += 1;
-			if (!base_offset || base_offset & ~(~0UL >> 7))
+			if (!base_offset || MSB(base_offset, 7))
 				die("offset value overflow for delta base object");
 			pack = fill(1);
 			c = *pack;
diff --git a/git-compat-util.h b/git-compat-util.h
index 139fc19..bcfcb35 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -13,6 +13,14 @@
 
 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
 
+#ifdef __GNUC__
+#define TYPEOF(x) (__typeof__(x))
+#else
+#define TYPEOF(x)
+#endif
+
+#define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (sizeof(x) * 8 - (bits))))
+
 #if !defined(__APPLE__) && !defined(__FreeBSD__)
 #define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */
 #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
diff --git a/index-pack.c b/index-pack.c
index 3c768fb..0e54aa6 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -249,7 +249,7 @@ static void *unpack_raw_entry(struct object_entry *obj, union delta_base *delta_
 		base_offset = c & 127;
 		while (c & 128) {
 			base_offset += 1;
-			if (!base_offset || base_offset & ~(~0UL >> 7))
+			if (!base_offset || MSB(base_offset, 7))
 				bad_object(obj->offset, "offset value overflow for delta base object");
 			p = fill(1);
 			c = *p;
diff --git a/sha1_file.c b/sha1_file.c
index d9ca69a..ebdd497 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1150,7 +1150,7 @@ static off_t get_delta_base(struct packed_git *p,
 		base_offset = c & 127;
 		while (c & 128) {
 			base_offset += 1;
-			if (!base_offset || base_offset & ~(~0UL >> 7))
+			if (!base_offset || MSB(base_offset, 7))
 				die("offset value overflow for delta base object");
 			c = base_info[used++];
 			base_offset = (base_offset << 7) + (c & 127);
-- 
1.5.1.696.g6d352-dirty

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
support for large packs and 64-bit offsets, Nicolas Pitre, (Mon Apr 9, 1:06 am)
Re: support for large packs and 64-bit offsets, Shawn O. Pearce, (Mon Apr 9, 1:19 pm)
Re: support for large packs and 64-bit offsets, Linus Torvalds, (Mon Apr 9, 2:02 pm)
Re: support for large packs and 64-bit offsets, Nicolas Pitre, (Mon Apr 9, 2:26 pm)
Re: support for large packs and 64-bit offsets, Nicolas Pitre, (Mon Apr 9, 3:46 pm)
Re: support for large packs and 64-bit offsets, Shawn O. Pearce, (Mon Apr 9, 2:34 pm)
Re: support for large packs and 64-bit offsets, Nicolas Pitre, (Mon Apr 9, 1:32 pm)
Re: support for large packs and 64-bit offsets, Shawn O. Pearce, (Mon Apr 9, 1:43 pm)
Re: support for large packs and 64-bit offsets, Junio C Hamano, (Mon Apr 9, 3:49 pm)
Re: support for large packs and 64-bit offsets, Shawn O. Pearce, (Mon Apr 9, 3:53 pm)
Re: support for large packs and 64-bit offsets, Junio C Hamano, (Mon Apr 9, 4:18 pm)
Re: support for large packs and 64-bit offsets, Nicolas Pitre, (Mon Apr 9, 4:02 pm)
[PATCH 01/10] get rid of num_packed_objects(), Nicolas Pitre, (Mon Apr 9, 1:06 am)
[PATCH 02/10] make overflow test on delta base offset work r..., Nicolas Pitre, (Mon Apr 9, 1:06 am)
[PATCH 05/10] compute object CRC32 with index-pack, Nicolas Pitre, (Mon Apr 9, 1:06 am)