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

Attachment: signature.asc
Description: PGP signature

Reply via email to