]> err.no Git - linux-2.6/blobdiff - fs/ecryptfs/keystore.c
x86: pull bp calculation earlier into the backtrace path
[linux-2.6] / fs / ecryptfs / keystore.c
index e9cda7afe6be9498078bcb2c7630a01ec15bebb6..f458c1f355655fcee80e3b8d4346d611686f3bc9 100644 (file)
@@ -39,7 +39,7 @@
  * determine the type of error, make appropriate log entries, and
  * return an error code.
  */
-int process_request_key_err(long err_code)
+static int process_request_key_err(long err_code)
 {
        int rc = 0;
 
@@ -396,6 +396,27 @@ out:
        return rc;
 }
 
+static int
+ecryptfs_get_auth_tok_sig(char **sig, struct ecryptfs_auth_tok *auth_tok)
+{
+       int rc = 0;
+
+       (*sig) = NULL;
+       switch (auth_tok->token_type) {
+       case ECRYPTFS_PASSWORD:
+               (*sig) = auth_tok->token.password.signature;
+               break;
+       case ECRYPTFS_PRIVATE_KEY:
+               (*sig) = auth_tok->token.private_key.signature;
+               break;
+       default:
+               printk(KERN_ERR "Cannot get sig for auth_tok of type [%d]\n",
+                      auth_tok->token_type);
+               rc = -EINVAL;
+       }
+       return rc;
+}
+
 /**
  * decrypt_pki_encrypted_session_key - Decrypt the session key with the given auth_tok.
  * @auth_tok: The key authentication token used to decrypt the session key
@@ -415,7 +436,8 @@ decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
        size_t netlink_message_length;
        int rc;
 
-       if ((rc = ecryptfs_get_auth_tok_sig(&auth_tok_sig, auth_tok))) {
+       rc = ecryptfs_get_auth_tok_sig(&auth_tok_sig, auth_tok);
+       if (rc) {
                printk(KERN_ERR "Unrecognized auth tok type: [%d]\n",
                       auth_tok->token_type);
                goto out;
@@ -548,8 +570,9 @@ parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat,
                goto out;
        }
        (*new_auth_tok) = &auth_tok_list_item->auth_tok;
-       if ((rc = parse_packet_length(&data[(*packet_size)], &body_size,
-                                     &length_size))) {
+       rc = parse_packet_length(&data[(*packet_size)], &body_size,
+                                &length_size);
+       if (rc) {
                printk(KERN_WARNING "Error parsing packet length; "
                       "rc = [%d]\n", rc);
                goto out_free;
@@ -681,8 +704,9 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
                goto out;
        }
        (*new_auth_tok) = &auth_tok_list_item->auth_tok;
-       if ((rc = parse_packet_length(&data[(*packet_size)], &body_size,
-                                     &length_size))) {
+       rc = parse_packet_length(&data[(*packet_size)], &body_size,
+                                &length_size);
+       if (rc) {
                printk(KERN_WARNING "Error parsing packet length; rc = [%d]\n",
                       rc);
                goto out_free;
@@ -828,8 +852,9 @@ parse_tag_11_packet(unsigned char *data, unsigned char *contents,
                rc = -EINVAL;
                goto out;
        }
-       if ((rc = parse_packet_length(&data[(*packet_size)], &body_size,
-                                     &length_size))) {
+       rc = parse_packet_length(&data[(*packet_size)], &body_size,
+                                &length_size);
+       if (rc) {
                printk(KERN_WARNING "Invalid tag 11 packet format\n");
                goto out;
        }
@@ -1009,12 +1034,15 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
 {
        struct scatterlist dst_sg;
        struct scatterlist src_sg;
-       struct mutex *tfm_mutex = NULL;
+       struct mutex *tfm_mutex;
        struct blkcipher_desc desc = {
                .flags = CRYPTO_TFM_REQ_MAY_SLEEP
        };
        int rc = 0;
 
+       sg_init_table(&dst_sg, 1);
+       sg_init_table(&src_sg, 1);
+
        if (unlikely(ecryptfs_verbosity > 0)) {
                ecryptfs_printk(
                        KERN_DEBUG, "Session key encryption key (size [%d]):\n",
@@ -1031,9 +1059,10 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
                       crypt_stat->cipher, rc);
                goto out;
        }
-       if ((rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key,
-                                     auth_tok->session_key.encrypted_key_size,
-                                     &src_sg, 1)) != 1) {
+       rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key,
+                                auth_tok->session_key.encrypted_key_size,
+                                &src_sg, 1);
+       if (rc != 1) {
                printk(KERN_ERR "Internal error whilst attempting to convert "
                        "auth_tok->session_key.encrypted_key to scatterlist; "
                        "expected rc = 1; got rc = [%d]. "
@@ -1043,9 +1072,10 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
        }
        auth_tok->session_key.decrypted_key_size =
                auth_tok->session_key.encrypted_key_size;
-       if ((rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key,
-                                     auth_tok->session_key.decrypted_key_size,
-                                     &dst_sg, 1)) != 1) {
+       rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key,
+                                auth_tok->session_key.decrypted_key_size,
+                                &dst_sg, 1);
+       if (rc != 1) {
                printk(KERN_ERR "Internal error whilst attempting to convert "
                        "auth_tok->session_key.decrypted_key to scatterlist; "
                        "expected rc = 1; got rc = [%d]\n", rc);
@@ -1082,26 +1112,6 @@ out:
        return rc;
 }
 
-int ecryptfs_get_auth_tok_sig(char **sig, struct ecryptfs_auth_tok *auth_tok)
-{
-       int rc = 0;
-
-       (*sig) = NULL;
-       switch (auth_tok->token_type) {
-       case ECRYPTFS_PASSWORD:
-               (*sig) = auth_tok->token.password.signature;
-               break;
-       case ECRYPTFS_PRIVATE_KEY:
-               (*sig) = auth_tok->token.private_key.signature;
-               break;
-       default:
-               printk(KERN_ERR "Cannot get sig for auth_tok of type [%d]\n",
-                      auth_tok->token_type);
-               rc = -EINVAL;
-       }
-       return rc;
-}
-
 /**
  * ecryptfs_parse_packet_set
  * @crypt_stat: The cryptographic context
@@ -1123,8 +1133,8 @@ int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
        size_t found_auth_tok;
        size_t next_packet_is_auth_tok_packet;
        struct list_head auth_tok_list;
-       struct ecryptfs_auth_tok *matching_auth_tok = NULL;
-       struct ecryptfs_auth_tok *candidate_auth_tok = NULL;
+       struct ecryptfs_auth_tok *matching_auth_tok;
+       struct ecryptfs_auth_tok *candidate_auth_tok;
        char *candidate_auth_tok_sig;
        size_t packet_size;
        struct ecryptfs_auth_tok *new_auth_tok;
@@ -1235,18 +1245,17 @@ find_next_matching_auth_tok:
                                        "Considering cadidate auth tok:\n");
                        ecryptfs_dump_auth_tok(candidate_auth_tok);
                }
-               if ((rc = ecryptfs_get_auth_tok_sig(&candidate_auth_tok_sig,
-                                                   candidate_auth_tok))) {
+               rc = ecryptfs_get_auth_tok_sig(&candidate_auth_tok_sig,
+                                              candidate_auth_tok);
+               if (rc) {
                        printk(KERN_ERR
                               "Unrecognized candidate auth tok type: [%d]\n",
                               candidate_auth_tok->token_type);
                        rc = -EINVAL;
                        goto out_wipe_list;
                }
-               if ((rc = ecryptfs_find_auth_tok_for_sig(
-                            &matching_auth_tok, crypt_stat,
-                            candidate_auth_tok_sig)))
-                       rc = 0;
+               ecryptfs_find_auth_tok_for_sig(&matching_auth_tok, crypt_stat,
+                                              candidate_auth_tok_sig);
                if (matching_auth_tok) {
                        found_auth_tok = 1;
                        goto found_matching_auth_tok;
@@ -1604,9 +1613,9 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes,
                ecryptfs_printk(KERN_DEBUG, "Session key encryption key:\n");
                ecryptfs_dump_hex(session_key_encryption_key, 16);
        }
-       if ((rc = virt_to_scatterlist(crypt_stat->key,
-                                     key_rec->enc_key_size, &src_sg, 1))
-           != 1) {
+       rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size,
+                                &src_sg, 1);
+       if (rc != 1) {
                ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
                                "for crypt_stat session key; expected rc = 1; "
                                "got rc = [%d]. key_rec->enc_key_size = [%d]\n",
@@ -1614,9 +1623,9 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes,
                rc = -ENOMEM;
                goto out;
        }
-       if ((rc = virt_to_scatterlist(key_rec->enc_key,
-                                     key_rec->enc_key_size, &dst_sg, 1))
-           != 1) {
+       rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size,
+                                &dst_sg, 1);
+       if (rc != 1) {
                ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
                                "for crypt_stat encrypted session key; "
                                "expected rc = 1; got rc = [%d]. "
@@ -1851,7 +1860,7 @@ ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
        struct ecryptfs_global_auth_tok *new_auth_tok;
        int rc = 0;
 
-       new_auth_tok = kmem_cache_alloc(ecryptfs_global_auth_tok_cache,
+       new_auth_tok = kmem_cache_zalloc(ecryptfs_global_auth_tok_cache,
                                        GFP_KERNEL);
        if (!new_auth_tok) {
                rc = -ENOMEM;