Index: usr.bin/ar/write.c =================================================================== --- usr.bin/ar/write.c +++ usr.bin/ar/write.c @@ -656,10 +656,7 @@ * * absolute_offset = htobe32(relative_offset + size_of_pseudo_members) */ - w_sz = sizeof(uint32_t); - if (bsdar->s_so_max > UINT32_MAX) - w_sz = sizeof(uint64_t); if (bsdar->s_cnt != 0) { s_sz = (bsdar->s_cnt + 1) * sizeof(uint32_t) + bsdar->s_sn_sz; pm_sz = _ARMAG_LEN + (_ARHDR_LEN + s_sz); @@ -672,15 +669,15 @@ s_sz = (bsdar->s_cnt + 1) * sizeof(uint64_t) + bsdar->s_sn_sz; pm_sz += s_sz; - } - - for (i = 0; (size_t)i < bsdar->s_cnt; i++) { - if (w_sz == sizeof(uint32_t)) - *(bsdar->s_so + i) = - htobe32((uint32_t)(*(bsdar->s_so + i)) + pm_sz); - else - *(bsdar->s_so + i) = - htobe64(*(bsdar->s_so + i) + pm_sz); + /* Convert to big-endian. */ + for (i = 0; (size_t)i < bsdar->s_cnt; i++) + bsdar->s_so[i] = + htobe64(bsdar->s_so[i] + pm_sz); + } else { + /* Convert to big-endian and shuffle to beginning. */ + for (i = 0; (size_t)i < bsdar->s_cnt; i++) + ((uint32_t *)(bsdar->s_so))[i] = + htobe32((uint32_t)(bsdar->s_so[i] + pm_sz)); } } @@ -716,14 +713,7 @@ else nr = htobe64(bsdar->s_cnt); write_data(bsdar, a, &nr, w_sz); - if (w_sz == sizeof(uint64_t)) - write_data(bsdar, a, bsdar->s_so, sizeof(uint64_t) * - bsdar->s_cnt); - else - for (i = 0; (size_t)i < bsdar->s_cnt; i++) - write_data(bsdar, a, - (uint32_t *)&bsdar->s_so[i], - sizeof(uint32_t)); + write_data(bsdar, a, bsdar->s_so, w_sz * bsdar->s_cnt); write_data(bsdar, a, bsdar->s_sn, bsdar->s_sn_sz); archive_entry_free(entry); }