Control: tags 727731 + patch The attached patch to fancontrol adds a bunch of improved shell escaping, and makes the change that Boris Gjenero suggests. This resolves the problem for me.
Regards, --dkg
diff --git a/prog/pwm/fancontrol b/prog/pwm/fancontrol index 2de9ba6..3935307 100755 --- a/prog/pwm/fancontrol +++ b/prog/pwm/fancontrol @@ -55,21 +55,21 @@ function LoadConfig fi # grep configuration from file - INTERVAL=`egrep '^INTERVAL=.*$' $1 | sed -e 's/INTERVAL=//g'` - DEVPATH=`egrep '^DEVPATH=.*$' $1 | sed -e 's/DEVPATH= *//g'` - DEVNAME=`egrep '^DEVNAME=.*$' $1 | sed -e 's/DEVNAME= *//g'` - FCTEMPS=`egrep '^FCTEMPS=.*$' $1 | sed -e 's/FCTEMPS=//g'` - MINTEMP=`egrep '^MINTEMP=.*$' $1 | sed -e 's/MINTEMP=//g'` - MAXTEMP=`egrep '^MAXTEMP=.*$' $1 | sed -e 's/MAXTEMP=//g'` - MINSTART=`egrep '^MINSTART=.*$' $1 | sed -e 's/MINSTART=//g'` - MINSTOP=`egrep '^MINSTOP=.*$' $1 | sed -e 's/MINSTOP=//g'` + INTERVAL=`egrep '^INTERVAL=.*$' "$1" | sed -e 's/INTERVAL=//g'` + DEVPATH=`egrep '^DEVPATH=.*$' "$1" | sed -e 's/DEVPATH= *//g'` + DEVNAME=`egrep '^DEVNAME=.*$' "$1" | sed -e 's/DEVNAME= *//g'` + FCTEMPS=`egrep '^FCTEMPS=.*$' "$1" | sed -e 's/FCTEMPS=//g'` + MINTEMP=`egrep '^MINTEMP=.*$' "$1" | sed -e 's/MINTEMP=//g'` + MAXTEMP=`egrep '^MAXTEMP=.*$' "$1" | sed -e 's/MAXTEMP=//g'` + MINSTART=`egrep '^MINSTART=.*$' "$1" | sed -e 's/MINSTART=//g'` + MINSTOP=`egrep '^MINSTOP=.*$' "$1" | sed -e 's/MINSTOP=//g'` # optional settings: - FCFANS=`egrep '^FCFANS=.*$' $1 | sed -e 's/FCFANS=//g'` - MINPWM=`egrep '^MINPWM=.*$' $1 | sed -e 's/MINPWM=//g'` - MAXPWM=`egrep '^MAXPWM=.*$' $1 | sed -e 's/MAXPWM=//g'` + FCFANS=`egrep '^FCFANS=.*$' "$1" | sed -e 's/FCFANS=//g'` + MINPWM=`egrep '^MINPWM=.*$' "$1" | sed -e 's/MINPWM=//g'` + MAXPWM=`egrep '^MAXPWM=.*$' "$1" | sed -e 's/MAXPWM=//g'` # Check whether all mandatory settings are set - if [[ -z ${INTERVAL} || -z ${FCTEMPS} || -z ${MINTEMP} || -z ${MAXTEMP} || -z ${MINSTART} || -z ${MINSTOP} ]] + if [[ -z "${INTERVAL}" || -z "${FCTEMPS}" || -z "${MINTEMP}" || -z "${MAXTEMP}" || -z "${MINSTART}" || -z "${MINSTOP}" ]] then echo "Some mandatory settings missing, please check your config file!" >&2 exit 1 @@ -89,21 +89,21 @@ function LoadConfig let fcvcount=0 for fcv in $FCTEMPS do - if ! echo $fcv | egrep -q '=' + if ! printf '%s' "$fcv" | egrep -q '=' then echo "Error in configuration file:" >&2 echo "FCTEMPS value is improperly formatted" >&2 exit 1 fi - AFCPWM[$fcvcount]=`echo $fcv |cut -d'=' -f1` - AFCTEMP[$fcvcount]=`echo $fcv |cut -d'=' -f2` - AFCFAN[$fcvcount]=`echo $FCFANS |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` - AFCMINTEMP[$fcvcount]=`echo $MINTEMP |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` - AFCMAXTEMP[$fcvcount]=`echo $MAXTEMP |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` - AFCMINSTART[$fcvcount]=`echo $MINSTART |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` - AFCMINSTOP[$fcvcount]=`echo $MINSTOP |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` - AFCMINPWM[$fcvcount]=`echo $MINPWM |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` + AFCPWM[$fcvcount]=`printf '%s' "$fcv" |cut -d'=' -f1` + AFCTEMP[$fcvcount]=`printf '%s' "$fcv" |cut -d'=' -f2` + AFCFAN[$fcvcount]=`printf '%s' "$FCFANS" |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` + AFCMINTEMP[$fcvcount]=`printf '%s' "$MINTEMP" |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` + AFCMAXTEMP[$fcvcount]=`printf '%s' "$MAXTEMP" |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` + AFCMINSTART[$fcvcount]=`printf '%s' "$MINSTART" |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` + AFCMINSTOP[$fcvcount]=`printf '%s' "$MINSTOP" |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` + AFCMINPWM[$fcvcount]=`printf '%s' "$MINPWM" |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` [ -z "${AFCMINPWM[$fcvcount]}" ] && AFCMINPWM[$fcvcount]=0 AFCMAXPWM[$fcvcount]=`echo $MAXPWM |sed -e 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2` [ -z "${AFCMAXPWM[$fcvcount]}" ] && AFCMAXPWM[$fcvcount]=255 @@ -181,8 +181,8 @@ function ValidateDevices() for entry in $OLD_DEVPATH do - device=`echo "$entry" | sed -e 's/=[^=]*$//'` - path=`echo "$entry" | sed -e 's/^[^=]*=//'` + device=`printf '%s' "$entry" | sed -e 's/=[^=]*$//'` + path=`printf '%s' "$entry" | sed -e 's/^[^=]*=//'` if [ "`DevicePath "$device"`" != "$path" ] then @@ -193,8 +193,8 @@ function ValidateDevices() for entry in $OLD_DEVNAME do - device=`echo "$entry" | sed -e 's/=[^=]*$//'` - name=`echo "$entry" | sed -e 's/^[^=]*=//'` + device=`printf '%s' "$entry" | sed -e 's/=[^=]*$//'` + name=`printf '%s' "$entry" | sed -e 's/^[^=]*=//'` if [ "`DeviceName "$device"`" != "$name" ] then @@ -203,7 +203,7 @@ function ValidateDevices() fi done - return $outdated + return "$outdated" } # Check that all referenced sysfs files exist @@ -265,7 +265,7 @@ if [ "$1" == "--check" ] then if [ -f "$2" ] then - LoadConfig $2 + LoadConfig "$2" else LoadConfig /etc/fancontrol fi @@ -274,7 +274,7 @@ fi if [ -f "$1" ] then - LoadConfig $1 + LoadConfig "$1" else LoadConfig /etc/fancontrol fi @@ -329,63 +329,63 @@ echo $$ > "$PIDFILE" # $1 = pwm file name function pwmdisable() { - local ENABLE=${1}_enable + local ENABLE="${1}_enable" # No enable file? Just set to max - if [ ! -f $ENABLE ] + if [ ! -f "$ENABLE" ] then - echo $MAX > $1 + printf '%s\n' "$MAX" > "$1" return 0 fi # Try pwmN_enable=0 - echo 0 > $ENABLE 2> /dev/null - if [ `cat $ENABLE` -eq 0 ] + echo 0 > "$ENABLE" 2> /dev/null + if [ `cat "$ENABLE"` -eq 0 ] then # Success return 0 fi # It didn't work, try pwmN_enable=1 pwmN=255 - echo 1 > $ENABLE 2> /dev/null - echo $MAX > $1 - if [ `cat $ENABLE` -eq 1 -a `cat $1` -ge 190 ] + echo 1 > "$ENABLE" 2> /dev/null + printf '%s\n' "$MAX" > $1 + if [ `cat "$ENABLE"` -eq 1 -a `cat "$1"` -ge 190 ] then # Success return 0 fi # Nothing worked - echo "$ENABLE stuck to" `cat $ENABLE` >&2 + printf "%s stuck to %s\n" "$ENABLE" "$(cat "$ENABLE")" >&2 return 1 } # $1 = pwm file name function pwmenable() { - local ENABLE=${1}_enable + local ENABLE="${1}_enable" - if [ -f $ENABLE ] + if [ -f "$ENABLE" ] then - echo 1 > $ENABLE 2> /dev/null + echo 1 > "$ENABLE" 2> /dev/null if [ $? -ne 0 ] then return 1 fi fi - echo $MAX > $1 + printf '%s\n' "$MAX" > "$1" } function restorefans() { - local status=$1 fcvcount pwmo + local status="$1" fcvcount pwmo echo 'Aborting, restoring fans...' let fcvcount=0 while (( $fcvcount < ${#AFCPWM[@]} )) # go through all pwm outputs do pwmo=${AFCPWM[$fcvcount]} - pwmdisable $pwmo + pwmdisable "$pwmo" let fcvcount=$fcvcount+1 done echo 'Verify fans have returned to full speed' @@ -418,29 +418,29 @@ function UpdateFanSpeeds minpwm=${AFCMINPWM[$fcvcount]} maxpwm=${AFCMAXPWM[$fcvcount]} - read tval < ${tsens} + read tval < "${tsens}" if [ $? -ne 0 ] then echo "Error reading temperature from $DIR/$tsens" restorefans 1 fi - read pwmpval < ${pwmo} + read pwmpval < "${pwmo}" if [ $? -ne 0 ] then echo "Error reading PWM value from $DIR/$pwmo" restorefans 1 fi + min_fanval=100000 # If fanspeed-sensor output shall be used, do it - if [[ -n ${fan} ]] + if [[ -n "${fan}" ]] then - min_fanval=100000 fanval= # A given PWM output can control several fans - for one_fan in $(echo $fan | sed -e 's/+/ /') + for one_fan in $(printf '%s' "$fan" | sed -e 's/+/ /') do - read one_fanval < ${one_fan} + read one_fanval < "${one_fan}" if [ $? -ne 0 ] then echo "Error reading Fan value from $DIR/$one_fan" >&2 @@ -448,14 +448,14 @@ function UpdateFanSpeeds fi # Remember the minimum, it only matters if it is 0 - if [ $one_fanval -lt $min_fanval ] + if [ "$one_fanval" -lt "$min_fanval" ] then - min_fanval=$one_fanval + min_fanval="$one_fanval" fi if [ -z "$fanval" ] then - fanval=$one_fanval + fanval="$one_fanval" else fanval="$fanval/$one_fanval" fi @@ -482,22 +482,22 @@ function UpdateFanSpeeds echo "min_fanval=$min_fanval" fi - if (( $tval <= $mint )) - then pwmval=$minpwm # below min temp, use defined min pwm - elif (( $tval >= $maxt )) - then pwmval=$maxpwm # over max temp, use defined max pwm + if (( "$tval" <= "$mint" )) + then pwmval="$minpwm" # below min temp, use defined min pwm + elif (( "$tval" >= "$maxt" )) + then pwmval="$maxpwm" # over max temp, use defined max pwm else # calculate the new value from temperature and settings pwmval="(${tval}-${mint})*(${maxpwm}-${minso})/(${maxt}-${mint})+${minso}" - if [ $pwmpval -eq 0 -o $min_fanval -eq 0 ] + if [ "$pwmpval" -eq 0 -o "$min_fanval" -eq 0 ] then # if fan was stopped start it using a safe value - echo $minsa > $pwmo + printf '%s\n' "$minsa" > "$pwmo" # Sleep while still handling signals sleep 1 & wait $! fi fi - echo $pwmval > $pwmo # write new value to pwm output + echo "$pwmval" > "$pwmo" # write new value to pwm output if [ $? -ne 0 ] then echo "Error writing PWM value to $DIR/$pwmo" >&2 @@ -516,7 +516,7 @@ let fcvcount=0 while (( $fcvcount < ${#AFCPWM[@]} )) # go through all pwm outputs do pwmo=${AFCPWM[$fcvcount]} - pwmenable $pwmo + pwmenable "$pwmo" if [ $? -ne 0 ] then echo "Error enabling PWM on $DIR/$pwmo" >&2 @@ -532,6 +532,6 @@ while true do UpdateFanSpeeds # Sleep while still handling signals - sleep $INTERVAL & + sleep "$INTERVAL" & wait $! done
signature.asc
Description: PGP signature