8011048: Possible reading from unmapped memory in UTF8::as_quoted_ascii()

Pass utf_length parameter to UTF8::as_quoted_ascii()

Reviewed-by: dcubed, minqi
This commit is contained in:
Ioi Lam 2013-04-01 14:05:41 -07:00
parent 388d803077
commit ba2c11a93a
3 changed files with 8 additions and 6 deletions

View file

@ -162,7 +162,7 @@ char* Symbol::as_quoted_ascii() const {
const char *ptr = (const char *)&_body[0]; const char *ptr = (const char *)&_body[0];
int quoted_length = UTF8::quoted_ascii_length(ptr, utf8_length()); int quoted_length = UTF8::quoted_ascii_length(ptr, utf8_length());
char* result = NEW_RESOURCE_ARRAY(char, quoted_length + 1); char* result = NEW_RESOURCE_ARRAY(char, quoted_length + 1);
UTF8::as_quoted_ascii(ptr, result, quoted_length + 1); UTF8::as_quoted_ascii(ptr, utf8_length(), result, quoted_length + 1);
return result; return result;
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -180,11 +180,12 @@ int UTF8::quoted_ascii_length(const char* utf8_str, int utf8_length) {
} }
// converts a utf8 string to quoted ascii // converts a utf8 string to quoted ascii
void UTF8::as_quoted_ascii(const char* utf8_str, char* buf, int buflen) { void UTF8::as_quoted_ascii(const char* utf8_str, int utf8_length, char* buf, int buflen) {
const char *ptr = utf8_str; const char *ptr = utf8_str;
const char *utf8_end = ptr + utf8_length;
char* p = buf; char* p = buf;
char* end = buf + buflen; char* end = buf + buflen;
while (*ptr != '\0') { while (ptr < utf8_end) {
jchar c; jchar c;
ptr = UTF8::next(ptr, &c); ptr = UTF8::next(ptr, &c);
if (c >= 32 && c < 127) { if (c >= 32 && c < 127) {
@ -196,6 +197,7 @@ void UTF8::as_quoted_ascii(const char* utf8_str, char* buf, int buflen) {
p += 6; p += 6;
} }
} }
assert(p < end, "sanity");
*p = '\0'; *p = '\0';
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -45,7 +45,7 @@ class UTF8 : AllStatic {
static int quoted_ascii_length(const char* utf8_str, int utf8_length); static int quoted_ascii_length(const char* utf8_str, int utf8_length);
// converts a utf8 string to quoted ascii // converts a utf8 string to quoted ascii
static void as_quoted_ascii(const char* utf8_str, char* buf, int buflen); static void as_quoted_ascii(const char* utf8_str, int utf8_length, char* buf, int buflen);
// converts a quoted ascii string to utf8 string. returns the original // converts a quoted ascii string to utf8 string. returns the original
// string unchanged if nothing needs to be done. // string unchanged if nothing needs to be done.