All of lore.kernel.org
 help / color / mirror / Atom feed
* net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_201->table.bucket[<unknown>]' [CWE-476]
@ 2022-06-19 14:35 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2022-06-19 14:35 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 59089 bytes --]

:::::: 
:::::: Manual check reason: "low confidence bisect report"
:::::: Manual check reason: "low confidence static check first_new_problem: net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_201->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]"
:::::: 

CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: linux-kernel(a)vger.kernel.org
TO: Kees Cook <keescook@chromium.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   4b35035bcf80ddb47c0112c4fbd84a63a2836a18
commit: f68f2ff91512c199ec24883001245912afc17873 fortify: Detect struct member overflows in memcpy() at compile-time
date:   4 months ago
:::::: branch date: 2 days ago
:::::: commit date: 4 months ago
config: arm-randconfig-c002-20220617 (https://download.01.org/0day-ci/archive/20220619/202206192222.VuAJpf8x-lkp(a)intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f68f2ff91512c199ec24883001245912afc17873
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout f68f2ff91512c199ec24883001245912afc17873
        # save the config file
         ARCH=arm KBUILD_USERCFLAGS='-fanalyzer -Wno-error' 

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>


gcc-analyzer warnings: (new ones prefixed by >>)
   In file included from net/netfilter/ipset/ip_set_hash_netportnet.c:433:
   net/netfilter/ipset/ip_set_hash_gen.h: In function 'hash_netportnet6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_201->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_netportnet6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_netportnet.c:430:25:
       |  430 | #define MTYPE           hash_netportnet6
       |      |                         ^~~~~~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_netportnet6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_netportnet6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_netportnet6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_netportnet6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_netportnet6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_netportnet6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_netportnet6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_netportnet6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_netportnet6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_netportnet6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_ipmac.c:194:
   include/linux/jhash.h: In function 'hash_ipmac6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_187->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_ipmac6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_ipmac.c:189:25:
       |  189 | #define MTYPE           hash_ipmac6
       |      |                         ^~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_ipmac6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_ipmac6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_ipmac6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_ipmac6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_ipmac6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_ipmac6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_ipmac6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_ipmac6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_ipmac6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_ipmac6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_ipmark.c:211:
   include/linux/jhash.h: In function 'hash_ipmark6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_187->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_ipmark6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_ipmark.c:208:25:
       |  208 | #define MTYPE           hash_ipmark6
       |      |                         ^~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_ipmark6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_ipmark6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_ipmark6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_ipmark6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_ipmark6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_ipmark6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_ipmark6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_ipmark6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_ipmark6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_ipmark6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_ipport.c:246:
   include/linux/jhash.h: In function 'hash_ipport6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_187->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_ipport6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_ipport.c:243:25:
       |  243 | #define MTYPE           hash_ipport6
       |      |                         ^~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_ipport6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_ipport6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_ipport6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_ipport6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_ipport6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_ipport6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_ipport6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_ipport6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_ipport6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_ipport6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_ipportip.c:256:
   include/linux/jhash.h: In function 'hash_ipportip6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_187->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_ipportip6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_ipportip.c:253:25:
       |  253 | #define MTYPE           hash_ipportip6
       |      |                         ^~~~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_ipportip6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_ipportip6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_ipportip6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_ipportip6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_ipportip6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_ipportip6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_ipportip6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_ipportip6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_ipportip6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_ipportip6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_ipportnet.c:385:
   net/netfilter/ipset/ip_set_hash_gen.h: In function 'hash_ipportnet6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_199->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_ipportnet6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_ipportnet.c:382:25:
       |  382 | #define MTYPE           hash_ipportnet6
       |      |                         ^~~~~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_ipportnet6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_ipportnet6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_ipportnet6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_ipportnet6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_ipportnet6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_ipportnet6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_ipportnet6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_ipportnet6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_ipportnet6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_ipportnet6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_netiface.c:378:
   net/netfilter/ipset/ip_set_hash_gen.h: In function 'hash_netiface6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_202->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_netiface6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_netiface.c:374:25:
       |  374 | #define MTYPE           hash_netiface6
       |      |                         ^~~~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_netiface6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_netiface6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_netiface6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_netiface6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_netiface6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_netiface6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_netiface6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_netiface6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_netiface6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_netiface6_add': event 11
       |
--
   In file included from net/netfilter/ipset/ip_set_hash_netnet.c:378:
   net/netfilter/ipset/ip_set_hash_gen.h: In function 'hash_netnet6_add':
>> net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_201->table.bucket[<unknown>]' [CWE-476] [-Wanalyzer-null-dereference]
     894 |         for (i = 0; i < n->pos; i++) {
         |                         ~^~~~~
     'hash_netnet6_add': event 1
       |
       |net/netfilter/ipset/ip_set_hash_netnet.c:375:25:
       |  375 | #define MTYPE           hash_netnet6
       |      |                         ^~~~~~~~~~~~
       |      |                         |
       |      |                         (1) entry to 'hash_netnet6_add'
   include/linux/netfilter/ipset/ip_set.h:526:41: note: in definition of macro 'IPSET_CONCAT'
       |  526 | #define IPSET_CONCAT(a, b)              a##b
       |      |                                         ^
   net/netfilter/ipset/ip_set_hash_gen.h:267:33: note: in expansion of macro 'IPSET_TOKEN'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                 ^~~~~~~~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:267:45: note: in expansion of macro 'MTYPE'
       |  267 | #define mtype_add               IPSET_TOKEN(MTYPE, _add)
       |      |                                             ^~~~~
   net/netfilter/ipset/ip_set_hash_gen.h:841:1: note: in expansion of macro 'mtype_add'
       |  841 | mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
       |      | ^~~~~~~~~
       |
     'hash_netnet6_add': event 2
       |
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (2) calling 'jhash2' from 'hash_netnet6_add'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
       +--> 'jhash2': events 3-5
              |
              |include/linux/jhash.h:117:19:
              |  117 | static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
              |      |                   ^~~~~~
              |      |                   |
              |      |                   (3) entry to 'jhash2'
              |......
              |  125 |         while (length > 3) {
              |      |                ~~~~~~~~~~
              |      |                       |
              |      |                       (4) following 'true' branch (when 'length > 3')...
              |  126 |                 a += k[0];
              |      |                      ~~~~
              |      |                       |
              |      |                       (5) ...to here
              |
       <------+
       |
     'hash_netnet6_add': event 6
       |
       |net/netfilter/ipset/ip_set_hash_gen.h:296:9:
       |  296 |         jhash2(__k, __l, initval) & jhash_mask(htable_bits);    \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (6) returning to 'hash_netnet6_add' from 'jhash2'
   net/netfilter/ipset/ip_set_hash_gen.h:856:15: note: in expansion of macro 'HKEY'
       |  856 |         key = HKEY(value, h->initval, t->htable_bits);
       |      |               ^~~~
       |
     'hash_netnet6_add': event 7
       |
       |  861 |         if (elements >= maxelem) {
       |      |            ^
       |      |            |
       |      |            (7) following 'true' branch (when 'elements >= maxelem')...
       |
     'hash_netnet6_add': event 8
       |
       |include/linux/netfilter/ipset/ip_set.h:64:37:
       |   64 | #define SET_WITH_TIMEOUT(s)     ((s)->extensions & IPSET_EXT_TIMEOUT)
       |      |                                  ~~~^~~~~~~~~~~~
       |      |                                     |
       |      |                                     (8) ...to here
   net/netfilter/ipset/ip_set_hash_gen.h:863:21: note: in expansion of macro 'SET_WITH_TIMEOUT'
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                     ^~~~~~~~~~~~~~~~
       |
     'hash_netnet6_add': event 9
       |
       |  863 |                 if (SET_WITH_TIMEOUT(set)) {
       |      |                    ^
       |      |                    |
       |      |                    (9) following 'true' branch...
       |
     'hash_netnet6_add': event 10
       |
       |include/linux/instruction_pointer.h:6:41:
       |    6 | #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
       |      |                                         ^~~~~~
       |      |                                         |
       |      |                                         (10) ...to here
   include/linux/bottom_half.h:33:30: note: in expansion of macro '_THIS_IP_'
       |   33 |         __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
       |      |                              ^~~~~~~~~
       |
     'hash_netnet6_add': event 11
       |

vim +894 net/netfilter/ipset/ip_set_hash_gen.h

f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   836  
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   837  /* Add an element to a hash and update the internal counters when succeeded,
ca0f6a5cd99e0c Jozsef Kadlecsik 2015-06-13   838   * otherwise report the proper error code.
ca0f6a5cd99e0c Jozsef Kadlecsik 2015-06-13   839   */
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   840  static int
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   841  mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   842  	  struct ip_set_ext *mext, u32 flags)
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   843  {
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   844  	struct htype *h = set->data;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   845  	struct htable *t;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   846  	const struct mtype_elem *d = value;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   847  	struct mtype_elem *data;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   848  	struct hbucket *n, *old = ERR_PTR(-ENOENT);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   849  	int i, j = -1, ret;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   850  	bool flag_exist = flags & IPSET_FLAG_EXIST;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   851  	bool deleted = false, forceadd = false, reuse = false;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   852  	u32 r, key, multi = 0, elements, maxelem;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   853  
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   854  	rcu_read_lock_bh();
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   855  	t = rcu_dereference_bh(h->table);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   856  	key = HKEY(value, h->initval, t->htable_bits);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   857  	r = ahash_region(key, t->htable_bits);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   858  	atomic_inc(&t->uref);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   859  	elements = t->hregion[r].elements;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   860  	maxelem = t->maxelem;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   861  	if (elements >= maxelem) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   862  		u32 e;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   863  		if (SET_WITH_TIMEOUT(set)) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   864  			rcu_read_unlock_bh();
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   865  			mtype_gc_do(set, h, t, r);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   866  			rcu_read_lock_bh();
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   867  		}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   868  		maxelem = h->maxelem;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   869  		elements = 0;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   870  		for (e = 0; e < ahash_numof_locks(t->htable_bits); e++)
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   871  			elements += t->hregion[e].elements;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   872  		if (elements >= maxelem && SET_WITH_FORCEADD(set))
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   873  			forceadd = true;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   874  	}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   875  	rcu_read_unlock_bh();
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   876  
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   877  	spin_lock_bh(&t->hregion[r].lock);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   878  	n = rcu_dereference_bh(hbucket(t, key));
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   879  	if (!n) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   880  		if (forceadd || elements >= maxelem)
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   881  			goto set_full;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   882  		old = NULL;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   883  		n = kzalloc(sizeof(*n) + AHASH_INIT_SIZE * set->dsize,
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   884  			    GFP_ATOMIC);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   885  		if (!n) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   886  			ret = -ENOMEM;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   887  			goto unlock;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   888  		}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   889  		n->size = AHASH_INIT_SIZE;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   890  		t->hregion[r].ext_size +=
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   891  			ext_size(AHASH_INIT_SIZE, set->dsize);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   892  		goto copy_elem;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   893  	}
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08  @894  	for (i = 0; i < n->pos; i++) {
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   895  		if (!test_bit(i, n->used)) {
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   896  			/* Reuse first deleted entry */
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   897  			if (j == -1) {
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   898  				deleted = reuse = true;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   899  				j = i;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   900  			}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   901  			continue;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   902  		}
ca134ce86451f3 Jozsef Kadlecsik 2013-09-07   903  		data = ahash_data(n, i, set->dsize);
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   904  		if (mtype_data_equal(data, d, &multi)) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   905  			if (flag_exist || SET_ELEM_EXPIRED(set, data)) {
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   906  				/* Just the extensions could be overwritten */
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   907  				j = i;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   908  				goto overwrite_extensions;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   909  			}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   910  			ret = -IPSET_ERR_EXIST;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   911  			goto unlock;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   912  		}
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   913  		/* Reuse first timed out entry */
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   914  		if (SET_ELEM_EXPIRED(set, data) && j == -1) {
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   915  			j = i;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   916  			reuse = true;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   917  		}
86ac79c7bea154 Jozsef Kadlecsik 2014-11-30   918  	}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   919  	if (reuse || forceadd) {
8af1c6fbd92398 Jozsef Kadlecsik 2020-02-22   920  		if (j == -1)
8af1c6fbd92398 Jozsef Kadlecsik 2020-02-22   921  			j = 0;
ca134ce86451f3 Jozsef Kadlecsik 2013-09-07   922  		data = ahash_data(n, j, set->dsize);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   923  		if (!deleted) {
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   924  #ifdef IP_SET_HASH_WITH_NETS
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   925  			for (i = 0; i < IPSET_NET_COUNT; i++)
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   926  				mtype_del_cidr(set, h,
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   927  					NCIDR_PUT(DCIDR_GET(data->cidr, i)),
cee8b97b6c13b1 Jozsef Kadlecsik 2016-11-10   928  					i);
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   929  #endif
40cd63bf33b21e Jozsef Kadlecsik 2013-09-09   930  			ip_set_ext_destroy(set, data);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   931  			t->hregion[r].elements--;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   932  		}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   933  		goto copy_data;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   934  	}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   935  	if (elements >= maxelem)
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   936  		goto set_full;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   937  	/* Create a new slot */
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   938  	if (n->pos >= n->size) {
ccf0a4b7fc6885 Jozsef Kadlecsik 2020-10-29   939  		TUNE_BUCKETSIZE(h, multi);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   940  		if (n->size >= AHASH_MAX(h)) {
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   941  			/* Trigger rehashing */
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   942  			mtype_data_next(&h->next, d);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   943  			ret = -EAGAIN;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   944  			goto resize;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   945  		}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   946  		old = n;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   947  		n = kzalloc(sizeof(*n) +
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   948  			    (old->size + AHASH_INIT_SIZE) * set->dsize,
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   949  			    GFP_ATOMIC);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   950  		if (!n) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   951  			ret = -ENOMEM;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   952  			goto unlock;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   953  		}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   954  		memcpy(n, old, sizeof(struct hbucket) +
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   955  		       old->size * set->dsize);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   956  		n->size = old->size + AHASH_INIT_SIZE;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   957  		t->hregion[r].ext_size +=
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   958  			ext_size(AHASH_INIT_SIZE, set->dsize);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   959  	}
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   960  
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   961  copy_elem:
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   962  	j = n->pos++;
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   963  	data = ahash_data(n, j, set->dsize);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   964  copy_data:
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   965  	t->hregion[r].elements++;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   966  #ifdef IP_SET_HASH_WITH_NETS
ea53ac5b630e81 Oliver Smith     2013-09-20   967  	for (i = 0; i < IPSET_NET_COUNT; i++)
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   968  		mtype_add_cidr(set, h, NCIDR_PUT(DCIDR_GET(d->cidr, i)), i);
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   969  #endif
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   970  	memcpy(data, d, sizeof(struct mtype_elem));
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   971  overwrite_extensions:
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   972  #ifdef IP_SET_HASH_WITH_NETS
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   973  	mtype_data_set_flags(data, flags);
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08   974  #endif
00d71b270eedac Jozsef Kadlecsik 2013-04-08   975  	if (SET_WITH_COUNTER(set))
ca134ce86451f3 Jozsef Kadlecsik 2013-09-07   976  		ip_set_init_counter(ext_counter(data, set), ext);
fda75c6d9e31a9 Oliver Smith     2013-09-22   977  	if (SET_WITH_COMMENT(set))
9e41f26a505cca Jozsef Kadlecsik 2016-11-10   978  		ip_set_init_comment(set, ext_comment(data, set), ext);
af331419d34e2f Anton Danilov    2014-08-28   979  	if (SET_WITH_SKBINFO(set))
af331419d34e2f Anton Danilov    2014-08-28   980  		ip_set_init_skbinfo(ext_skbinfo(data, set), ext);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   981  	/* Must come last for the case when timed out entry is reused */
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   982  	if (SET_WITH_TIMEOUT(set))
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   983  		ip_set_timeout_set(ext_timeout(data, set), ext->timeout);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   984  	smp_mb__before_atomic();
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   985  	set_bit(j, n->used);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   986  	if (old != ERR_PTR(-ENOENT)) {
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   987  		rcu_assign_pointer(hbucket(t, key), n);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   988  		if (old)
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   989  			kfree_rcu(old, rcu);
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13   990  	}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   991  	ret = 0;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   992  resize:
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   993  	spin_unlock_bh(&t->hregion[r].lock);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   994  	if (atomic_read(&t->ref) && ext->target) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   995  		/* Resize is in process and kernel side add, save values */
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   996  		struct mtype_resize_ad *x;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   997  
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   998  		x = kzalloc(sizeof(struct mtype_resize_ad), GFP_ATOMIC);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11   999  		if (!x)
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1000  			/* Don't bother */
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1001  			goto out;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1002  		x->ad = IPSET_ADD;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1003  		memcpy(&x->d, value, sizeof(struct mtype_elem));
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1004  		memcpy(&x->ext, ext, sizeof(struct ip_set_ext));
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1005  		memcpy(&x->mext, mext, sizeof(struct ip_set_ext));
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1006  		x->flags = flags;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1007  		spin_lock_bh(&set->lock);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1008  		list_add_tail(&x->list, &h->ad);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1009  		spin_unlock_bh(&set->lock);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1010  	}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1011  	goto out;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08  1012  
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13  1013  set_full:
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13  1014  	if (net_ratelimit())
18f84d41d34fa3 Jozsef Kadlecsik 2015-06-13  1015  		pr_warn("Set %s is full, maxelem %u reached\n",
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1016  			set->name, maxelem);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1017  	ret = -IPSET_ERR_HASH_FULL;
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1018  unlock:
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1019  	spin_unlock_bh(&t->hregion[r].lock);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1020  out:
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1021  	if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) {
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1022  		pr_debug("Table destroy after resize by add: %p\n", t);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1023  		mtype_ahash_destroy(set, t, false);
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1024  	}
f66ee0410b1c34 Jozsef Kadlecsik 2020-02-11  1025  	return ret;
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08  1026  }
1feab10d7e6ddb Jozsef Kadlecsik 2013-04-08  1027  

:::::: The code at line 894 was first introduced by commit
:::::: 1feab10d7e6ddb5e13d6a4bd93a1b877390262ec netfilter: ipset: Unified hash type generation

:::::: TO: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
:::::: CC: Pablo Neira Ayuso <pablo@netfilter.org>

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-19 14:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-19 14:35 net/netfilter/ipset/ip_set_hash_gen.h:894:26: warning: dereference of NULL '*h_201->table.bucket[<unknown>]' [CWE-476] kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.