Извлечение утечки памяти PKCS7 контейнера во время проверки поступления - PullRequest
0 голосов
/ 08 мая 2018

XCode обнаружил утечки памяти в одной из моих функций: enter image description here

Функция отвечает за извлечение контейнера PKCS7. Вот код функции:

func extractPKCS7Container() throws -> UnsafeMutablePointer<PKCS7> {
    guard let receiptURL = Bundle.main.appStoreReceiptURL,
        let certificateURL = Bundle.main.url(forResource: "AppleIncRootCertificate", withExtension: "cer"),
        let receiptData = NSData(contentsOf: receiptURL),
        let certificateData = NSData(contentsOf: certificateURL) else {
            throw ReceiptError.couldNotFindReceipt
    }
    let bio = BIOWrapper(data: receiptData)
    let p7 = d2i_PKCS7_bio(bio.bio, nil)
    guard p7 != nil else {
        throw ReceiptError.emptyReceiptContents
    }
    OpenSSL_add_all_digests()

    let x509Store = X509StoreWrapper()
    let certificate = X509Wrapper(data: certificateData)
    x509Store.addCert(x509: certificate)
    let payload = BIOWrapper()
    guard PKCS7_verify(p7, nil, x509Store.store, nil, payload.bio, 0) == 1 else {
        throw ReceiptError.receiptNotSigned
    }
    return p7!
}

У меня также есть дополнительные занятия:

class BIOWrapper {
    let bio = BIO_new(BIO_s_mem())
    init(data:NSData) {
        BIO_write(bio, data.bytes, Int32(data.length))
    }
    init() {}
    deinit {
        BIO_free(bio)
    }
}

class X509StoreWrapper {
    let store = X509_STORE_new()
    deinit {
        X509_STORE_free(store)
    }
    func addCert(x509:X509Wrapper) {
        X509_STORE_add_cert(store, x509.x509)
    }
}

class X509Wrapper {
    let x509 : UnsafeMutablePointer<X509>!
    init(data:NSData){
        let certBIO = BIOWrapper(data: data)
        x509 = d2i_X509_bio(certBIO.bio, nil)
    }
    deinit {
        X509_free(x509)
    }
}

У всех упаковщиков есть раздел init и deinit. Другие функции из встроенного модуля Crypto ... Честно говоря, я понятия не имею, утечка может быть здесь. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 08 мая 2018

Вы выделяете объект PKCS7, но кажется, что вы никогда не звоните PKCS7_free. Например, вам нужно будет позвонить прямо перед throw ReceiptError.receiptNotSigned.

Обратите внимание, что в трассировке стека справа отсутствуют кадры стека. Вы можете просмотреть их, нажав на значок, который выглядит как квадрат с линией выше и ниже. Таким образом, вы точно знаете, какой вызов функции ответственен за распределение (и, следовательно, вероятно, что именно просочилось).

...