[PATCH 1/1] udf: UBUNTU: SAUCE (drop after 2.6.30): Fix oops when invalid character in filename occurs

Tim Gardner tim.gardner at canonical.com
Fri Mar 20 02:05:57 UTC 2009


Stefan Bader wrote:
> From: Jan Kara <jack at suse.cz>
> 
> Bug: #321606
> 
> Not upstream, yet. Queued to linux-next
> 
> udf: Fix oops when invalid character in filename occurs
> 
> Functions udf_CS0toNLS() and udf_NLStoCS0() didn't count with the fact that
> NLS can return negative length when invalid character is given to it for
> conversion. Thus interesting things could happen (such as overwriting random
> memory with the rest of filename). Add appropriate checks.
> 
> Signed-off-by: Jan Kara <jack at suse.cz>
> Signed-off-by: Stefan.Bader <stefan.bader at canonical.com>
> ---
>  fs/udf/unicode.c |   21 ++++++++++++++++-----
>  1 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c
> index 9fdf8c9..7215153 100644
> --- a/fs/udf/unicode.c
> +++ b/fs/udf/unicode.c
> @@ -254,7 +254,7 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o,
>  {
>  	const uint8_t *ocu;
>  	uint8_t cmp_id, ocu_len;
> -	int i;
> +	int i, len;
>  
>  
>  	ocu_len = ocu_i->u_len;
> @@ -279,8 +279,13 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o,
>  		if (cmp_id == 16)
>  			c = (c << 8) | ocu[i++];
>  
> -		utf_o->u_len += nls->uni2char(c, &utf_o->u_name[utf_o->u_len],
> -					      UDF_NAME_LEN - utf_o->u_len);
> +		len = nls->uni2char(c, &utf_o->u_name[utf_o->u_len],
> +				    UDF_NAME_LEN - utf_o->u_len);
> +		/* Valid character? */
> +		if (len >= 0)
> +			utf_o->u_len += len;
> +		else
> +			utf_o->u_name[utf_o->u_len++] = '?';
>  	}
>  	utf_o->u_cmpID = 8;
>  
> @@ -290,7 +295,8 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o,
>  static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni,
>  			int length)
>  {
> -	unsigned len, i, max_val;
> +	int len;
> +	unsigned i, max_val;
>  	uint16_t uni_char;
>  	int u_len;
>  
> @@ -302,8 +308,13 @@ try_again:
>  	u_len = 0U;
>  	for (i = 0U; i < uni->u_len; i++) {
>  		len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char);
> -		if (len <= 0)
> +		if (!len)
>  			continue;
> +		/* Invalid character, deal with it */
> +		if (len < 0) {
> +			len = 1;
> +			uni_char = '?';
> +		}
>  
>  		if (uni_char > max_val) {
>  			max_val = 0xffffU;

ACK - why don't you think it'll make the 2.6.30 merge window?

-- 
Tim Gardner tim.gardner at canonical.com




More information about the kernel-team mailing list