rslib: Simplify error path
authorThomas Gleixner <tglx@linutronix.de>
Sun, 22 Apr 2018 16:23:52 +0000 (18:23 +0200)
committerKees Cook <keescook@chromium.org>
Wed, 25 Apr 2018 02:50:08 +0000 (19:50 -0700)
The four error path labels in rs_init() can be reduced to one by allocating
the struct with kzalloc so the pointers in the struct are NULL and can be
unconditionally handed in to kfree() because they either point to an
allocation or are NULL.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Kees Cook <keescook@chromium.org>
lib/reed_solomon/reed_solomon.c

index 3e694ab9e3b231d882f4af7f4907e80d5042aec1..02c19ecffc2804936ee6915936c2bf63b700c950 100644 (file)
@@ -60,8 +60,7 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int),
        struct rs_control *rs;
        int i, j, sr, root, iprim;
 
-       /* Allocate the control structure */
-       rs = kmalloc(sizeof(*rs), gfp);
+       rs = kzalloc(sizeof(*rs), gfp);
        if (!rs)
                return NULL;
 
@@ -78,15 +77,15 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int),
        /* Allocate the arrays */
        rs->alpha_to = kmalloc(sizeof(uint16_t) * (rs->nn + 1), gfp);
        if (rs->alpha_to == NULL)
-               goto errrs;
+               goto err;
 
        rs->index_of = kmalloc(sizeof(uint16_t) * (rs->nn + 1), gfp);
        if (rs->index_of == NULL)
-               goto erralp;
+               goto err;
 
        rs->genpoly = kmalloc(sizeof(uint16_t) * (rs->nroots + 1), gfp);
        if(rs->genpoly == NULL)
-               goto erridx;
+               goto err;
 
        /* Generate Galois field lookup tables */
        rs->index_of[0] = rs->nn;       /* log(zero) = -inf */
@@ -111,7 +110,7 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int),
        }
        /* If it's not primitive, exit */
        if(sr != rs->alpha_to[0])
-               goto errpol;
+               goto err;
 
        /* Find prim-th root of 1, used in decoding */
        for(iprim = 1; (iprim % prim) != 0; iprim += rs->nn);
@@ -141,14 +140,10 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int (*gffunc)(int),
                rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
        return rs;
 
-       /* Error exit */
-errpol:
+err:
        kfree(rs->genpoly);
-erridx:
        kfree(rs->index_of);
-erralp:
        kfree(rs->alpha_to);
-errrs:
        kfree(rs);
        return NULL;
 }