On Tue, Oct 12, 2010 at 10:56:05AM +0100, Mark Brown wrote:
On Tue, Oct 12, 2010 at 11:49:27AM +0200, Takashi Iwai wrote:
Mark Brown wrote:
Argh, yes, I'm (again) confused by that behavior. The problem is the potential buffer overflow, indeed. snprintf() returns the size that would be printed. Thus a safe code would be like:
list_for_each_entry(dai, &dai_list, list) { int len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n", dai->name); if (len < 0) continue; ret += len; if (ret >= PAGE_SIZE) { ret = PAGE_SIZE; break; } }
Yes, this form is better for that variant of the loop - that is safe and legible without relying on current implementation details of snprintf().
This is fine with me as well. My original patch had a problem with the WARN_ON() so your version is better.
regards, dan carpenter