From: "J. Bruce Fields" <bfie...@redhat.com> I've seen a couple examples recently where we've gotten this wrong. Maybe something like this would help? Is there some better way?
(Approximation due to Jim Rees). Signed-off-by: J. Bruce Fields <bfie...@redhat.com> --- include/linux/string.h | 6 ++++++ net/sunrpc/cache.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/linux/string.h b/include/linux/string.h index ffe0442..d4809b7 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -126,6 +126,12 @@ extern void argv_free(char **argv); extern bool sysfs_streq(const char *s1, const char *s2); extern int strtobool(const char *s, bool *res); +/* + * length of the decimal representation of an unsigned integer. Just an + * approximation, but it's right for types of size 1 to 36 bytes: + */ +#define base10len(i) (sizeof(i) * 24 / 10 + 1) + #ifdef CONFIG_BINARY_PRINTF int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args); int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf); diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 2afd2a8..1dcd2b3 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -1409,7 +1409,7 @@ static ssize_t read_flush(struct file *file, char __user *buf, size_t count, loff_t *ppos, struct cache_detail *cd) { - char tbuf[20]; + char tbuf[base10len(long) + 2]; unsigned long p = *ppos; size_t len; -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/