diff options
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 23 | ||||
| -rw-r--r-- | include/linux/string.h | 4 | ||||
| -rw-r--r-- | lib/string.c | 39 | 
3 files changed, 65 insertions, 1 deletions
| diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index ed2640c3e..8ab83036f 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2477,10 +2477,29 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)  }  #ifdef CONFIG_SYS_NAND_ONFI_DETECTION +/* + * sanitize ONFI strings so we can safely print them + */ +static void sanitize_string(char *s, size_t len) +{ +	ssize_t i; + +	/* null terminate */ +	s[len - 1] = 0; + +	/* remove non printable chars */ +	for (i = 0; i < len - 1; i++) { +		if (s[i] < ' ' || s[i] > 127) +			s[i] = '?'; +	} + +	/* remove trailing spaces */ +	strim(s); +} +  static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)  {  	int i; -  	while (len--) {  		crc ^= *p++ << 8;  		for (i = 0; i < 8; i++) @@ -2541,6 +2560,8 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,  		return 0;  	} +	sanitize_string(p->manufacturer, sizeof(p->manufacturer)); +	sanitize_string(p->model, sizeof(p->model));  	if (!mtd->name)  		mtd->name = p->model;  	mtd->writesize = le32_to_cpu(p->byte_per_page); diff --git a/include/linux/string.h b/include/linux/string.h index 62390399b..9a8cbc24c 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -47,6 +47,10 @@ extern char * strchr(const char *,int);  #ifndef __HAVE_ARCH_STRRCHR  extern char * strrchr(const char *,int);  #endif +extern char * skip_spaces(const char *); + +extern char *strim(char *); +  #ifndef __HAVE_ARCH_STRSTR  extern char * strstr(const char *,const char *);  #endif diff --git a/lib/string.c b/lib/string.c index 2c4f0ec9a..c3ad055e2 100644 --- a/lib/string.c +++ b/lib/string.c @@ -214,6 +214,45 @@ char * strrchr(const char * s, int c)  }  #endif + +/** + * skip_spaces - Removes leading whitespace from @str. + * @str: The string to be stripped. + * + * Returns a pointer to the first non-whitespace character in @str. + */ +char *skip_spaces(const char *str) +{ +	while (isspace(*str)) +		++str; +	return (char *)str; +} + +/** + * strim - Removes leading and trailing whitespace from @s. + * @s: The string to be stripped. + * + * Note that the first trailing whitespace is replaced with a %NUL-terminator + * in the given string @s. Returns a pointer to the first non-whitespace + * character in @s. + */ +char *strim(char *s) +{ +	size_t size; +	char *end; + +	s = skip_spaces(s); +	size = strlen(s); +	if (!size) +		return s; + +	end = s + size - 1; +	while (end >= s && isspace(*end)) +		end--; +	*(end + 1) = '\0'; + +	return s; +}  #ifndef __HAVE_ARCH_STRLEN  /**   * strlen - Find the length of a string |