Download raw body.
qsort(3) and comparing values via subtraction
Our qsort(3) manual page contains a warning regarding subtraction of values larger than int: size_t lena = strlen(*(const char **)a); size_t lenb = strlen(*(const char **)b); /* * Do not subtract the lengths. The difference between values * cannot be represented by an int. */ return lena < lenb ? -1 : lena > lenb; The patch below fixes our qsort comparison functions accordingly. ok? diff cf8f868e7c97644d885e9cc2a06debbe9eac72b0 a19717b80ae1a0fef4b5bee6be2e79029c2d7a23 blob - 14aa4357200fc7ebcefeb1306ac93ca9c8d7fb54 blob + 35b8999680c0033eb8b09e58d16b0df2a41b4ea5 --- lib/pack_create.c +++ lib/pack_create.c @@ -162,8 +162,10 @@ delta_order_cmp(const void *pa, const void *pb) cmp = strcmp(a->path, b->path); if (cmp != 0) return cmp; - if (a->mtime != b->mtime) - return a->mtime - b->mtime; + if (a->mtime < b->mtime) + return -1; + else if (a->mtime > b->mtime) + return 1; return got_object_id_cmp(&a->id, &b->id); } @@ -1514,13 +1516,21 @@ write_order_cmp(const void *pa, const void *pb) b = *(struct got_pack_meta **)pb; ahd = (a->head == NULL) ? a : a->head; bhd = (b->head == NULL) ? b : b->head; - if (ahd->mtime != bhd->mtime) - return bhd->mtime - ahd->mtime; - if (ahd != bhd) - return (uintptr_t)bhd - (uintptr_t)ahd; + if (bhd->mtime < ahd->mtime) + return -1; + else if (bhd->mtime > ahd->mtime) + return 1; + if (bhd < ahd) + return -1; + else if (bhd > ahd) + return 1; if (a->nchain != b->nchain) return a->nchain - b->nchain; - return a->mtime - b->mtime; + if (a->mtime < b->mtime) + return -1; + else if (a->mtime > b->mtime) + return 1; + return got_object_id_cmp(&a->id, &b->id); } static int
qsort(3) and comparing values via subtraction