Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 1 | # Support routines for hand-crafting weird or malicious packs. |
| 2 | # |
| 3 | # You can make a complete pack like: |
| 4 | # |
| 5 | # pack_header 2 >foo.pack && |
| 6 | # pack_obj e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 >>foo.pack && |
| 7 | # pack_obj e68fe8129b546b101aee9510c5328e7f21ca1d18 >>foo.pack && |
| 8 | # pack_trailer foo.pack |
| 9 | |
| 10 | # Print the big-endian 4-byte octal representation of $1 |
| 11 | uint32_octal () { |
| 12 | n=$1 |
Kacper Kornet | fbc812a | 2013-10-31 12:51:32 +0100 | [diff] [blame] | 13 | printf '\\%o' $(($n / 16777216)); n=$((n % 16777216)) |
| 14 | printf '\\%o' $(($n / 65536)); n=$((n % 65536)) |
| 15 | printf '\\%o' $(($n / 256)); n=$((n % 256)) |
| 16 | printf '\\%o' $(($n )); |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 17 | } |
| 18 | |
| 19 | # Print the big-endian 4-byte binary representation of $1 |
| 20 | uint32_binary () { |
| 21 | printf "$(uint32_octal "$1")" |
| 22 | } |
| 23 | |
| 24 | # Print a pack header, version 2, for a pack with $1 objects |
| 25 | pack_header () { |
| 26 | printf 'PACK' && |
| 27 | printf '\0\0\0\2' && |
| 28 | uint32_binary "$1" |
| 29 | } |
| 30 | |
| 31 | # Print the pack data for object $1, as a delta against object $2 (or as a full |
| 32 | # object if $2 is missing or empty). The output is suitable for including |
| 33 | # directly in the packfile, and represents the entirety of the object entry. |
| 34 | # Doing this on the fly (especially picking your deltas) is quite tricky, so we |
| 35 | # have hardcoded some well-known objects. See the case statements below for the |
| 36 | # complete list. |
| 37 | pack_obj () { |
| 38 | case "$1" in |
| 39 | # empty blob |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 40 | $EMPTY_BLOB) |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 41 | case "$2" in |
| 42 | '') |
| 43 | printf '\060\170\234\003\0\0\0\0\1' |
| 44 | return |
| 45 | ;; |
| 46 | esac |
| 47 | ;; |
| 48 | |
| 49 | # blob containing "\7\76" |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 50 | $(test_oid packlib_7_76)) |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 51 | case "$2" in |
| 52 | '') |
| 53 | printf '\062\170\234\143\267\3\0\0\116\0\106' |
| 54 | return |
| 55 | ;; |
Jeff King | 3b910d0 | 2013-08-23 20:02:31 -0400 | [diff] [blame] | 56 | 01d7713666f4de822776c7622c10f1b07de280dc) |
| 57 | printf '\165\1\327\161\66\146\364\336\202\47\166' && |
| 58 | printf '\307\142\54\20\361\260\175\342\200\334\170' && |
| 59 | printf '\234\143\142\142\142\267\003\0\0\151\0\114' |
| 60 | return |
| 61 | ;; |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 62 | 37c8e2c15bb22b912e59b43fd51a4f7e9465ed0b5084c5a1411d991cbe630683) |
| 63 | printf '\165\67\310\342\301\133\262\53\221\56\131' && |
| 64 | printf '\264\77\325\32\117\176\224\145\355\13\120' && |
| 65 | printf '\204\305\241\101\35\231\34\276\143\6\203\170' && |
| 66 | printf '\234\143\142\142\142\267\003\0\0\151\0\114' |
| 67 | return |
| 68 | ;; |
Jeff King | 3b910d0 | 2013-08-23 20:02:31 -0400 | [diff] [blame] | 69 | esac |
| 70 | ;; |
| 71 | |
| 72 | # blob containing "\7\0" |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 73 | $(test_oid packlib_7_0)) |
Jeff King | 3b910d0 | 2013-08-23 20:02:31 -0400 | [diff] [blame] | 74 | case "$2" in |
| 75 | '') |
| 76 | printf '\062\170\234\143\147\0\0\0\20\0\10' |
| 77 | return |
| 78 | ;; |
| 79 | e68fe8129b546b101aee9510c5328e7f21ca1d18) |
| 80 | printf '\165\346\217\350\22\233\124\153\20\32\356' && |
| 81 | printf '\225\20\305\62\216\177\41\312\35\30\170\234' && |
| 82 | printf '\143\142\142\142\147\0\0\0\53\0\16' |
| 83 | return |
| 84 | ;; |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 85 | 5d8e6fc40f2dab00e6983a48523fe57e621f46434cb58dbd4422fba03380d886) |
| 86 | printf '\165\135\216\157\304\17\55\253\0\346\230\72' && |
| 87 | printf '\110\122\77\345\176\142\37\106\103\114\265' && |
| 88 | printf '\215\275\104\42\373\240\63\200\330\206\170\234' && |
| 89 | printf '\143\142\142\142\147\0\0\0\53\0\16' |
| 90 | return |
| 91 | ;; |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 92 | esac |
| 93 | ;; |
brian m. carlson | de5737c | 2020-07-29 23:14:16 +0000 | [diff] [blame] | 94 | # blob containing "\3\326" |
| 95 | 471819e8c52bf11513f100b2810a8aa0622d5cd3d1c913758a071dd4b3bad8fe) |
| 96 | case "$2" in |
| 97 | '') |
| 98 | printf '\062\170\234\143\276\006\000\000\336\000\332' |
| 99 | return |
| 100 | ;; |
| 101 | esac |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 102 | esac |
| 103 | |
Jeff King | 73c3f0f | 2018-05-04 19:45:01 -0400 | [diff] [blame] | 104 | # If it's not a delta, we can convince pack-objects to generate a pack |
| 105 | # with just our entry, and then strip off the header (12 bytes) and |
| 106 | # trailer (20 bytes). |
| 107 | if test -z "$2" |
| 108 | then |
| 109 | echo "$1" | git pack-objects --stdout >pack_obj.tmp && |
| 110 | size=$(wc -c <pack_obj.tmp) && |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 111 | dd if=pack_obj.tmp bs=1 count=$((size - $(test_oid rawsz) - 12)) skip=12 && |
Jeff King | 73c3f0f | 2018-05-04 19:45:01 -0400 | [diff] [blame] | 112 | rm -f pack_obj.tmp |
| 113 | return |
| 114 | fi |
| 115 | |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 116 | echo >&2 "BUG: don't know how to print $1${2:+ (from $2)}" |
| 117 | return 1 |
| 118 | } |
| 119 | |
| 120 | # Compute and append pack trailer to "$1" |
| 121 | pack_trailer () { |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 122 | test-tool $(test_oid algo) -b <"$1" >trailer.tmp && |
Jeff King | 171bdac | 2013-08-23 20:02:25 -0400 | [diff] [blame] | 123 | cat trailer.tmp >>"$1" && |
| 124 | rm -f trailer.tmp |
| 125 | } |
| 126 | |
| 127 | # Remove any existing packs to make sure that |
| 128 | # whatever we index next will be the pack that we |
| 129 | # actually use. |
| 130 | clear_packs () { |
| 131 | rm -f .git/objects/pack/* |
| 132 | } |
brian m. carlson | db12505 | 2020-02-07 00:52:34 +0000 | [diff] [blame] | 133 | |
| 134 | test_oid_cache <<-EOF |
| 135 | packlib_7_0 sha1:01d7713666f4de822776c7622c10f1b07de280dc |
| 136 | packlib_7_0 sha256:37c8e2c15bb22b912e59b43fd51a4f7e9465ed0b5084c5a1411d991cbe630683 |
| 137 | |
| 138 | packlib_7_76 sha1:e68fe8129b546b101aee9510c5328e7f21ca1d18 |
| 139 | packlib_7_76 sha256:5d8e6fc40f2dab00e6983a48523fe57e621f46434cb58dbd4422fba03380d886 |
| 140 | EOF |