From f8ee357b280161e7d3e04fdf9d3f73643ccfdddb Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Fri, 4 Jan 2013 00:11:30 -0500 Subject: mkinitcpio: avoid using 'file' to get kernel versions The kernel defines an offset at a fixed location within the bzImage which we can use to find the kernel version string. Since this is fairly important, reimplement the algorithm (which file almost surely uses) using low level tools to avoid the possibility that file may break or change its output, critically wounding mkinitcpio. Note that this change leaves 'file' in use for lsinitcpio compression detection. Signed-off-by: Dave Reisner --- bash-completion | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'bash-completion') diff --git a/bash-completion b/bash-completion index aa6efbb..597eab2 100644 --- a/bash-completion +++ b/bash-completion @@ -1,6 +1,14 @@ #!/bin/bash # mkinitcpio bash completion by Seblu +detect_kver() { + local kver_validator='^[[:digit:]]+(\.[[:digit:]]+)+' + offset=$(hexdump -s 526 -n 2 -e '"%0d"' "$1" 2>/dev/null) || return 1 + read kver _ < \ + <(dd if="$1" bs=1 count=127 skip=$(( offset + 0x200 )) 2>/dev/null) + [[ $kver =~ $kver_validator ]] && printf "$kver" +} + _lsinitcpio() { local cur opts opts=(-a --analyze -c --config -h --help -l --list @@ -18,14 +26,14 @@ _lsinitcpio() { _find_kernel_versions() { local -a matches - local dir regex - - # add completions from kernels in /boot - regex="Linux kernel.*version" - while IFS=':' read -r file metadata; do - [[ $metadata =~ $regex ]] || continue - matches+=("$file") - done < <(file -e ascii /boot/*) + local dir f + + for f in /boot/*; do + # only match regular files which pass validation + if [[ ! -L $f && -f $f ]] && kver=$(detect_kver "$f"); then + matches+=("$f") + fi + done # add completions based on kernel versions in /lib/modules for dir in /lib/modules/*/kernel; do -- cgit v1.2.3-24-g4f1b