@@ -127,6 +127,8 @@ pin_upstream_deps() {
127127 if [[ -z " ${resolved_version} " ]]; then
128128 local tmp_dir
129129 tmp_dir=$( mktemp -d)
130+ # # Ensure the temp dir is removed on early exit (e.g. codeql pack upgrade failure)
131+ trap ' rm -rf "${tmp_dir}"' RETURN
130132 local extractor
131133 extractor=$( grep -m1 " ^extractor:" " ${qlpack_yml} " | awk ' {print $2}' || echo " javascript" )
132134 cat > " ${tmp_dir} /qlpack.yml" << TMPEOF
@@ -142,6 +144,7 @@ TMPEOF
142144 | sed ' s/.*version:[[:space:]]*//' | head -1)
143145 fi
144146 rm -rf " ${tmp_dir} "
147+ trap - RETURN
145148 fi
146149
147150 if [[ -z " ${resolved_version} " ]]; then
@@ -160,9 +163,13 @@ TMPEOF
160163 # # Replace in file — try both unquoted-key and quoted-key forms
161164 # # Form 1: codeql/dep-name: "X.Y.Z"
162165 # # Form 2: "codeql/dep-name": "X.Y.Z"
163- sed -i.bak " s|${dep_name} : ${dep_old_value} |${dep_name} : ${new_value} |" " ${qlpack_yml} "
166+ # # Escape values for safe use in sed search patterns
167+ local sed_dep_name sed_dep_old_value
168+ sed_dep_name=$( printf ' %s\n' " ${dep_name} " | sed ' s/[][.^$*+?{}()|\/]/\\&/g' )
169+ sed_dep_old_value=$( printf ' %s\n' " ${dep_old_value} " | sed ' s/[][.^$*+?{}()|\/]/\\&/g' )
170+ sed -i.bak " s|${sed_dep_name} : ${sed_dep_old_value} |${dep_name} : ${new_value} |" " ${qlpack_yml} "
164171 rm -f " ${qlpack_yml} .bak"
165- sed -i.bak " s|\" ${dep_name } \" : ${dep_old_value } |\" ${dep_name} \" : ${new_value} |" " ${qlpack_yml} "
172+ sed -i.bak " s|\" ${sed_dep_name } \" : ${sed_dep_old_value } |\" ${dep_name} \" : ${new_value} |" " ${qlpack_yml} "
166173 rm -f " ${qlpack_yml} .bak"
167174 echo " ✅ ${dep_name} : ${dep_old_value} -> ${new_value} "
168175 done <<< " ${dep_lines}"
0 commit comments