DPDK patches and discussions
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: Junlong Wang <wang.junlong1@zte.com.cn>
Cc: ferruh.yigit@amd.com, dev@dpdk.org, wang.yong19@zte.com.cn
Subject: Re: [PATCH v4] net/zxdh: Provided zxdh basic init
Date: Thu, 19 Dec 2024 14:38:45 -0800	[thread overview]
Message-ID: <20241219143845.3a93755f@hermes.local> (raw)
In-Reply-To: <20240910120020.4031035-1-wang.junlong1@zte.com.cn>

On Tue, 10 Sep 2024 20:00:20 +0800
Junlong Wang <wang.junlong1@zte.com.cn> wrote:

> provided zxdh initialization of zxdh PMD driver.
> include msg channel, np init and etc.
> 
> Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn>
> ---
> V4: Resolve compilation issues
> V3: Resolve compilation issues
> V2: Resolve compilation issues and modify doc(zxdh.ini zdh.rst)
> V1: Provide zxdh basic init and open source NPSDK lib
> ---

Overall this looks good, one test checklist item for me was to build
with Gcc 14 and analyzer option. This finds bugs but can generate false
positives.  The output is quite verbose.

It complains about this which may or may not be a real problem.
If memcpy() is used instead of rte_memcpy() then the problem goes away.
The issue is that inlined version rte_memcpy() will reference past the arguments
as an internal optimization for small values.

[1564/3222] Compiling C object drivers/libtmp_rte_net_zxdh.a.p/net_zxdh_zxdh_common.c.o
In file included from ../lib/mempool/rte_mempool.h:50,
                 from ../lib/mbuf/rte_mbuf.h:38,
                 from ../lib/net/rte_ether.h:20,
                 from ../lib/ethdev/rte_eth_ctrl.h:10,
                 from ../lib/ethdev/rte_ethdev.h:1472,
                 from ../lib/ethdev/ethdev_driver.h:21,
                 from ../drivers/net/zxdh/zxdh_common.c:8:
In function ‘rte_mov15_or_less’,
    inlined from ‘rte_memcpy_generic’ at ../lib/eal/x86/include/rte_memcpy.h:395:10,
    inlined from ‘rte_memcpy’ at ../lib/eal/x86/include/rte_memcpy.h:757:10,
    inlined from ‘zxdh_get_res_info’ at ../drivers/net/zxdh/zxdh_common.c:231:2:
../lib/eal/x86/include/rte_memcpy.h:82:55: warning: stack-based buffer overflow [CWE-121] [-Wanalyzer-out-of-bounds]
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ‘zxdh_panelid_get’: events 1-3
    |
    |../drivers/net/zxdh/zxdh_common.c:250:1:
    |  239 |         uint8_t reps = 0;
    |      |                 ~~~~
    |      |                 |
    |      |                 (2) capacity: 1 byte
    |......
    |  250 | zxdh_panelid_get(struct rte_eth_dev *dev, uint8_t *panelid)
    |      | ^~~~~~~~~~~~~~~~
    |      | |
    |      | (1) entry to ‘zxdh_panelid_get’
    |......
    |  255 |         int32_t ret = zxdh_get_res_panel_id(&param, panelid);
    |      |                       ~
    |      |                       |
    |      |                       (3) inlined call to ‘zxdh_get_res_panel_id’ from ‘zxdh_panelid_get’
    |
    +--> ‘zxdh_get_res_panel_id’: event 4
           |
           |  242 |         if (zxdh_get_res_info(in, ZXDH_TBL_FIELD_PNLID, &reps, &reps_len) != ZXDH_BAR_MSG_OK)
           |      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           |      |             |
           |      |             (4) calling ‘zxdh_get_res_info’ from ‘zxdh_panelid_get’
           |
         ‘zxdh_get_res_info’: events 5-12
           |
           |  186 | zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16_t *len)
           |      | ^~~~~~~~~~~~~~~~~
           |      | |
           |      | (5) entry to ‘zxdh_get_res_info’
           |......
           |  192 |         if (!res || !dev)
           |      |            ~
           |      |            |
           |      |            (6) following ‘false’ branch...
           |......
           |  195 |         struct zxdh_tbl_msg_header tbl_msg = {
           |      |                                    ~~~~~~~
           |      |                                    |
           |      |                                    (7) ...to here
           |......
           |  217 |         if (ret != ZXDH_BAR_MSG_OK) {
           |      |            ~
           |      |            |
           |      |            (8) following ‘false’ branch (when ‘ret == 0’)...
           |......
           |  225 |         if (tbl_reps->check != ZXDH_TBL_MSG_PRO_SUCCESS) {
           |      |            ~~~~~~~~~~~~~~~~
           |      |            |        |
           |      |            |        (9) ...to here
           |      |            (10) following ‘false’ branch...
           |......
           |  230 |         *len = tbl_reps->len;
           |      |                ~~~~~~~~~~~~~
           |      |                        |
           |      |                        (11) ...to here
           |  231 |         rte_memcpy(res, (recv_buf + ZXDH_REPS_HEADER_OFFSET +
           |      |         ~
           |      |         |
           |      |         (12) inlined call to ‘rte_memcpy’ from ‘zxdh_get_res_info’
           |
           +--> ‘rte_memcpy’: events 13-14
                  |
                  |../lib/eal/x86/include/rte_memcpy.h:754:12:
                  |  754 |         if (!(((uintptr_t)dst | (uintptr_t)src) & ALIGNMENT_MASK))
                  |      |            ^
                  |      |            |
                  |      |            (13) following ‘false’ branch...
                  |......
                  |  757 |                 return rte_memcpy_generic(dst, src, n);
                  |      |                        ~
                  |      |                        |
                  |      |                        (14) inlined call to ‘rte_memcpy_generic’ from ‘rte_memcpy’
                  |
                  +--> ‘rte_memcpy_generic’: events 15-17
                         |
                         |  394 |         if (n < 16) {
                         |      |            ^
                         |      |            |
                         |      |            (15) ...to here
                         |      |            (16) following ‘true’ branch...
                         |  395 |                 return rte_mov15_or_less(dst, src, n);
                         |      |                        ~
                         |      |                        |
                         |      |                        (17) inlined call to ‘rte_mov15_or_less’ from ‘rte_memcpy_generic’
                         |
                         +--> ‘rte_mov15_or_less’: events 18-21
                                |
                                |   81 |         if (n & 8) {
                                |      |            ^
                                |      |            |
                                |      |            (18) ...to here
                                |      |            (19) following ‘true’ branch...
                                |   82 |                 ((struct rte_uint64_alias *)dst)->val =
                                |      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                       |
                                |      |                                                       (21) out-of-bounds write from byte 1 till byte 7 but ‘reps’ ends at byte 1
                                |   83 |                         ((const struct rte_uint64_alias *)src)->val;
                                |      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                               |
                                |      |                                                               (20) ...to here
                                |
../lib/eal/x86/include/rte_memcpy.h:82:55: note: write of 7 bytes to beyond the end of ‘reps’
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  ┌──────────────────────────────────────────────────────────────────────┐
  │                    write of ‘uint64_t’ (8 bytes)                     │
  └──────────────────────────────────────────────────────────────────────┘
              │                                   │
              │                                   │
              v                                   v
  ┌────────────────────────┐┌────────────────────────────────────────────┐
  │‘reps’ (type: ‘uint8_t’)││             after valid range              │
  └────────────────────────┘└────────────────────────────────────────────┘
  ├───────────┬────────────┤├─────────────────────┬──────────────────────┤
              │                                   │
     ╭────────┴───────╮               ╭───────────┴──────────╮
     │capacity: 1 byte│               │⚠️  overflow of 7 bytes│
     ╰────────────────╯               ╰──────────────────────╯

In function ‘rte_mov15_or_less’,
    inlined from ‘rte_memcpy_aligned’ at ../lib/eal/x86/include/rte_memcpy.h:706:10,
    inlined from ‘rte_memcpy’ at ../lib/eal/x86/include/rte_memcpy.h:755:10,
    inlined from ‘zxdh_get_res_info’ at ../drivers/net/zxdh/zxdh_common.c:231:2:
../lib/eal/x86/include/rte_memcpy.h:82:55: warning: stack-based buffer overflow [CWE-121] [-Wanalyzer-out-of-bounds]
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ‘zxdh_hashidx_get’: events 1-3
    |
    |../drivers/net/zxdh/zxdh_common.c:273:1:
    |  262 |         uint8_t reps = 0;
    |      |                 ~~~~
    |      |                 |
    |      |                 (2) capacity: 1 byte
    |......
    |  273 | zxdh_hashidx_get(struct rte_eth_dev *dev, uint8_t *hash_idx)
    |      | ^~~~~~~~~~~~~~~~
    |      | |
    |      | (1) entry to ‘zxdh_hashidx_get’
    |......
    |  278 |         int32_t ret = zxdh_get_res_hash_id(&param, hash_idx);
    |      |                       ~
    |      |                       |
    |      |                       (3) inlined call to ‘zxdh_get_res_hash_id’ from ‘zxdh_hashidx_get’
    |
    +--> ‘zxdh_get_res_hash_id’: event 4
           |
           |  265 |         if (zxdh_get_res_info(in, ZXDH_TBL_FIELD_HASHID, &reps, &reps_len) != ZXDH_BAR_MSG_OK)
           |      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           |      |             |
           |      |             (4) calling ‘zxdh_get_res_info’ from ‘zxdh_hashidx_get’
           |
         ‘zxdh_get_res_info’: events 5-12
           |
           |  186 | zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16_t *len)
           |      | ^~~~~~~~~~~~~~~~~
           |      | |
           |      | (5) entry to ‘zxdh_get_res_info’
           |......
           |  192 |         if (!res || !dev)
           |      |            ~
           |      |            |
           |      |            (6) following ‘false’ branch...
           |......
           |  195 |         struct zxdh_tbl_msg_header tbl_msg = {
           |      |                                    ~~~~~~~
           |      |                                    |
           |      |                                    (7) ...to here
           |......
           |  217 |         if (ret != ZXDH_BAR_MSG_OK) {
           |      |            ~
           |      |            |
           |      |            (8) following ‘false’ branch (when ‘ret == 0’)...
           |......
           |  225 |         if (tbl_reps->check != ZXDH_TBL_MSG_PRO_SUCCESS) {
           |      |            ~~~~~~~~~~~~~~~~
           |      |            |        |
           |      |            |        (9) ...to here
           |      |            (10) following ‘false’ branch...
           |......
           |  230 |         *len = tbl_reps->len;
           |      |                ~~~~~~~~~~~~~
           |      |                        |
           |      |                        (11) ...to here
           |  231 |         rte_memcpy(res, (recv_buf + ZXDH_REPS_HEADER_OFFSET +
           |      |         ~
           |      |         |
           |      |         (12) inlined call to ‘rte_memcpy’ from ‘zxdh_get_res_info’
           |
           +--> ‘rte_memcpy’: events 13-14
                  |
                  |../lib/eal/x86/include/rte_memcpy.h:754:12:
                  |  754 |         if (!(((uintptr_t)dst | (uintptr_t)src) & ALIGNMENT_MASK))
                  |      |            ^
                  |      |            |
                  |      |            (13) following ‘true’ branch...
                  |  755 |                 return rte_memcpy_aligned(dst, src, n);
                  |      |                        ~
                  |      |                        |
                  |      |                        (14) inlined call to ‘rte_memcpy_aligned’ from ‘rte_memcpy’
                  |
                  +--> ‘rte_memcpy_aligned’: events 15-17
                         |
                         |  705 |         if (n < 16) {
                         |      |            ^
                         |      |            |
                         |      |            (15) ...to here
                         |      |            (16) following ‘true’ branch...
                         |  706 |                 return rte_mov15_or_less(dst, src, n);
                         |      |                        ~
                         |      |                        |
                         |      |                        (17) inlined call to ‘rte_mov15_or_less’ from ‘rte_memcpy_aligned’
                         |
                         +--> ‘rte_mov15_or_less’: events 18-21
                                |
                                |   81 |         if (n & 8) {
                                |      |            ^
                                |      |            |
                                |      |            (18) ...to here
                                |      |            (19) following ‘true’ branch...
                                |   82 |                 ((struct rte_uint64_alias *)dst)->val =
                                |      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                       |
                                |      |                                                       (21) out-of-bounds write from byte 1 till byte 7 but ‘reps’ ends at byte 1
                                |   83 |                         ((const struct rte_uint64_alias *)src)->val;
                                |      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                               |
                                |      |                                                               (20) ...to here
                                |
../lib/eal/x86/include/rte_memcpy.h:82:55: note: write of 7 bytes to beyond the end of ‘reps’
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  ┌──────────────────────────────────────────────────────────────────────┐
  │                    write of ‘uint64_t’ (8 bytes)                     │
  └──────────────────────────────────────────────────────────────────────┘
              │                                   │
              │                                   │
              v                                   v
  ┌────────────────────────┐┌────────────────────────────────────────────┐
  │‘reps’ (type: ‘uint8_t’)││             after valid range              │
  └────────────────────────┘└────────────────────────────────────────────┘
  ├───────────┬────────────┤├─────────────────────┬──────────────────────┤
              │                                   │
     ╭────────┴───────╮               ╭───────────┴──────────╮
     │capacity: 1 byte│               │⚠️  overflow of 7 bytes│
     ╰────────────────╯               ╰──────────────────────╯

../lib/eal/x86/include/rte_memcpy.h:82:55: warning: stack-based buffer overflow [CWE-121] [-Wanalyzer-out-of-bounds]
  ‘zxdh_panelid_get’: events 1-3
    |
    |../drivers/net/zxdh/zxdh_common.c:250:1:
    |  239 |         uint8_t reps = 0;
    |      |                 ~~~~
    |      |                 |
    |      |                 (2) capacity: 1 byte
    |......
    |  250 | zxdh_panelid_get(struct rte_eth_dev *dev, uint8_t *panelid)
    |      | ^~~~~~~~~~~~~~~~
    |      | |
    |      | (1) entry to ‘zxdh_panelid_get’
    |......
    |  255 |         int32_t ret = zxdh_get_res_panel_id(&param, panelid);
    |      |                       ~
    |      |                       |
    |      |                       (3) inlined call to ‘zxdh_get_res_panel_id’ from ‘zxdh_panelid_get’
    |
    +--> ‘zxdh_get_res_panel_id’: event 4
           |
           |  242 |         if (zxdh_get_res_info(in, ZXDH_TBL_FIELD_PNLID, &reps, &reps_len) != ZXDH_BAR_MSG_OK)
           |      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           |      |             |
           |      |             (4) calling ‘zxdh_get_res_info’ from ‘zxdh_panelid_get’
           |
         ‘zxdh_get_res_info’: events 5-12
           |
           |  186 | zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16_t *len)
           |      | ^~~~~~~~~~~~~~~~~
           |      | |
           |      | (5) entry to ‘zxdh_get_res_info’
           |......
           |  192 |         if (!res || !dev)
           |      |            ~
           |      |            |
           |      |            (6) following ‘false’ branch...
           |......
           |  195 |         struct zxdh_tbl_msg_header tbl_msg = {
           |      |                                    ~~~~~~~
           |      |                                    |
           |      |                                    (7) ...to here
           |......
           |  217 |         if (ret != ZXDH_BAR_MSG_OK) {
           |      |            ~
           |      |            |
           |      |            (8) following ‘false’ branch (when ‘ret == 0’)...
           |......
           |  225 |         if (tbl_reps->check != ZXDH_TBL_MSG_PRO_SUCCESS) {
           |      |            ~~~~~~~~~~~~~~~~
           |      |            |        |
           |      |            |        (9) ...to here
           |      |            (10) following ‘false’ branch...
           |......
           |  230 |         *len = tbl_reps->len;
           |      |                ~~~~~~~~~~~~~
           |      |                        |
           |      |                        (11) ...to here
           |  231 |         rte_memcpy(res, (recv_buf + ZXDH_REPS_HEADER_OFFSET +
           |      |         ~
           |      |         |
           |      |         (12) inlined call to ‘rte_memcpy’ from ‘zxdh_get_res_info’
           |
           +--> ‘rte_memcpy’: events 13-14
                  |
                  |../lib/eal/x86/include/rte_memcpy.h:754:12:
                  |  754 |         if (!(((uintptr_t)dst | (uintptr_t)src) & ALIGNMENT_MASK))
                  |      |            ^
                  |      |            |
                  |      |            (13) following ‘true’ branch...
                  |  755 |                 return rte_memcpy_aligned(dst, src, n);
                  |      |                        ~
                  |      |                        |
                  |      |                        (14) inlined call to ‘rte_memcpy_aligned’ from ‘rte_memcpy’
                  |
                  +--> ‘rte_memcpy_aligned’: events 15-17
                         |
                         |  705 |         if (n < 16) {
                         |      |            ^
                         |      |            |
                         |      |            (15) ...to here
                         |      |            (16) following ‘true’ branch...
                         |  706 |                 return rte_mov15_or_less(dst, src, n);
                         |      |                        ~
                         |      |                        |
                         |      |                        (17) inlined call to ‘rte_mov15_or_less’ from ‘rte_memcpy_aligned’
                         |
                         +--> ‘rte_mov15_or_less’: events 18-21
                                |
                                |   81 |         if (n & 8) {
                                |      |            ^
                                |      |            |
                                |      |            (18) ...to here
                                |      |            (19) following ‘true’ branch...
                                |   82 |                 ((struct rte_uint64_alias *)dst)->val =
                                |      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                       |
                                |      |                                                       (21) out-of-bounds write from byte 1 till byte 7 but ‘reps’ ends at byte 1
                                |   83 |                         ((const struct rte_uint64_alias *)src)->val;
                                |      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                               |
                                |      |                                                               (20) ...to here
                                |
../lib/eal/x86/include/rte_memcpy.h:82:55: note: write of 7 bytes to beyond the end of ‘reps’
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  ┌──────────────────────────────────────────────────────────────────────┐
  │                    write of ‘uint64_t’ (8 bytes)                     │
  └──────────────────────────────────────────────────────────────────────┘
              │                                   │
              │                                   │
              v                                   v
  ┌────────────────────────┐┌────────────────────────────────────────────┐
  │‘reps’ (type: ‘uint8_t’)││             after valid range              │
  └────────────────────────┘└────────────────────────────────────────────┘
  ├───────────┬────────────┤├─────────────────────┬──────────────────────┤
              │                                   │
     ╭────────┴───────╮               ╭───────────┴──────────╮
     │capacity: 1 byte│               │⚠️  overflow of 7 bytes│
     ╰────────────────╯               ╰──────────────────────╯

In function ‘rte_mov15_or_less’,
    inlined from ‘rte_memcpy_generic’ at ../lib/eal/x86/include/rte_memcpy.h:395:10,
    inlined from ‘rte_memcpy’ at ../lib/eal/x86/include/rte_memcpy.h:757:10,
    inlined from ‘zxdh_get_res_info’ at ../drivers/net/zxdh/zxdh_common.c:231:2:
../lib/eal/x86/include/rte_memcpy.h:82:55: warning: stack-based buffer overflow [CWE-121] [-Wanalyzer-out-of-bounds]
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ‘zxdh_hashidx_get’: events 1-3
    |
    |../drivers/net/zxdh/zxdh_common.c:273:1:
    |  262 |         uint8_t reps = 0;
    |      |                 ~~~~
    |      |                 |
    |      |                 (2) capacity: 1 byte
    |......
    |  273 | zxdh_hashidx_get(struct rte_eth_dev *dev, uint8_t *hash_idx)
    |      | ^~~~~~~~~~~~~~~~
    |      | |
    |      | (1) entry to ‘zxdh_hashidx_get’
    |......
    |  278 |         int32_t ret = zxdh_get_res_hash_id(&param, hash_idx);
    |      |                       ~
    |      |                       |
    |      |                       (3) inlined call to ‘zxdh_get_res_hash_id’ from ‘zxdh_hashidx_get’
    |
    +--> ‘zxdh_get_res_hash_id’: event 4
           |
           |  265 |         if (zxdh_get_res_info(in, ZXDH_TBL_FIELD_HASHID, &reps, &reps_len) != ZXDH_BAR_MSG_OK)
           |      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           |      |             |
           |      |             (4) calling ‘zxdh_get_res_info’ from ‘zxdh_hashidx_get’
           |
         ‘zxdh_get_res_info’: events 5-12
           |
           |  186 | zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16_t *len)
           |      | ^~~~~~~~~~~~~~~~~
           |      | |
           |      | (5) entry to ‘zxdh_get_res_info’
           |......
           |  192 |         if (!res || !dev)
           |      |            ~
           |      |            |
           |      |            (6) following ‘false’ branch...
           |......
           |  195 |         struct zxdh_tbl_msg_header tbl_msg = {
           |      |                                    ~~~~~~~
           |      |                                    |
           |      |                                    (7) ...to here
           |......
           |  217 |         if (ret != ZXDH_BAR_MSG_OK) {
           |      |            ~
           |      |            |
           |      |            (8) following ‘false’ branch (when ‘ret == 0’)...
           |......
           |  225 |         if (tbl_reps->check != ZXDH_TBL_MSG_PRO_SUCCESS) {
           |      |            ~~~~~~~~~~~~~~~~
           |      |            |        |
           |      |            |        (9) ...to here
           |      |            (10) following ‘false’ branch...
           |......
           |  230 |         *len = tbl_reps->len;
           |      |                ~~~~~~~~~~~~~
           |      |                        |
           |      |                        (11) ...to here
           |  231 |         rte_memcpy(res, (recv_buf + ZXDH_REPS_HEADER_OFFSET +
           |      |         ~
           |      |         |
           |      |         (12) inlined call to ‘rte_memcpy’ from ‘zxdh_get_res_info’
           |
           +--> ‘rte_memcpy’: events 13-14
                  |
                  |../lib/eal/x86/include/rte_memcpy.h:754:12:
                  |  754 |         if (!(((uintptr_t)dst | (uintptr_t)src) & ALIGNMENT_MASK))
                  |      |            ^
                  |      |            |
                  |      |            (13) following ‘false’ branch...
                  |......
                  |  757 |                 return rte_memcpy_generic(dst, src, n);
                  |      |                        ~
                  |      |                        |
                  |      |                        (14) inlined call to ‘rte_memcpy_generic’ from ‘rte_memcpy’
                  |
                  +--> ‘rte_memcpy_generic’: events 15-17
                         |
                         |  394 |         if (n < 16) {
                         |      |            ^
                         |      |            |
                         |      |            (15) ...to here
                         |      |            (16) following ‘true’ branch...
                         |  395 |                 return rte_mov15_or_less(dst, src, n);
                         |      |                        ~
                         |      |                        |
                         |      |                        (17) inlined call to ‘rte_mov15_or_less’ from ‘rte_memcpy_generic’
                         |
                         +--> ‘rte_mov15_or_less’: events 18-21
                                |
                                |   81 |         if (n & 8) {
                                |      |            ^
                                |      |            |
                                |      |            (18) ...to here
                                |      |            (19) following ‘true’ branch...
                                |   82 |                 ((struct rte_uint64_alias *)dst)->val =
                                |      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                       |
                                |      |                                                       (21) out-of-bounds write from byte 1 till byte 7 but ‘reps’ ends at byte 1
                                |   83 |                         ((const struct rte_uint64_alias *)src)->val;
                                |      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                |      |                                                               |
                                |      |                                                               (20) ...to here
                                |
../lib/eal/x86/include/rte_memcpy.h:82:55: note: write of 7 bytes to beyond the end of ‘reps’
   82 |                 ((struct rte_uint64_alias *)dst)->val =
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   83 |                         ((const struct rte_uint64_alias *)src)->val;
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  ┌──────────────────────────────────────────────────────────────────────┐
  │                    write of ‘uint64_t’ (8 bytes)                     │
  └──────────────────────────────────────────────────────────────────────┘
              │                                   │
              │                                   │
              v                                   v
  ┌────────────────────────┐┌────────────────────────────────────────────┐
  │‘reps’ (type: ‘uint8_t’)││             after valid range              │
  └────────────────────────┘└────────────────────────────────────────────┘
  ├───────────┬────────────┤├─────────────────────┬──────────────────────┤
              │                                   │
     ╭────────┴───────╮               ╭───────────┴──────────╮
     │capacity: 1 byte│               │⚠️  overflow of 7 bytes│
     ╰────────────────╯               ╰──────────────────────╯


  parent reply	other threads:[~2024-12-19 22:38 UTC|newest]

Thread overview: 191+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-10 12:00 Junlong Wang
2024-09-24  1:35 ` [v4] " Junlong Wang
2024-09-25 22:39 ` [PATCH v4] " Ferruh Yigit
2024-09-26  6:49 ` [v4] " Junlong Wang
2024-10-07 21:43 ` [PATCH v4] " Stephen Hemminger
2024-10-15  5:43 ` [PATCH v5 0/9] net/zxdh: introduce net zxdh driver Junlong Wang
2024-10-15  5:43   ` [PATCH v5 1/9] net/zxdh: add zxdh ethdev pmd driver Junlong Wang
2024-10-15  5:44     ` [PATCH v5 2/9] net/zxdh: add logging implementation Junlong Wang
2024-10-15  5:44       ` [PATCH v5 3/9] net/zxdh: add zxdh device pci init implementation Junlong Wang
2024-10-15  5:44       ` [PATCH v5 4/9] net/zxdh: add msg chan and msg hwlock init Junlong Wang
2024-10-15  5:44       ` [PATCH v5 5/9] net/zxdh: add msg chan enable implementation Junlong Wang
2024-10-15  5:44       ` [PATCH v5 6/9] net/zxdh: add zxdh get device backend infos Junlong Wang
2024-10-15  5:44       ` [PATCH v5 7/9] net/zxdh: add configure zxdh intr implementation Junlong Wang
2024-10-15  5:44       ` [PATCH v5 8/9] net/zxdh: add zxdh dev infos get ops Junlong Wang
2024-10-15  5:44       ` [PATCH v5 9/9] net/zxdh: add zxdh dev configure ops Junlong Wang
2024-10-15 15:37         ` Stephen Hemminger
2024-10-15 15:57         ` Stephen Hemminger
2024-10-16  8:16     ` [PATCH v6 0/9] net/zxdh: introduce net zxdh driver Junlong Wang
2024-10-16  8:16       ` [PATCH v6 1/9] net/zxdh: add zxdh ethdev pmd driver Junlong Wang
2024-10-16  8:18         ` [PATCH v6 2/9] net/zxdh: add logging implementation Junlong Wang
2024-10-16  8:18           ` [PATCH v6 3/9] net/zxdh: add zxdh device pci init implementation Junlong Wang
2024-10-16  8:18           ` [PATCH v6 4/9] net/zxdh: add msg chan and msg hwlock init Junlong Wang
2024-10-16  8:18           ` [PATCH v6 5/9] net/zxdh: add msg chan enable implementation Junlong Wang
2024-10-21  8:50             ` Thomas Monjalon
2024-10-21 10:56             ` Junlong Wang
2024-10-16  8:18           ` [PATCH v6 6/9] net/zxdh: add zxdh get device backend infos Junlong Wang
2024-10-21  8:52             ` Thomas Monjalon
2024-10-16  8:18           ` [PATCH v6 7/9] net/zxdh: add configure zxdh intr implementation Junlong Wang
2024-10-16  8:18           ` [PATCH v6 8/9] net/zxdh: add zxdh dev infos get ops Junlong Wang
2024-10-21  8:54             ` Thomas Monjalon
2024-10-16  8:18           ` [PATCH v6 9/9] net/zxdh: add zxdh dev configure ops Junlong Wang
2024-10-18  5:18             ` [v6,9/9] " Junlong Wang
2024-10-18  6:48               ` David Marchand
2024-10-19 11:17             ` Junlong Wang
2024-10-21  9:03         ` [PATCH v6 1/9] net/zxdh: add zxdh ethdev pmd driver Thomas Monjalon
2024-10-22 12:20         ` [PATCH v7 0/9] net/zxdh: introduce net zxdh driver Junlong Wang
2024-10-22 12:20           ` [PATCH v7 1/9] net/zxdh: add zxdh ethdev pmd driver Junlong Wang
2024-10-30  9:01             ` [PATCH v8 0/9] net/zxdh: introduce net zxdh driver Junlong Wang
2024-10-30  9:01               ` [PATCH v8 1/9] net/zxdh: add zxdh ethdev pmd driver Junlong Wang
2024-11-01  6:21                 ` [PATCH v9 0/9] net/zxdh: introduce net zxdh driver Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 1/9] net/zxdh: add zxdh ethdev pmd driver Junlong Wang
2024-11-02  0:57                     ` Ferruh Yigit
2024-11-04 11:58                     ` [PATCH v10 00/10] net/zxdh: introduce net zxdh driver Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 01/10] net/zxdh: add zxdh ethdev pmd driver Junlong Wang
2024-11-07 10:32                         ` [PATCH v10 00/10] net/zxdh: introduce net zxdh driver Junlong Wang
2024-11-12  0:42                           ` Thomas Monjalon
2024-12-06  5:57                         ` [PATCH v1 00/15] net/zxdh: updated " Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 01/15] net/zxdh: zxdh np init implementation Junlong Wang
2024-12-10  5:53                             ` [PATCH v2 00/15] net/zxdh: updated net zxdh driver Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 01/15] net/zxdh: zxdh np init implementation Junlong Wang
2024-12-11 16:10                                 ` Stephen Hemminger
2024-12-12  2:06                                 ` Junlong Wang
2024-12-12  3:35                                 ` Junlong Wang
2024-12-17 11:41                                 ` [PATCH v3 00/15] net/zxdh: updated net zxdh driver Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 01/15] net/zxdh: zxdh np init implementation Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 02/15] net/zxdh: zxdh np uninit implementation Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 03/15] net/zxdh: port tables init implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 04/15] net/zxdh: port tables unint implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 05/15] net/zxdh: rx/tx queue setup and intr enable Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 06/15] net/zxdh: dev start/stop ops implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 07/15] net/zxdh: provided dev simple tx implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 08/15] net/zxdh: provided dev simple rx implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 09/15] net/zxdh: link info update, set link up/down Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 10/15] net/zxdh: mac set/add/remove ops implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 11/15] net/zxdh: promisc/allmulti " Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 12/15] net/zxdh: vlan filter/ offload " Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 13/15] net/zxdh: rss hash config/update, reta update/get Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 14/15] net/zxdh: basic stats ops implementations Junlong Wang
2024-12-17 11:41                                   ` [PATCH v3 15/15] net/zxdh: mtu update " Junlong Wang
2024-12-18  9:25                                 ` [PATCH v4 00/15] net/zxdh: updated net zxdh driver Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 01/15] net/zxdh: zxdh np init implementation Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 02/15] net/zxdh: zxdh np uninit implementation Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 03/15] net/zxdh: port tables init implementations Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 04/15] net/zxdh: port tables unint implementations Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 05/15] net/zxdh: rx/tx queue setup and intr enable Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 06/15] net/zxdh: dev start/stop ops implementations Junlong Wang
2024-12-21  0:51                                     ` Stephen Hemminger
2024-12-18  9:25                                   ` [PATCH v4 07/15] net/zxdh: provided dev simple tx implementations Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 08/15] net/zxdh: provided dev simple rx implementations Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 09/15] net/zxdh: link info update, set link up/down Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 10/15] net/zxdh: mac set/add/remove ops implementations Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 11/15] net/zxdh: promisc/allmulti " Junlong Wang
2024-12-18  9:25                                   ` [PATCH v4 12/15] net/zxdh: vlan filter/ offload " Junlong Wang
2024-12-18  9:26                                   ` [PATCH v4 13/15] net/zxdh: rss hash config/update, reta update/get Junlong Wang
2024-12-21  0:44                                     ` Stephen Hemminger
2024-12-18  9:26                                   ` [PATCH v4 14/15] net/zxdh: basic stats ops implementations Junlong Wang
2024-12-18  9:26                                   ` [PATCH v4 15/15] net/zxdh: mtu update " Junlong Wang
2024-12-21  0:33                                     ` Stephen Hemminger
2024-12-10  5:53                               ` [PATCH v2 02/15] net/zxdh: zxdh np uninit implementation Junlong Wang
2024-12-13 19:38                                 ` Stephen Hemminger
2024-12-13 19:41                                 ` Stephen Hemminger
2024-12-13 19:41                                 ` Stephen Hemminger
2024-12-10  5:53                               ` [PATCH v2 03/15] net/zxdh: port tables init implementations Junlong Wang
2024-12-13 19:42                                 ` Stephen Hemminger
2024-12-10  5:53                               ` [PATCH v2 04/15] net/zxdh: port tables unint implementations Junlong Wang
2024-12-13 19:45                                 ` Stephen Hemminger
2024-12-13 19:48                                 ` Stephen Hemminger
2024-12-10  5:53                               ` [PATCH v2 05/15] net/zxdh: rx/tx queue setup and intr enable Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 06/15] net/zxdh: dev start/stop ops implementations Junlong Wang
2024-12-13 21:05                                 ` Stephen Hemminger
2024-12-10  5:53                               ` [PATCH v2 07/15] net/zxdh: provided dev simple tx implementations Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 08/15] net/zxdh: provided dev simple rx implementations Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 09/15] net/zxdh: link info update, set link up/down Junlong Wang
2024-12-13 19:57                                 ` Stephen Hemminger
2024-12-13 20:08                                 ` Stephen Hemminger
2024-12-10  5:53                               ` [PATCH v2 10/15] net/zxdh: mac set/add/remove ops implementations Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 11/15] net/zxdh: promisc/allmulti " Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 12/15] net/zxdh: vlan filter/ offload " Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 13/15] net/zxdh: rss hash config/update, reta update/get Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 14/15] net/zxdh: basic stats ops implementations Junlong Wang
2024-12-10  5:53                               ` [PATCH v2 15/15] net/zxdh: mtu update " Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 02/15] net/zxdh: zxdh np uninit implementation Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 03/15] net/zxdh: port tables init implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 04/15] net/zxdh: port tables unint implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 05/15] net/zxdh: rx/tx queue setup and intr enable Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 06/15] net/zxdh: dev start/stop ops implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 07/15] net/zxdh: provided dev simple tx implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 08/15] net/zxdh: provided dev simple rx implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 09/15] net/zxdh: link info update, set link up/down Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 10/15] net/zxdh: mac set/add/remove ops implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 11/15] net/zxdh: promiscuous/allmulticast " Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 12/15] net/zxdh: vlan filter, vlan offload " Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 13/15] net/zxdh: rss hash config/update, reta update/get Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 14/15] net/zxdh: basic stats ops implementations Junlong Wang
2024-12-06  5:57                           ` [PATCH v1 15/15] net/zxdh: mtu update " Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 02/10] net/zxdh: add logging implementation Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 03/10] net/zxdh: add zxdh device pci init implementation Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 04/10] net/zxdh: add msg chan and msg hwlock init Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 05/10] net/zxdh: add msg chan enable implementation Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 06/10] net/zxdh: add zxdh get device backend infos Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 07/10] net/zxdh: add configure zxdh intr implementation Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 08/10] net/zxdh: add zxdh dev infos get ops Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 09/10] net/zxdh: add zxdh dev configure ops Junlong Wang
2024-11-04 11:58                       ` [PATCH v10 10/10] net/zxdh: add zxdh dev close ops Junlong Wang
2024-11-06  0:40                       ` [PATCH v10 00/10] net/zxdh: introduce net zxdh driver Ferruh Yigit
2024-11-07  9:28                         ` Ferruh Yigit
2024-11-07  9:58                           ` Ferruh Yigit
2024-11-12  2:49                       ` Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 2/9] net/zxdh: add logging implementation Junlong Wang
2024-11-02  1:02                     ` Ferruh Yigit
2024-11-04  2:44                     ` [v9,2/9] " Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 3/9] net/zxdh: add zxdh device pci init implementation Junlong Wang
2024-11-02  1:01                     ` Ferruh Yigit
2024-11-01  6:21                   ` [PATCH v9 4/9] net/zxdh: add msg chan and msg hwlock init Junlong Wang
2024-11-02  1:00                     ` Ferruh Yigit
2024-11-04  2:47                     ` Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 5/9] net/zxdh: add msg chan enable implementation Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 6/9] net/zxdh: add zxdh get device backend infos Junlong Wang
2024-11-02  1:06                     ` Ferruh Yigit
2024-11-04  3:30                     ` [v9,6/9] " Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 7/9] net/zxdh: add configure zxdh intr implementation Junlong Wang
2024-11-02  1:07                     ` Ferruh Yigit
2024-11-01  6:21                   ` [PATCH v9 8/9] net/zxdh: add zxdh dev infos get ops Junlong Wang
2024-11-01  6:21                   ` [PATCH v9 9/9] net/zxdh: add zxdh dev configure ops Junlong Wang
2024-11-02  0:56                   ` [PATCH v9 0/9] net/zxdh: introduce net zxdh driver Ferruh Yigit
2024-11-04  2:42                   ` Junlong Wang
2024-11-04  8:46                     ` Ferruh Yigit
2024-11-04  9:52                       ` David Marchand
2024-11-04 11:46                   ` Junlong Wang
2024-11-04 22:47                     ` Thomas Monjalon
2024-11-05  9:39                   ` Junlong Wang
2024-11-06  0:38                     ` Ferruh Yigit
2024-10-30  9:01               ` [PATCH v8 2/9] net/zxdh: add logging implementation Junlong Wang
2024-10-30  9:01               ` [PATCH v8 3/9] net/zxdh: add zxdh device pci init implementation Junlong Wang
2024-10-30 14:55                 ` David Marchand
2024-10-30  9:01               ` [PATCH v8 4/9] net/zxdh: add msg chan and msg hwlock init Junlong Wang
2024-10-30  9:01               ` [PATCH v8 5/9] net/zxdh: add msg chan enable implementation Junlong Wang
2024-10-30  9:01               ` [PATCH v8 6/9] net/zxdh: add zxdh get device backend infos Junlong Wang
2024-10-30  9:01               ` [PATCH v8 7/9] net/zxdh: add configure zxdh intr implementation Junlong Wang
2024-10-30  9:01               ` [PATCH v8 8/9] net/zxdh: add zxdh dev infos get ops Junlong Wang
2024-10-30  9:01               ` [PATCH v8 9/9] net/zxdh: add zxdh dev configure ops Junlong Wang
2024-10-22 12:20           ` [PATCH v7 2/9] net/zxdh: add logging implementation Junlong Wang
2024-10-22 12:20           ` [PATCH v7 3/9] net/zxdh: add zxdh device pci init implementation Junlong Wang
2024-10-27 16:47             ` Stephen Hemminger
2024-10-27 16:47             ` Stephen Hemminger
2024-10-22 12:20           ` [PATCH v7 4/9] net/zxdh: add msg chan and msg hwlock init Junlong Wang
2024-10-22 12:20           ` [PATCH v7 5/9] net/zxdh: add msg chan enable implementation Junlong Wang
2024-10-26 17:05             ` Thomas Monjalon
2024-10-22 12:20           ` [PATCH v7 6/9] net/zxdh: add zxdh get device backend infos Junlong Wang
2024-10-22 12:20           ` [PATCH v7 7/9] net/zxdh: add configure zxdh intr implementation Junlong Wang
2024-10-27 17:07             ` Stephen Hemminger
2024-10-22 12:20           ` [PATCH v7 8/9] net/zxdh: add zxdh dev infos get ops Junlong Wang
2024-10-22 12:20           ` [PATCH v7 9/9] net/zxdh: add zxdh dev configure ops Junlong Wang
2024-10-24 11:31             ` [v7,9/9] " Junlong Wang
2024-10-25  9:48             ` Junlong Wang
2024-10-26  2:32             ` Junlong Wang
2024-10-27 16:40             ` [PATCH v7 9/9] " Stephen Hemminger
2024-10-27 17:03               ` Stephen Hemminger
2024-10-27 16:58             ` Stephen Hemminger
2024-12-19 22:38 ` Stephen Hemminger [this message]
2024-12-20  1:47 ` [PATCH v4] net/zxdh: Provided zxdh basic init Junlong Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241219143845.3a93755f@hermes.local \
    --to=stephen@networkplumber.org \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@amd.com \
    --cc=wang.junlong1@zte.com.cn \
    --cc=wang.yong19@zte.com.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).