• Sabrina Dubroca's avatar
    tls: reset crypto_info when do_tls_setsockopt_tx fails · 6db959c8
    Sabrina Dubroca authored
    The current code copies directly from userspace to ctx->crypto_send, but
    doesn't always reinitialize it to 0 on failure. This causes any
    subsequent attempt to use this setsockopt to fail because of the
    TLS_CRYPTO_INFO_READY check, eventhough crypto_info is not actually
    ready.
    
    This should result in a correctly set up socket after the 3rd call, but
    currently it does not:
    
        size_t s = sizeof(struct tls12_crypto_info_aes_gcm_128);
        struct tls12_crypto_info_aes_gcm_128 crypto_good = {
            .info.version = TLS_1_2_VERSION,
            .info.cipher_type = TLS_CIPHER_AES_GCM_128,
        };
    
        struct tls12_crypto_info_aes_gcm_128 crypto_bad_type = crypto_good;
        crypto_bad_type.info.cipher_type = 42;
    
        setsockopt(sock, SOL_TLS, TLS_TX, &crypto_bad_type, s);
        setsockopt(sock, SOL_TLS, TLS_TX, &crypto_good, s - 1);
        setsockopt(sock, SOL_TLS, TLS_TX, &crypto_good, s);
    
    Fixes: 3c4d7559 ("tls: kernel TLS support")
    Signed-off-by: default avatarSabrina Dubroca <sd@queasysnail.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6db959c8
tls_main.c 11.2 KB