| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 6a2d2f8 commit 1cd6599
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -114,7 +114,7 @@ struct index_entry { | |||
| 114 | 114 | struct git_delta_index { | |
| 115 | 115 | unsigned long memsize; | |
| 116 | 116 | const void *src_buf; | |
| 117 | - unsigned long src_size; | ||
| 117 | + size_t src_size; | ||
| 118 | 118 | unsigned int hash_mask; | |
| 119 | 119 | struct index_entry *hash[GIT_FLEX_ARRAY]; | |
| 120 | 120 | }; | |
@@ -142,8 +142,8 @@ static int lookup_index_alloc( | |||
| 142 | 142 | return 0; | |
| 143 | 143 | } | |
| 144 | 144 | ||
| 145 | - struct git_delta_index * | ||
| 146 | - git_delta_create_index(const void *buf, unsigned long bufsize) | ||
| 145 | + int git_delta_index_init( | ||
| 146 | + git_delta_index **out, const void *buf, size_t bufsize) | ||
| 147 | 147 | { | |
| 148 | 148 | unsigned int i, hsize, hmask, entries, prev_val, *hash_count; | |
| 149 | 149 | const unsigned char *data, *buffer = buf; | |
@@ -152,8 +152,10 @@ git_delta_create_index(const void *buf, unsigned long bufsize) | |||
| 152 | 152 | void *mem; | |
| 153 | 153 | unsigned long memsize; | |
| 154 | 154 | ||
| 155 | + *out = NULL; | ||
| 156 | + | ||
| 155 | 157 | if (!buf || !bufsize) | |
| 156 | - return NULL; | ||
| 158 | + return 0; | ||
| 157 | 159 | ||
| 158 | 160 | /* Determine index hash size. Note that indexing skips the | |
| 159 | 161 | first byte to allow for optimizing the rabin polynomial | |
@@ -172,7 +174,7 @@ git_delta_create_index(const void *buf, unsigned long bufsize) | |||
| 172 | 174 | hmask = hsize - 1; | |
| 173 | 175 | ||
| 174 | 176 | if (lookup_index_alloc(&mem, &memsize, entries, hsize) < 0) | |
| 175 | - return NULL; | ||
| 177 | + return -1; | ||
| 176 | 178 | ||
| 177 | 179 | index = mem; | |
| 178 | 180 | mem = index->hash; | |
@@ -190,7 +192,7 @@ git_delta_create_index(const void *buf, unsigned long bufsize) | |||
| 190 | 192 | hash_count = git__calloc(hsize, sizeof(*hash_count)); | |
| 191 | 193 | if (!hash_count) { | |
| 192 | 194 | git__free(index); | |
| 193 | - return NULL; | ||
| 195 | + return -1; | ||
| 194 | 196 | } | |
| 195 | 197 | ||
| 196 | 198 | /* then populate the index */ | |
@@ -243,20 +245,20 @@ git_delta_create_index(const void *buf, unsigned long bufsize) | |||
| 243 | 245 | } | |
| 244 | 246 | git__free(hash_count); | |
| 245 | 247 | ||
| 246 | - return index; | ||
| 248 | + *out = index; | ||
| 249 | + return 0; | ||
| 247 | 250 | } | |
| 248 | 251 | ||
| 249 | - void git_delta_free_index(struct git_delta_index *index) | ||
| 252 | + void git_delta_index_free(git_delta_index *index) | ||
| 250 | 253 | { | |
| 251 | 254 | git__free(index); | |
| 252 | 255 | } | |
| 253 | 256 | ||
| 254 | - unsigned long git_delta_sizeof_index(struct git_delta_index *index) | ||
| 257 | + size_t git_delta_index_size(git_delta_index *index) | ||
| 255 | 258 | { | |
| 256 | - if (index) | ||
| 257 | - return index->memsize; | ||
| 258 | - else | ||
| 259 | - return 0; | ||
| 259 | + assert(index); | ||
| 260 | + | ||
| 261 | + return index->memsize; | ||
| 260 | 262 | } | |
| 261 | 263 | ||
| 262 | 264 | /* | |
@@ -265,55 +267,57 @@ unsigned long git_delta_sizeof_index(struct git_delta_index *index) | |||
| 265 | 267 | */ | |
| 266 | 268 | #define MAX_OP_SIZE (5 + 5 + 1 + RABIN_WINDOW + 7) | |
| 267 | 269 | ||
| 268 | - void * | ||
| 269 | - git_delta_create( | ||
| 270 | + int git_delta_create_from_index( | ||
| 271 | + void **out, | ||
| 272 | + size_t *out_len, | ||
| 270 | 273 | const struct git_delta_index *index, | |
| 271 | 274 | const void *trg_buf, | |
| 272 | - unsigned long trg_size, | ||
| 273 | - unsigned long *delta_size, | ||
| 274 | - unsigned long max_size) | ||
| 275 | + size_t trg_size, | ||
| 276 | + size_t max_size) | ||
| 275 | 277 | { | |
| 276 | - unsigned int i, outpos, outsize, moff, msize, val; | ||
| 278 | + unsigned int i, bufpos, bufsize, moff, msize, val; | ||
| 277 | 279 | int inscnt; | |
| 278 | 280 | const unsigned char *ref_data, *ref_top, *data, *top; | |
| 279 | - unsigned char *out; | ||
| 281 | + unsigned char *buf; | ||
| 282 | + | ||
| 283 | + *out = NULL; | ||
| 284 | + *out_len = 0; | ||
| 280 | 285 | ||
| 281 | 286 | if (!trg_buf || !trg_size) | |
| 282 | - return NULL; | ||
| 287 | + return 0; | ||
| 283 | 288 | ||
| 284 | - outpos = 0; | ||
| 285 | - outsize = 8192; | ||
| 286 | - if (max_size && outsize >= max_size) | ||
| 287 | - outsize = (unsigned int)(max_size + MAX_OP_SIZE + 1); | ||
| 288 | - out = git__malloc(outsize); | ||
| 289 | - if (!out) | ||
| 290 | - return NULL; | ||
| 289 | + bufpos = 0; | ||
| 290 | + bufsize = 8192; | ||
| 291 | + if (max_size && bufsize >= max_size) | ||
| 292 | + bufsize = (unsigned int)(max_size + MAX_OP_SIZE + 1); | ||
| 293 | + buf = git__malloc(bufsize); | ||
| 294 | + GITERR_CHECK_ALLOC(buf); | ||
| 291 | 295 | ||
| 292 | 296 | /* store reference buffer size */ | |
| 293 | 297 | i = index->src_size; | |
| 294 | 298 | while (i >= 0x80) { | |
| 295 | - out[outpos++] = i | 0x80; | ||
| 299 | + buf[bufpos++] = i | 0x80; | ||
| 296 | 300 | i >>= 7; | |
| 297 | 301 | } | |
| 298 | - out[outpos++] = i; | ||
| 302 | + buf[bufpos++] = i; | ||
| 299 | 303 | ||
| 300 | 304 | /* store target buffer size */ | |
| 301 | 305 | i = trg_size; | |
| 302 | 306 | while (i >= 0x80) { | |
| 303 | - out[outpos++] = i | 0x80; | ||
| 307 | + buf[bufpos++] = i | 0x80; | ||
| 304 | 308 | i >>= 7; | |
| 305 | 309 | } | |
| 306 | - out[outpos++] = i; | ||
| 310 | + buf[bufpos++] = i; | ||
| 307 | 311 | ||
| 308 | 312 | ref_data = index->src_buf; | |
| 309 | 313 | ref_top = ref_data + index->src_size; | |
| 310 | 314 | data = trg_buf; | |
| 311 | 315 | top = (const unsigned char *) trg_buf + trg_size; | |
| 312 | 316 | ||
| 313 | - outpos++; | ||
| 317 | + bufpos++; | ||
| 314 | 318 | val = 0; | |
| 315 | 319 | for (i = 0; i < RABIN_WINDOW && data < top; i++, data++) { | |
| 316 | - out[outpos++] = *data; | ||
| 320 | + buf[bufpos++] = *data; | ||
| 317 | 321 | val = ((val << 8) | *data) ^ T[val >> RABIN_SHIFT]; | |
| 318 | 322 | } | |
| 319 | 323 | inscnt = i; | |
@@ -350,11 +354,11 @@ git_delta_create( | |||
| 350 | 354 | ||
| 351 | 355 | if (msize < 4) { | |
| 352 | 356 | if (!inscnt) | |
| 353 | - outpos++; | ||
| 354 | - out[outpos++] = *data++; | ||
| 357 | + bufpos++; | ||
| 358 | + buf[bufpos++] = *data++; | ||
| 355 | 359 | inscnt++; | |
| 356 | 360 | if (inscnt == 0x7f) { | |
| 357 | - out[outpos - inscnt - 1] = inscnt; | ||
| 361 | + buf[bufpos - inscnt - 1] = inscnt; | ||
| 358 | 362 | inscnt = 0; | |
| 359 | 363 | } | |
| 360 | 364 | msize = 0; | |
@@ -368,37 +372,37 @@ git_delta_create( | |||
| 368 | 372 | msize++; | |
| 369 | 373 | moff--; | |
| 370 | 374 | data--; | |
| 371 | - outpos--; | ||
| 375 | + bufpos--; | ||
| 372 | 376 | if (--inscnt) | |
| 373 | 377 | continue; | |
| 374 | - outpos--; /* remove count slot */ | ||
| 378 | + bufpos--; /* remove count slot */ | ||
| 375 | 379 | inscnt--; /* make it -1 */ | |
| 376 | 380 | break; | |
| 377 | 381 | } | |
| 378 | - out[outpos - inscnt - 1] = inscnt; | ||
| 382 | + buf[bufpos - inscnt - 1] = inscnt; | ||
| 379 | 383 | inscnt = 0; | |
| 380 | 384 | } | |
| 381 | 385 | ||
| 382 | 386 | /* A copy op is currently limited to 64KB (pack v2) */ | |
| 383 | 387 | left = (msize < 0x10000) ? 0 : (msize - 0x10000); | |
| 384 | 388 | msize -= left; | |
| 385 | 389 | ||
| 386 | - op = out + outpos++; | ||
| 390 | + op = buf + bufpos++; | ||
| 387 | 391 | i = 0x80; | |
| 388 | 392 | ||
| 389 | 393 | if (moff & 0x000000ff) | |
| 390 | - out[outpos++] = moff >> 0, i |= 0x01; | ||
| 394 | + buf[bufpos++] = moff >> 0, i |= 0x01; | ||
| 391 | 395 | if (moff & 0x0000ff00) | |
| 392 | - out[outpos++] = moff >> 8, i |= 0x02; | ||
| 396 | + buf[bufpos++] = moff >> 8, i |= 0x02; | ||
| 393 | 397 | if (moff & 0x00ff0000) | |
| 394 | - out[outpos++] = moff >> 16, i |= 0x04; | ||
| 398 | + buf[bufpos++] = moff >> 16, i |= 0x04; | ||
| 395 | 399 | if (moff & 0xff000000) | |
| 396 | - out[outpos++] = moff >> 24, i |= 0x08; | ||
| 400 | + buf[bufpos++] = moff >> 24, i |= 0x08; | ||
| 397 | 401 | ||
| 398 | 402 | if (msize & 0x00ff) | |
| 399 | - out[outpos++] = msize >> 0, i |= 0x10; | ||
| 403 | + buf[bufpos++] = msize >> 0, i |= 0x10; | ||
| 400 | 404 | if (msize & 0xff00) | |
| 401 | - out[outpos++] = msize >> 8, i |= 0x20; | ||
| 405 | + buf[bufpos++] = msize >> 8, i |= 0x20; | ||
| 402 | 406 | ||
| 403 | 407 | *op = i; | |
| 404 | 408 | ||
@@ -415,31 +419,33 @@ git_delta_create( | |||
| 415 | 419 | } | |
| 416 | 420 | } | |
| 417 | 421 | ||
| 418 | - if (outpos >= outsize - MAX_OP_SIZE) { | ||
| 419 | - void *tmp = out; | ||
| 420 | - outsize = outsize * 3 / 2; | ||
| 421 | - if (max_size && outsize >= max_size) | ||
| 422 | - outsize = max_size + MAX_OP_SIZE + 1; | ||
| 423 | - if (max_size && outpos > max_size) | ||
| 422 | + if (bufpos >= bufsize - MAX_OP_SIZE) { | ||
| 423 | + void *tmp = buf; | ||
| 424 | + bufsize = bufsize * 3 / 2; | ||
| 425 | + if (max_size && bufsize >= max_size) | ||
| 426 | + bufsize = max_size + MAX_OP_SIZE + 1; | ||
| 427 | + if (max_size && bufpos > max_size) | ||
| 424 | 428 | break; | |
| 425 | - out = git__realloc(out, outsize); | ||
| 426 | - if (!out) { | ||
| 429 | + buf = git__realloc(buf, bufsize); | ||
| 430 | + if (!buf) { | ||
| 427 | 431 | git__free(tmp); | |
| 428 | - return NULL; | ||
| 432 | + return -1; | ||
| 429 | 433 | } | |
| 430 | 434 | } | |
| 431 | 435 | } | |
| 432 | 436 | ||
| 433 | 437 | if (inscnt) | |
| 434 | - out[outpos - inscnt - 1] = inscnt; | ||
| 438 | + buf[bufpos - inscnt - 1] = inscnt; | ||
| 435 | 439 | ||
| 436 | - if (max_size && outpos > max_size) { | ||
| 437 | - git__free(out); | ||
| 438 | - return NULL; | ||
| 440 | + if (max_size && bufpos > max_size) { | ||
| 441 | + giterr_set(GITERR_NOMEMORY, "delta would be larger than maximum size"); | ||
| 442 | + git__free(buf); | ||
| 443 | + return GIT_EBUFS; | ||
| 439 | 444 | } | |
| 440 | 445 | ||
| 441 | - *delta_size = outpos; | ||
| 442 | - return out; | ||
| 446 | + *out_len = bufpos; | ||
| 447 | + *out = buf; | ||
| 448 | + return 0; | ||
| 443 | 449 | } | |
| 444 | 450 | ||
| 445 | 451 | /* | |
@@ -459,8 +465,11 @@ static int hdr_sz( | |||
| 459 | 465 | unsigned int c, shift = 0; | |
| 460 | 466 | ||
| 461 | 467 | do { | |
| 462 | - if (d == end) | ||
| 468 | + if (d == end) { | ||
| 469 | + giterr_set(GITERR_INVALID, "truncated delta"); | ||
| 463 | 470 | return -1; | |
| 471 | + } | ||
| 472 | + | ||
| 464 | 473 | c = *d++; | |
| 465 | 474 | r |= (c & 0x7f) << shift; | |
| 466 | 475 | shift += 7; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments