mercurial/mpatch.c
branchstable
changeset 38193 7f22ef3c0ee7
parent 38192 0b208c13781c
child 38194 59837a16896d
equal deleted inserted replaced
38192:0b208c13781c 38193:7f22ef3c0ee7
   170 {
   170 {
   171 	struct mpatch_frag *s = src->head;
   171 	struct mpatch_frag *s = src->head;
   172 	int postend, c, l;
   172 	int postend, c, l;
   173 
   173 
   174 	while (s != src->tail) {
   174 	while (s != src->tail) {
   175 		if (s->start + offset >= cut)
   175 		int cmpcut = s->start;
   176 			break;
   176 		if (!safeadd(offset, &cmpcut)) {
   177 
   177 			break;
   178 		postend = offset + s->start + s->len;
   178 		}
       
   179 		if (cmpcut >= cut)
       
   180 			break;
       
   181 
       
   182 		postend = offset;
       
   183 		if (!safeadd(s->start, &postend)) {
       
   184 			break;
       
   185 		}
       
   186 		if (!safeadd(s->len, &postend)) {
       
   187 			break;
       
   188 		}
   179 		if (postend <= cut) {
   189 		if (postend <= cut) {
   180 			offset += s->start + s->len - s->end;
   190 			/* do the subtraction first to avoid UB integer overflow
       
   191 			 */
       
   192 			int tmp = s->start;
       
   193 			if (!safesub(s->end, &tmp)) {
       
   194 				break;
       
   195 			}
       
   196 			if (!safeadd(s->len, &tmp)) {
       
   197 				break;
       
   198 			}
       
   199 			if (!safeadd(tmp, &offset)) {
       
   200 				break;
       
   201 			}
   181 			s++;
   202 			s++;
   182 		} else {
   203 		} else {
   183 			c = cut - offset;
   204 			c = cut;
       
   205 			if (!safesub(offset, &c)) {
       
   206 				break;
       
   207 			}
   184 			if (s->end < c)
   208 			if (s->end < c)
   185 				c = s->end;
   209 				c = s->end;
   186 			l = cut - offset - s->start;
   210 			l = cut - offset - s->start;
   187 			if (s->len < l)
   211 			if (s->len < l)
   188 				l = s->len;
   212 				l = s->len;