Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
[pandora-kernel.git] / net / sunrpc / auth_gss / gss_krb5_wrap.c
index af777cf..f179415 100644 (file)
@@ -121,12 +121,14 @@ gss_wrap_kerberos(struct gss_ctx *ctx, int offset,
 {
        struct krb5_ctx         *kctx = ctx->internal_ctx_id;
        s32                     checksum_type;
-       struct xdr_netobj       md5cksum = {.len = 0, .data = NULL};
+       char                    cksumdata[16];
+       struct xdr_netobj       md5cksum = {.len = 0, .data = cksumdata};
        int                     blocksize = 0, plainlen;
        unsigned char           *ptr, *krb5_hdr, *msg_start;
        s32                     now;
        int                     headlen;
        struct page             **tmp_pages;
+       u32                     seq_send;
 
        dprintk("RPC:     gss_wrap_kerberos\n");
 
@@ -147,7 +149,7 @@ gss_wrap_kerberos(struct gss_ctx *ctx, int offset,
                goto out_err;
        }
 
-       blocksize = crypto_tfm_alg_blocksize(kctx->enc);
+       blocksize = crypto_blkcipher_blocksize(kctx->enc);
        gss_krb5_add_padding(buf, offset, blocksize);
        BUG_ON((buf->len - offset) % blocksize);
        plainlen = blocksize + buf->len - offset;
@@ -205,23 +207,22 @@ gss_wrap_kerberos(struct gss_ctx *ctx, int offset,
                BUG();
        }
 
-       kfree(md5cksum.data);
+       spin_lock(&krb5_seq_lock);
+       seq_send = kctx->seq_send++;
+       spin_unlock(&krb5_seq_lock);
 
        /* XXX would probably be more efficient to compute checksum
         * and encrypt at the same time: */
        if ((krb5_make_seq_num(kctx->seq, kctx->initiate ? 0 : 0xff,
-                              kctx->seq_send, krb5_hdr + 16, krb5_hdr + 8)))
+                              seq_send, krb5_hdr + 16, krb5_hdr + 8)))
                goto out_err;
 
        if (gss_encrypt_xdr_buf(kctx->enc, buf, offset + headlen - blocksize,
                                                                        pages))
                goto out_err;
 
-       kctx->seq_send++;
-
        return ((kctx->endtime < now) ? GSS_S_CONTEXT_EXPIRED : GSS_S_COMPLETE);
 out_err:
-       if (md5cksum.data) kfree(md5cksum.data);
        return GSS_S_FAILURE;
 }
 
@@ -232,7 +233,8 @@ gss_unwrap_kerberos(struct gss_ctx *ctx, int offset, struct xdr_buf *buf)
        int                     signalg;
        int                     sealalg;
        s32                     checksum_type;
-       struct xdr_netobj       md5cksum = {.len = 0, .data = NULL};
+       char                    cksumdata[16];
+       struct xdr_netobj       md5cksum = {.len = 0, .data = cksumdata};
        s32                     now;
        int                     direction;
        s32                     seqnum;
@@ -344,7 +346,7 @@ gss_unwrap_kerberos(struct gss_ctx *ctx, int offset, struct xdr_buf *buf)
        /* Copy the data back to the right position.  XXX: Would probably be
         * better to copy and encrypt at the same time. */
 
-       blocksize = crypto_tfm_alg_blocksize(kctx->enc);
+       blocksize = crypto_blkcipher_blocksize(kctx->enc);
        data_start = ptr + 22 + blocksize;
        orig_start = buf->head[0].iov_base + offset;
        data_len = (buf->head[0].iov_base + buf->head[0].iov_len) - data_start;
@@ -358,6 +360,5 @@ gss_unwrap_kerberos(struct gss_ctx *ctx, int offset, struct xdr_buf *buf)
 
        ret = GSS_S_COMPLETE;
 out:
-       if (md5cksum.data) kfree(md5cksum.data);
        return ret;
 }