Bläddra i källkod

[CPUFREQ] fix show_trans_table

Fix show_trans_table when it overflows PAGE_SIZE.

* Not all snprintf calls were protected against being passed a negative
length.
* When show_trans_table overflows, len might be > PAGE_SIZE. In that case,
returns PAGE_SIZE.

Signed-off-by: Cesar Eduardo Barros <cesarb@cesarb.net>
Signed-off-by: Dave Jones <davej@codemonkey.org.uk>
Cesar Eduardo Barros 17 år sedan
förälder
incheckning
25aca347d4
1 ändrade filer med 5 tillägg och 1 borttagningar
  1. 5 1
      drivers/cpufreq/cpufreq_stats.c

+ 5 - 1
drivers/cpufreq/cpufreq_stats.c

@@ -114,7 +114,7 @@ show_trans_table(struct cpufreq_policy *policy, char *buf)
 				stat->freq_table[i]);
 				stat->freq_table[i]);
 	}
 	}
 	if (len >= PAGE_SIZE)
 	if (len >= PAGE_SIZE)
-		return len;
+		return PAGE_SIZE;
 
 
 	len += snprintf(buf + len, PAGE_SIZE - len, "\n");
 	len += snprintf(buf + len, PAGE_SIZE - len, "\n");
 
 
@@ -131,8 +131,12 @@ show_trans_table(struct cpufreq_policy *policy, char *buf)
 			len += snprintf(buf + len, PAGE_SIZE - len, "%9u ",
 			len += snprintf(buf + len, PAGE_SIZE - len, "%9u ",
 					stat->trans_table[i*stat->max_state+j]);
 					stat->trans_table[i*stat->max_state+j]);
 		}
 		}
+		if (len >= PAGE_SIZE)
+			break;
 		len += snprintf(buf + len, PAGE_SIZE - len, "\n");
 		len += snprintf(buf + len, PAGE_SIZE - len, "\n");
 	}
 	}
+	if (len >= PAGE_SIZE)
+		return PAGE_SIZE;
 	return len;
 	return len;
 }
 }
 CPUFREQ_STATDEVICE_ATTR(trans_table,0444,show_trans_table);
 CPUFREQ_STATDEVICE_ATTR(trans_table,0444,show_trans_table);