diff --git a/src/image.sh b/src/image.sh index 5246849b..6bdc3693 100644 --- a/src/image.sh +++ b/src/image.sh @@ -806,6 +806,42 @@ detectImage() { return 0 } +normalizeBatch() { + + local file="$1" + local bom tmp encoding + + [ ! -f "$file" ] && return 0 + [ ! -s "$file" ] && return 0 + + bom=$(od -An -N2 -tx1 "$file" | tr -d ' \n') || return 1 + + case "$bom" in + "fffe" ) encoding="UTF-16LE" ;; + "feff" ) encoding="UTF-16BE" ;; + * ) return 0 ;; + esac + + if ! tmp=$(mktemp "${file}.XXXXXX"); then + error "Failed to create temporary batch file!" + return 1 + fi + + if ! tail -c +3 "$file" | iconv -f "$encoding" -t UTF-8 > "$tmp"; then + rm -f "$tmp" + error "Failed to convert $file from $encoding to UTF-8!" + return 1 + fi + + if ! chmod --reference="$file" "$tmp" || ! mv -f "$tmp" "$file"; then + rm -f "$tmp" + error "Failed to replace batch file: $file" + return 1 + fi + + return 0 +} + checkBatch() { local file="$1" @@ -813,7 +849,7 @@ checkBatch() { local tmp output local matches line - [ ! -f "$file" ] && return 0 + [ -s "$file" ] || return 0 if ! tmp=$(mktemp -d /tmp/blinter.XXXXXX); then warn "failed to create temporary Blinter directory." @@ -824,14 +860,20 @@ checkBatch() { [ -n "${COMMAND:-}" ] && source="your COMMAND variable" if enabled "$DEBUG"; then + report="Y" + + if LC_ALL=C grep -Pq '[^\x09\x0D\x20-\x7E]' "$file"; then + warn "non-ASCII characters were detected in $source and may not execute correctly in Windows Command Prompt." + fi + else # First pass: silently check only for Error-level findings. - cat > "$tmp/blinter.ini" <<'EOF' + cat > "$tmp/blinter.ini" <<'EOC' [general] min_severity = error -EOF +EOC if ! ( cd "$tmp" @@ -846,14 +888,14 @@ EOF # Show useful diagnostic context, while excluding findings that are # irrelevant to unattended OEM scripts. - cat > "$tmp/blinter.ini" <<'EOF' + cat > "$tmp/blinter.ini" <<'EOC' [general] min_severity = warning show_summary = false [rules] disabled_rules = W001,W028,W041,SEC002,SEC005 -EOF +EOC output=$( cd "$tmp" diff --git a/src/install.sh b/src/install.sh index 1bc0a2d1..35a2b960 100644 --- a/src/install.sh +++ b/src/install.sh @@ -820,6 +820,10 @@ addFolder() { file=$(find "$dest" -maxdepth 1 -type f -iname install.bat -print -quit) || return 1 + if [ -s "$file" ]; then + normalizeBatch "$file" || return 1 + fi + if [ -n "$COMMAND" ]; then [ -z "$file" ] && file="$dest/install.bat" @@ -832,7 +836,7 @@ addFolder() { fi - if [ -f "$file" ]; then + if [ -s "$file" ]; then if ! unix2dos -q "$file"; then error "Failed to convert $file to DOS format!"