Git fork
at reftables-rust 140 lines 4.1 kB view raw
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 11uint32_octal () { 12 n=$1 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 )); 17} 18 19# Print the big-endian 4-byte binary representation of $1 20uint32_binary () { 21 printf "$(uint32_octal "$1")" 22} 23 24# Print a pack header, version 2, for a pack with $1 objects 25pack_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. 37pack_obj () { 38 case "$1" in 39 # empty blob 40 $EMPTY_BLOB) 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" 50 $(test_oid packlib_7_76)) 51 case "$2" in 52 '') 53 printf '\062\170\234\143\267\3\0\0\116\0\106' 54 return 55 ;; 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 ;; 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 ;; 69 esac 70 ;; 71 72 # blob containing "\7\0" 73 $(test_oid packlib_7_0)) 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 ;; 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 ;; 92 esac 93 ;; 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 102 esac 103 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) && 111 dd if=pack_obj.tmp bs=1 count=$((size - $(test_oid rawsz) - 12)) skip=12 && 112 rm -f pack_obj.tmp 113 return 114 fi 115 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" 121pack_trailer () { 122 test-tool $(test_oid algo) -b <"$1" >trailer.tmp && 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. 130clear_packs () { 131 rm -f .git/objects/pack/* 132} 133 134test_oid_cache <<-EOF 135packlib_7_0 sha1:01d7713666f4de822776c7622c10f1b07de280dc 136packlib_7_0 sha256:37c8e2c15bb22b912e59b43fd51a4f7e9465ed0b5084c5a1411d991cbe630683 137 138packlib_7_76 sha1:e68fe8129b546b101aee9510c5328e7f21ca1d18 139packlib_7_76 sha256:5d8e6fc40f2dab00e6983a48523fe57e621f46434cb58dbd4422fba03380d886 140EOF