Bug 655435 - Fix leak in Atomize (r=njn,cdleary)

This commit is contained in:
Luke Wagner
2011-05-12 13:15:36 -07:00
parent 8533cacd2c
commit 640f965b63

View File

@@ -458,11 +458,14 @@ js_SweepAtomState(JSContext *cx)
}
/*
* This call takes ownership of 'chars' if ATOM_NOCOPY is set.
* Callers passing ATOM_NOCOPY have freshly allocated *pchars and thus this
* memory can be used as a new JSAtom's buffer without copying. When this flag
* is set, the contract is that callers will free *pchars iff *pchars == NULL.
*/
static JSAtom *
Atomize(JSContext *cx, const jschar *chars, size_t length, uintN flags)
Atomize(JSContext *cx, const jschar **pchars, size_t length, uintN flags)
{
const jschar *chars = *pchars;
JS_ASSERT(!(flags & ~(ATOM_PINNED|ATOM_INTERNED|ATOM_NOCOPY)));
if (JSAtom *s = JSAtom::lookupStatic(chars, length))
@@ -482,10 +485,9 @@ Atomize(JSContext *cx, const jschar *chars, size_t length, uintN flags)
JSFixedString *key;
if (flags & ATOM_NOCOPY) {
key = js_NewString(cx, const_cast<jschar *>(chars), length);
if (!key) {
cx->free_(const_cast<jschar *>(chars));
if (!key)
return NULL;
}
*pchars = NULL; /* Caller should not free *pchars. */
} else {
key = js_NewStringCopyN(cx, chars, length);
if (!key)
@@ -523,7 +525,7 @@ js_AtomizeString(JSContext *cx, JSString *str, uintN flags)
return NULL;
JS_ASSERT(length <= JSString::MAX_LENGTH);
return Atomize(cx, chars, length, flags);
return Atomize(cx, &chars, length, flags);
}
JSAtom *
@@ -562,7 +564,10 @@ js_Atomize(JSContext *cx, const char *bytes, size_t length, uintN flags, bool us
flags |= ATOM_NOCOPY;
}
return Atomize(cx, chars, inflatedLength, flags);
JSAtom *atom = Atomize(cx, &chars, inflatedLength, flags);
if ((flags & ATOM_NOCOPY) && chars)
cx->free_((void *)chars);
return atom;
}
JSAtom *
@@ -574,7 +579,7 @@ js_AtomizeChars(JSContext *cx, const jschar *chars, size_t length, uintN flags)
if (!CheckStringLength(cx, length))
return NULL;
return Atomize(cx, chars, length, flags);
return Atomize(cx, &chars, length, flags);
}
JSAtom *