Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e74fef3b authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

Fix potential leak in TextLayouCache

- need a copy constructor for the key as the GenerationCache we are using
is actually a KeyedVector<K, sp<Entry<K, V> > >
- use the getText() API to access the text in the cache key

Change-Id: I5b60ebc062b62308ed7ac1284cfe2a9f28e2b8b1
parent 04e3bb6d
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -242,6 +242,22 @@ TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint,
    hinting = paint->getHinting();
}

TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) :
        text(NULL),
        textCopy(other.textCopy),
        contextCount(other.contextCount),
        dirFlags(other.dirFlags),
        typeface(other.typeface),
        textSize(other.textSize),
        textSkewX(other.textSkewX),
        textScaleX(other.textScaleX),
        flags(other.flags),
        hinting(other.hinting) {
    if (other.text) {
        textCopy.setTo(other.text);
    }
}

bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const {
    LTE_INT(count) {
        LTE_INT(contextCount) {
@@ -253,7 +269,7 @@ bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const {
                                LTE_INT(flags) {
                                    LTE_INT(hinting) {
                                        LTE_INT(dirFlags) {
                                            return strncmp16(text, rhs.text, contextCount) < 0;
                                            return strncmp16(getText(), rhs.getText(), contextCount) < 0;
                                        }
                                    }
                                }
@@ -269,7 +285,7 @@ bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const {

void TextLayoutCacheKey::internalTextCopy() {
    textCopy.setTo(text, contextCount);
    text = textCopy.string();
    text = NULL;
}

size_t TextLayoutCacheKey::getSize() {
+7 −1
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@ public:
            const UChar* text, size_t start, size_t count,
            size_t contextCount, int dirFlags);

    TextLayoutCacheKey(const TextLayoutCacheKey& other);

    bool operator<(const TextLayoutCacheKey& rhs) const;

    /**
@@ -86,7 +88,7 @@ public:
    size_t getSize();

private:
    const UChar* text;
    const UChar* text; // if text is NULL, use textCopy
    String16 textCopy;
    size_t start;
    size_t count;
@@ -98,6 +100,10 @@ private:
    SkScalar textScaleX;
    uint32_t flags;
    SkPaint::Hinting hinting;

    inline const UChar* getText() const {
        return text ? text : textCopy.string();
    }
}; // TextLayoutCacheKey

/*