Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25 /crypto/xcbc.c

Filename:/crypto/xcbc.c
Lines Added:18
Lines Deleted:15
Also changed in: (Previous) 2.6.25-rc9  2.6.25-rc8-git10  2.6.25-rc8-git9  2.6.25-rc8-git8  2.6.25-rc8-git7  2.6.25-rc8-git6 
(Following)

Location
[  2.6.25
  [  crypto
     o  xcbc.c

Patch

diff --git a/crypto/xcbc.c b/crypto/xcbc.c
index ac68f3b..b63b633 100644
--- a/crypto/xcbc.c
+++ b/crypto/xcbc.c
@@ -19,6 +19,7 @@
  *    Kazunori Miyazawa <miyazawa@linux-ipv6.org>
  */
 
+#include <crypto/scatterwalk.h>
 #include <linux/crypto.h>
 #include <linux/err.h>
 #include <linux/hardirq.h>
@@ -27,7 +28,6 @@
 #include <linux/rtnetlink.h>
 #include <linux/slab.h>
 #include <linux/scatterlist.h>
-#include "internal.h"
 
 static u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101,
             0x02020202, 0x02020202, 0x02020202, 0x02020202,
@@ -116,13 +116,16 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc,
    struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent);
    struct crypto_cipher *tfm = ctx->child;
    int bs = crypto_hash_blocksize(parent);
-   unsigned int i = 0;
 
-   do {
+   for (;;) {
+      struct page *pg = sg_page(sg);
+      unsigned int offset = sg->offset;
+      unsigned int slen = sg->length;
 
-      struct page *pg = sg_page(&sg[i]);
-      unsigned int offset = sg[i].offset;
-      unsigned int slen = sg[i].length;
+      if (unlikely(slen > nbytes))
+         slen = nbytes;
+
+      nbytes -= slen;
 
       while (slen > 0) {
          unsigned int len = min(slen, ((unsigned int)(PAGE_SIZE)) - offset);
@@ -177,9 +180,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc,
          offset = 0;
          pg++;
       }
-      nbytes-=sg[i].length;
-      i++;
-   } while (nbytes>0);
+
+      if (!nbytes)
+         break;
+      sg = scatterwalk_sg_next(sg);
+   }
 
    return 0;
 }
@@ -301,13 +306,14 @@ static struct crypto_instance *xcbc_alloc(struct rtattr **tb)
    alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_CIPHER,
               CRYPTO_ALG_TYPE_MASK);
    if (IS_ERR(alg))
-      return ERR_PTR(PTR_ERR(alg));
+      return ERR_CAST(alg);
 
    switch(alg->cra_blocksize) {
    case 16:
       break;
    default:
-      return ERR_PTR(PTR_ERR(alg));
+      inst = ERR_PTR(-EINVAL);
+      goto out_put_alg;
    }
 
    inst = crypto_alloc_instance("xcbc", alg);
@@ -320,10 +326,7 @@ static struct crypto_instance *xcbc_alloc(struct rtattr **tb)
    inst->alg.cra_alignmask = alg->cra_alignmask;
    inst->alg.cra_type = &crypto_hash_type;
 
-   inst->alg.cra_hash.digestsize =
-      (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
-      CRYPTO_ALG_TYPE_HASH ? alg->cra_hash.digestsize :
-                   alg->cra_blocksize;
+   inst->alg.cra_hash.digestsize = alg->cra_blocksize;
    inst->alg.cra_ctxsize = sizeof(struct crypto_xcbc_ctx) +
             ALIGN(inst->alg.cra_blocksize * 3, sizeof(void *));
    inst->alg.cra_init = xcbc_init_tfm;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.