mercurial/mpatch.c
changeset 16437 d126a0d16856
parent 16385 e501f45b0eba
child 16757 923bd97b86a0
equal deleted inserted replaced
16436:e98460f6089d 16437:d126a0d16856
   200 static struct flist *decode(const char *bin, int len)
   200 static struct flist *decode(const char *bin, int len)
   201 {
   201 {
   202 	struct flist *l;
   202 	struct flist *l;
   203 	struct frag *lt;
   203 	struct frag *lt;
   204 	const char *data = bin + 12, *end = bin + len;
   204 	const char *data = bin + 12, *end = bin + len;
   205 	uint32_t decode[3]; /* for dealing with alignment issues */
       
   206 
   205 
   207 	/* assume worst case size, we won't have many of these lists */
   206 	/* assume worst case size, we won't have many of these lists */
   208 	l = lalloc(len / 12);
   207 	l = lalloc(len / 12);
   209 	if (!l)
   208 	if (!l)
   210 		return NULL;
   209 		return NULL;
   211 
   210 
   212 	lt = l->tail;
   211 	lt = l->tail;
   213 
   212 
   214 	while (data <= end) {
   213 	while (data <= end) {
   215 		memcpy(decode, bin, 12);
   214 		lt->start = getbe32(bin);
   216 		lt->start = ntohl(decode[0]);
   215 		lt->end = getbe32(bin + 4);
   217 		lt->end = ntohl(decode[1]);
   216 		lt->len = getbe32(bin + 8);
   218 		lt->len = ntohl(decode[2]);
       
   219 		if (lt->start > lt->end)
   217 		if (lt->start > lt->end)
   220 			break; /* sanity check */
   218 			break; /* sanity check */
   221 		bin = data + lt->len;
   219 		bin = data + lt->len;
   222 		if (bin < data)
   220 		if (bin < data)
   223 			break; /* big data + big (bogus) len can wrap around */
   221 			break; /* big data + big (bogus) len can wrap around */
   359 patchedsize(PyObject *self, PyObject *args)
   357 patchedsize(PyObject *self, PyObject *args)
   360 {
   358 {
   361 	long orig, start, end, len, outlen = 0, last = 0;
   359 	long orig, start, end, len, outlen = 0, last = 0;
   362 	int patchlen;
   360 	int patchlen;
   363 	char *bin, *binend, *data;
   361 	char *bin, *binend, *data;
   364 	uint32_t decode[3]; /* for dealing with alignment issues */
       
   365 
   362 
   366 	if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen))
   363 	if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen))
   367 		return NULL;
   364 		return NULL;
   368 
   365 
   369 	binend = bin + patchlen;
   366 	binend = bin + patchlen;
   370 	data = bin + 12;
   367 	data = bin + 12;
   371 
   368 
   372 	while (data <= binend) {
   369 	while (data <= binend) {
   373 		memcpy(decode, bin, 12);
   370 		start = getbe32(bin);
   374 		start = ntohl(decode[0]);
   371 		end = getbe32(bin + 4);
   375 		end = ntohl(decode[1]);
   372 		len = getbe32(bin + 8);
   376 		len = ntohl(decode[2]);
       
   377 		if (start > end)
   373 		if (start > end)
   378 			break; /* sanity check */
   374 			break; /* sanity check */
   379 		bin = data + len;
   375 		bin = data + len;
   380 		if (bin < data)
   376 		if (bin < data)
   381 			break; /* big data + big (bogus) len can wrap around */
   377 			break; /* big data + big (bogus) len can wrap around */