linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / sunrpc / auth_gss / gss_krb5_crypto.c
index 76b969e..97c981f 100644 (file)
@@ -212,6 +212,7 @@ make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body,
        char                            *cksumname;
        struct crypto_tfm               *tfm = NULL; /* XXX add to ctx? */
        struct scatterlist              sg[1];
+       u32                             code = GSS_S_FAILURE;
 
        switch (cksumtype) {
                case CKSUMTYPE_RSA_MD5:
@@ -220,11 +221,13 @@ make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body,
                default:
                        dprintk("RPC:      krb5_make_checksum:"
                                " unsupported checksum %d", cksumtype);
-                       return GSS_S_FAILURE;
+                       goto out;
        }
        if (!(tfm = crypto_alloc_tfm(cksumname, CRYPTO_TFM_REQ_MAY_SLEEP)))
-               return GSS_S_FAILURE;
+               goto out;
        cksum->len = crypto_tfm_alg_digestsize(tfm);
+       if ((cksum->data = kmalloc(cksum->len, GFP_KERNEL)) == NULL)
+               goto out;
 
        crypto_digest_init(tfm);
        sg_set_buf(sg, header, hdrlen);
@@ -232,8 +235,10 @@ make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body,
        process_xdr_buf(body, body_offset, body->len - body_offset,
                        checksummer, tfm);
        crypto_digest_final(tfm, cksum->data);
+       code = 0;
+out:
        crypto_free_tfm(tfm);
-       return 0;
+       return code;
 }
 
 EXPORT_SYMBOL(make_checksum);