crypto: af_alg - get_page upon reassignment to TX SGL
authorStephan Mueller <smueller@chronox.de>
Thu, 10 Aug 2017 14:40:03 +0000 (16:40 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 22 Aug 2017 07:03:27 +0000 (15:03 +0800)
When a page is assigned to a TX SGL, call get_page to increment the
reference counter. It is possible that one page is referenced in
multiple SGLs:

- in the global TX SGL in case a previous af_alg_pull_tsgl only
reassigned parts of a page to a per-request TX SGL

- in the per-request TX SGL as assigned by af_alg_pull_tsgl

Note, multiple requests can be active at the same time whose TX SGLs all
point to different parts of the same page.

Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/af_alg.c

index d6936c0e08d97bd0da301e06f025f19e55958284..ffa9f4ccd9b455ef36c48d3ba57d4256574cd450 100644 (file)
@@ -641,9 +641,9 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
                                if (dst_offset >= plen) {
                                        /* discard page before offset */
                                        dst_offset -= plen;
-                                       put_page(page);
                                } else {
                                        /* reassign page to dst after offset */
+                                       get_page(page);
                                        sg_set_page(dst + j, page,
                                                    plen - dst_offset,
                                                    sg[i].offset + dst_offset);
@@ -661,9 +661,7 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
                        if (sg[i].length)
                                return;
 
-                       if (!dst)
-                               put_page(page);
-
+                       put_page(page);
                        sg_assign_page(sg + i, NULL);
                }