diff options
| author | Doug Ledford <dledford@redhat.com> | 2015-09-25 17:46:07 +0300 | 
|---|---|---|
| committer | Doug Ledford <dledford@redhat.com> | 2015-09-25 17:46:07 +0300 | 
| commit | 310b7cec8ea32dcd4e9978423717ce78dd89d45d (patch) | |
| tree | ed7de6ce3c25829d0e7de10d0db9b83c725ee327 /lib/string_helpers.c | |
| parent | e116a64fab650aed3d7b9b4db0b59c07f361bc9f (diff) | |
| parent | 1f93e4a96c9109378204c147b3eec0d0e8100fde (diff) | |
| download | linux-310b7cec8ea32dcd4e9978423717ce78dd89d45d.tar.xz | |
Merge tag 'v4.3-rc2' into k.o/for-4.3-v1
Linux 4.3-rc2
Diffstat (limited to 'lib/string_helpers.c')
| -rw-r--r-- | lib/string_helpers.c | 26 | 
1 files changed, 16 insertions, 10 deletions
| diff --git a/lib/string_helpers.c b/lib/string_helpers.c index c98ae818eb4e..5939f63d90cd 100644 --- a/lib/string_helpers.c +++ b/lib/string_helpers.c @@ -59,7 +59,11 @@ void string_get_size(u64 size, u64 blk_size, const enum string_size_units units,  	}  	exp = divisor[units] / (u32)blk_size; -	if (size >= exp) { +	/* +	 * size must be strictly greater than exp here to ensure that remainder +	 * is greater than divisor[units] coming out of the if below. +	 */ +	if (size > exp) {  		remainder = do_div(size, divisor[units]);  		remainder *= blk_size;  		i++; @@ -410,7 +414,7 @@ static bool escape_hex(unsigned char c, char **dst, char *end)   * @dst:	destination buffer (escaped)   * @osz:	destination buffer size   * @flags:	combination of the flags (bitwise OR): - *	%ESCAPE_SPACE: + *	%ESCAPE_SPACE: (special white space, not space itself)   *		'\f' - form feed   *		'\n' - new line   *		'\r' - carriage return @@ -432,16 +436,18 @@ static bool escape_hex(unsigned char c, char **dst, char *end)   *		all previous together   *	%ESCAPE_HEX:   *		'\xHH' - byte with hexadecimal value HH (2 digits) - * @esc:	NULL-terminated string of characters any of which, if found in - *		the source, has to be escaped + * @only:	NULL-terminated string containing characters used to limit + *		the selected escape class. If characters are included in @only + *		that would not normally be escaped by the classes selected + *		in @flags, they will be copied to @dst unescaped.   *   * Description:   * The process of escaping byte buffer includes several parts. They are applied   * in the following sequence.   *	1. The character is matched to the printable class, if asked, and in   *	   case of match it passes through to the output. - *	2. The character is not matched to the one from @esc string and thus - *	   must go as is to the output. + *	2. The character is not matched to the one from @only string and thus + *	   must go as-is to the output.   *	3. The character is checked if it falls into the class given by @flags.   *	   %ESCAPE_OCTAL and %ESCAPE_HEX are going last since they cover any   *	   character. Note that they actually can't go together, otherwise @@ -458,11 +464,11 @@ static bool escape_hex(unsigned char c, char **dst, char *end)   * dst for a '\0' terminator if and only if ret < osz.   */  int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz, -		      unsigned int flags, const char *esc) +		      unsigned int flags, const char *only)  {  	char *p = dst;  	char *end = p + osz; -	bool is_dict = esc && *esc; +	bool is_dict = only && *only;  	while (isz--) {  		unsigned char c = *src++; @@ -471,7 +477,7 @@ int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,  		 * Apply rules in the following sequence:  		 *	- the character is printable, when @flags has  		 *	  %ESCAPE_NP bit set -		 *	- the @esc string is supplied and does not contain a +		 *	- the @only string is supplied and does not contain a  		 *	  character under question  		 *	- the character doesn't fall into a class of symbols  		 *	  defined by given @flags @@ -479,7 +485,7 @@ int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,  		 * output buffer.  		 */  		if ((flags & ESCAPE_NP && isprint(c)) || -		    (is_dict && !strchr(esc, c))) { +		    (is_dict && !strchr(only, c))) {  			/* do nothing */  		} else {  			if (flags & ESCAPE_SPACE && escape_space(c, &p, end)) | 
