From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [linux-next:master 9491/11353] crypto/dh.c:438:9: warning: Potential leak of memory pointed to by 'key' [clang-analyzer-unix.Malloc]
Date: Wed, 09 Mar 2022 10:14:00 +0800 [thread overview]
Message-ID: <202203091011.Ixia17Ac-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 22478 bytes --]
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: Linux Memory Management List <linux-mm@kvack.org>
TO: Nicolai Stange <nstange@suse.de>
CC: Herbert Xu <herbert@gondor.apana.org.au>
CC: Hannes Reinecke <hare@suse.de>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: cb153b68ff91cbc434f3de70ac549e110543e1bb
commit: 1e207964566738b49b003e80063fd712af75b82c [9491/11353] crypto: dh - implement private key generation primitive for ffdheXYZ(dh)
:::::: branch date: 18 hours ago
:::::: commit date: 6 days ago
config: arm-randconfig-c002-20220308 (https://download.01.org/0day-ci/archive/20220309/202203091011.Ixia17Ac-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project d271fc04d5b97b12e6b797c6067d3c96a8d7470e)
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
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=1e207964566738b49b003e80063fd712af75b82c
git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
git fetch --no-tags linux-next master
git checkout 1e207964566738b49b003e80063fd712af75b82c
# save the config file to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
^
fs/hpfs/namei.c:549:2: note: Taking false branch
if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) {
^
include/linux/compiler.h:56:23: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^
fs/hpfs/namei.c:554:2: note: Calling 'copy_de'
copy_de(&de, dep);
^~~~~~~~~~~~~~~~~
fs/hpfs/hpfs_fn.h:179:7: note: 'dst' is non-null
if (!dst || !src) return;
^
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
fs/hpfs/hpfs_fn.h:179:6: note: Left side of '||' is false
if (!dst || !src) return;
^
fs/hpfs/hpfs_fn.h:179:15: note: 'src' is non-null
if (!dst || !src) return;
^
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
fs/hpfs/hpfs_fn.h:179:2: note: '?' condition is false
if (!dst || !src) return;
^
include/linux/compiler.h:56:28: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^
include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^
fs/hpfs/hpfs_fn.h:179:7: note: 'dst' is non-null
if (!dst || !src) return;
^
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
(cond) ? \
^~~~
fs/hpfs/hpfs_fn.h:179:6: note: Left side of '||' is false
if (!dst || !src) return;
^
fs/hpfs/hpfs_fn.h:179:15: note: 'src' is non-null
if (!dst || !src) return;
^
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
(cond) ? \
^~~~
fs/hpfs/hpfs_fn.h:179:2: note: '?' condition is false
if (!dst || !src) return;
^
include/linux/compiler.h:56:28: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^
include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^
include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
(cond) ? \
^
fs/hpfs/hpfs_fn.h:179:2: note: Taking false branch
if (!dst || !src) return;
^
include/linux/compiler.h:56:23: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^
fs/hpfs/hpfs_fn.h:180:4: note: Assigned value is garbage or undefined
a = dst->down;
^ ~~~~~~~~~
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
3 warnings generated.
Suppressed 3 warnings (3 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
>> crypto/dh.c:438:9: warning: Potential leak of memory pointed to by 'key' [clang-analyzer-unix.Malloc]
return ERR_PTR(err);
^
crypto/dh.c:358:6: note: '?' condition is false
n = roundup_pow_of_two(2 * safe_prime->max_strength);
^
include/linux/log2.h:176:2: note: expanded from macro 'roundup_pow_of_two'
__builtin_constant_p(n) ? ( \
^
crypto/dh.c:359:2: note: '__ret_do_once' is true
WARN_ON_ONCE(n & ((1u << 6) - 1));
^
include/asm-generic/bug.h:146:2: note: expanded from macro 'WARN_ON_ONCE'
DO_ONCE_LITE_IF(condition, WARN_ON, 1)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/once_lite.h:17:16: note: expanded from macro 'DO_ONCE_LITE_IF'
if (unlikely(__ret_do_once && !__already_done)) { \
^~~~~~~~~~~~~
include/linux/compiler.h:48:41: note: expanded from macro 'unlikely'
# define unlikely(x) (__branch_check__(x, 0, __builtin_constant_p(x)))
^
include/linux/compiler.h:33:34: note: expanded from macro '__branch_check__'
______r = __builtin_expect(!!(x), expect); \
^
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
crypto/dh.c:359:2: note: Left side of '&&' is true
WARN_ON_ONCE(n & ((1u << 6) - 1));
^
include/asm-generic/bug.h:146:2: note: expanded from macro 'WARN_ON_ONCE'
DO_ONCE_LITE_IF(condition, WARN_ON, 1)
^
include/linux/once_lite.h:17:16: note: expanded from macro 'DO_ONCE_LITE_IF'
if (unlikely(__ret_do_once && !__already_done)) { \
^
crypto/dh.c:359:2: note: '__ret_do_once' is true
WARN_ON_ONCE(n & ((1u << 6) - 1));
^
include/asm-generic/bug.h:146:2: note: expanded from macro 'WARN_ON_ONCE'
DO_ONCE_LITE_IF(condition, WARN_ON, 1)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/once_lite.h:17:16: note: expanded from macro 'DO_ONCE_LITE_IF'
if (unlikely(__ret_do_once && !__already_done)) { \
^~~~~~~~~~~~~
include/linux/compiler.h:48:68: note: expanded from macro 'unlikely'
# define unlikely(x) (__branch_check__(x, 0, __builtin_constant_p(x)))
^
include/linux/compiler.h:35:19: note: expanded from macro '__branch_check__'
expect, is_constant); \
^~~~~~~~~~~
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^~~~
crypto/dh.c:359:2: note: Left side of '&&' is true
WARN_ON_ONCE(n & ((1u << 6) - 1));
^
include/asm-generic/bug.h:146:2: note: expanded from macro 'WARN_ON_ONCE'
DO_ONCE_LITE_IF(condition, WARN_ON, 1)
^
include/linux/once_lite.h:17:16: note: expanded from macro 'DO_ONCE_LITE_IF'
if (unlikely(__ret_do_once && !__already_done)) { \
^
crypto/dh.c:359:2: note: '?' condition is false
WARN_ON_ONCE(n & ((1u << 6) - 1));
^
include/asm-generic/bug.h:146:2: note: expanded from macro 'WARN_ON_ONCE'
DO_ONCE_LITE_IF(condition, WARN_ON, 1)
^
include/linux/once_lite.h:17:3: note: expanded from macro 'DO_ONCE_LITE_IF'
if (unlikely(__ret_do_once && !__already_done)) { \
^
include/linux/compiler.h:56:28: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^
include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
#define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
^
crypto/dh.c:359:2: note: '__ret_do_once' is true
WARN_ON_ONCE(n & ((1u << 6) - 1));
^
include/asm-generic/bug.h:146:2: note: expanded from macro 'WARN_ON_ONCE'
DO_ONCE_LITE_IF(condition, WARN_ON, 1)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/once_lite.h:17:16: note: expanded from macro 'DO_ONCE_LITE_IF'
if (unlikely(__ret_do_once && !__already_done)) { \
^~~~~~~~~~~~~
include/linux/compiler.h:48:41: note: expanded from macro 'unlikely'
# define unlikely(x) (__branch_check__(x, 0, __builtin_constant_p(x)))
^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler.h:56:47: note: expanded from macro 'if'
#define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
^~~~
include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
vim +/key +438 crypto/dh.c
1e207964566738b Nicolai Stange 2022-02-21 333
1e207964566738b Nicolai Stange 2022-02-21 334 static void *dh_safe_prime_gen_privkey(const struct dh_safe_prime *safe_prime,
1e207964566738b Nicolai Stange 2022-02-21 335 unsigned int *key_size)
1e207964566738b Nicolai Stange 2022-02-21 336 {
1e207964566738b Nicolai Stange 2022-02-21 337 unsigned int n, oversampling_size;
1e207964566738b Nicolai Stange 2022-02-21 338 __be64 *key;
1e207964566738b Nicolai Stange 2022-02-21 339 int err;
1e207964566738b Nicolai Stange 2022-02-21 340 u64 h, o;
1e207964566738b Nicolai Stange 2022-02-21 341
1e207964566738b Nicolai Stange 2022-02-21 342 /*
1e207964566738b Nicolai Stange 2022-02-21 343 * Generate a private key following NIST SP800-56Ar3,
1e207964566738b Nicolai Stange 2022-02-21 344 * sec. 5.6.1.1.1 and 5.6.1.1.3 resp..
1e207964566738b Nicolai Stange 2022-02-21 345 *
1e207964566738b Nicolai Stange 2022-02-21 346 * 5.6.1.1.1: choose key length N such that
1e207964566738b Nicolai Stange 2022-02-21 347 * 2 * ->max_strength <= N <= log2(q) + 1 = ->p_size * 8 - 1
1e207964566738b Nicolai Stange 2022-02-21 348 * with q = (p - 1) / 2 for the safe-prime groups.
1e207964566738b Nicolai Stange 2022-02-21 349 * Choose the lower bound's next power of two for N in order to
1e207964566738b Nicolai Stange 2022-02-21 350 * avoid excessively large private keys while still
1e207964566738b Nicolai Stange 2022-02-21 351 * maintaining some extra reserve beyond the bare minimum in
1e207964566738b Nicolai Stange 2022-02-21 352 * most cases. Note that for each entry in safe_prime_groups[],
1e207964566738b Nicolai Stange 2022-02-21 353 * the following holds for such N:
1e207964566738b Nicolai Stange 2022-02-21 354 * - N >= 256, in particular it is a multiple of 2^6 = 64
1e207964566738b Nicolai Stange 2022-02-21 355 * bits and
1e207964566738b Nicolai Stange 2022-02-21 356 * - N < log2(q) + 1, i.e. N respects the upper bound.
1e207964566738b Nicolai Stange 2022-02-21 357 */
1e207964566738b Nicolai Stange 2022-02-21 358 n = roundup_pow_of_two(2 * safe_prime->max_strength);
1e207964566738b Nicolai Stange 2022-02-21 359 WARN_ON_ONCE(n & ((1u << 6) - 1));
1e207964566738b Nicolai Stange 2022-02-21 360 n >>= 6; /* Convert N into units of u64. */
1e207964566738b Nicolai Stange 2022-02-21 361
1e207964566738b Nicolai Stange 2022-02-21 362 /*
1e207964566738b Nicolai Stange 2022-02-21 363 * Reserve one extra u64 to hold the extra random bits
1e207964566738b Nicolai Stange 2022-02-21 364 * required as per 5.6.1.1.3.
1e207964566738b Nicolai Stange 2022-02-21 365 */
1e207964566738b Nicolai Stange 2022-02-21 366 oversampling_size = (n + 1) * sizeof(__be64);
1e207964566738b Nicolai Stange 2022-02-21 367 key = kmalloc(oversampling_size, GFP_KERNEL);
1e207964566738b Nicolai Stange 2022-02-21 368 if (!key)
1e207964566738b Nicolai Stange 2022-02-21 369 return ERR_PTR(-ENOMEM);
1e207964566738b Nicolai Stange 2022-02-21 370
1e207964566738b Nicolai Stange 2022-02-21 371 /*
1e207964566738b Nicolai Stange 2022-02-21 372 * 5.6.1.1.3, step 3 (and implicitly step 4): obtain N + 64
1e207964566738b Nicolai Stange 2022-02-21 373 * random bits and interpret them as a big endian integer.
1e207964566738b Nicolai Stange 2022-02-21 374 */
1e207964566738b Nicolai Stange 2022-02-21 375 err = -EFAULT;
1e207964566738b Nicolai Stange 2022-02-21 376 if (crypto_get_default_rng())
1e207964566738b Nicolai Stange 2022-02-21 377 goto out_err;
1e207964566738b Nicolai Stange 2022-02-21 378
1e207964566738b Nicolai Stange 2022-02-21 379 err = crypto_rng_get_bytes(crypto_default_rng, (u8 *)key,
1e207964566738b Nicolai Stange 2022-02-21 380 oversampling_size);
1e207964566738b Nicolai Stange 2022-02-21 381 crypto_put_default_rng();
1e207964566738b Nicolai Stange 2022-02-21 382 if (err)
1e207964566738b Nicolai Stange 2022-02-21 383 goto out_err;
1e207964566738b Nicolai Stange 2022-02-21 384
1e207964566738b Nicolai Stange 2022-02-21 385 /*
1e207964566738b Nicolai Stange 2022-02-21 386 * 5.6.1.1.3, step 5 is implicit: 2^N < q and thus,
1e207964566738b Nicolai Stange 2022-02-21 387 * M = min(2^N, q) = 2^N.
1e207964566738b Nicolai Stange 2022-02-21 388 *
1e207964566738b Nicolai Stange 2022-02-21 389 * For step 6, calculate
1e207964566738b Nicolai Stange 2022-02-21 390 * key = (key[] mod (M - 1)) + 1 = (key[] mod (2^N - 1)) + 1.
1e207964566738b Nicolai Stange 2022-02-21 391 *
1e207964566738b Nicolai Stange 2022-02-21 392 * In order to avoid expensive divisions, note that
1e207964566738b Nicolai Stange 2022-02-21 393 * 2^N mod (2^N - 1) = 1 and thus, for any integer h,
1e207964566738b Nicolai Stange 2022-02-21 394 * 2^N * h mod (2^N - 1) = h mod (2^N - 1) always holds.
1e207964566738b Nicolai Stange 2022-02-21 395 * The big endian integer key[] composed of n + 1 64bit words
1e207964566738b Nicolai Stange 2022-02-21 396 * may be written as key[] = h * 2^N + l, with h = key[0]
1e207964566738b Nicolai Stange 2022-02-21 397 * representing the 64 most significant bits and l
1e207964566738b Nicolai Stange 2022-02-21 398 * corresponding to the remaining 2^N bits. With the remark
1e207964566738b Nicolai Stange 2022-02-21 399 * from above,
1e207964566738b Nicolai Stange 2022-02-21 400 * h * 2^N + l mod (2^N - 1) = l + h mod (2^N - 1).
1e207964566738b Nicolai Stange 2022-02-21 401 * As both, l and h are less than 2^N, their sum after
1e207964566738b Nicolai Stange 2022-02-21 402 * this first reduction is guaranteed to be <= 2^(N + 1) - 2.
1e207964566738b Nicolai Stange 2022-02-21 403 * Or equivalently, that their sum can again be written as
1e207964566738b Nicolai Stange 2022-02-21 404 * h' * 2^N + l' with h' now either zero or one and if one,
1e207964566738b Nicolai Stange 2022-02-21 405 * then l' <= 2^N - 2. Thus, all bits@positions >= N will
1e207964566738b Nicolai Stange 2022-02-21 406 * be zero after a second reduction:
1e207964566738b Nicolai Stange 2022-02-21 407 * h' * 2^N + l' mod (2^N - 1) = l' + h' mod (2^N - 1).
1e207964566738b Nicolai Stange 2022-02-21 408 * At this point, it is still possible that
1e207964566738b Nicolai Stange 2022-02-21 409 * l' + h' = 2^N - 1, i.e. that l' + h' mod (2^N - 1)
1e207964566738b Nicolai Stange 2022-02-21 410 * is zero. This condition will be detected below by means of
1e207964566738b Nicolai Stange 2022-02-21 411 * the final increment overflowing in this case.
1e207964566738b Nicolai Stange 2022-02-21 412 */
1e207964566738b Nicolai Stange 2022-02-21 413 h = be64_to_cpu(key[0]);
1e207964566738b Nicolai Stange 2022-02-21 414 h = __add_u64_to_be(key + 1, n, h);
1e207964566738b Nicolai Stange 2022-02-21 415 h = __add_u64_to_be(key + 1, n, h);
1e207964566738b Nicolai Stange 2022-02-21 416 WARN_ON_ONCE(h);
1e207964566738b Nicolai Stange 2022-02-21 417
1e207964566738b Nicolai Stange 2022-02-21 418 /* Increment to obtain the final result. */
1e207964566738b Nicolai Stange 2022-02-21 419 o = __add_u64_to_be(key + 1, n, 1);
1e207964566738b Nicolai Stange 2022-02-21 420 /*
1e207964566738b Nicolai Stange 2022-02-21 421 * The overflow bit o from the increment is either zero or
1e207964566738b Nicolai Stange 2022-02-21 422 * one. If zero, key[1:n] holds the final result in big-endian
1e207964566738b Nicolai Stange 2022-02-21 423 * order. If one, key[1:n] is zero now, but needs to be set to
1e207964566738b Nicolai Stange 2022-02-21 424 * one, c.f. above.
1e207964566738b Nicolai Stange 2022-02-21 425 */
1e207964566738b Nicolai Stange 2022-02-21 426 if (o)
1e207964566738b Nicolai Stange 2022-02-21 427 key[n] = cpu_to_be64(1);
1e207964566738b Nicolai Stange 2022-02-21 428
1e207964566738b Nicolai Stange 2022-02-21 429 /* n is in units of u64, convert to bytes. */
1e207964566738b Nicolai Stange 2022-02-21 430 *key_size = n << 3;
1e207964566738b Nicolai Stange 2022-02-21 431 /* Strip the leading extra __be64, which is (virtually) zero by now. */
1e207964566738b Nicolai Stange 2022-02-21 432 memmove(key, &key[1], *key_size);
1e207964566738b Nicolai Stange 2022-02-21 433
1e207964566738b Nicolai Stange 2022-02-21 434 return key;
1e207964566738b Nicolai Stange 2022-02-21 435
1e207964566738b Nicolai Stange 2022-02-21 436 out_err:
1e207964566738b Nicolai Stange 2022-02-21 437 kfree_sensitive(key);
1e207964566738b Nicolai Stange 2022-02-21 @438 return ERR_PTR(err);
1e207964566738b Nicolai Stange 2022-02-21 439 }
1e207964566738b Nicolai Stange 2022-02-21 440
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
reply other threads:[~2022-03-09 2:14 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=202203091011.Ixia17Ac-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild@lists.01.org \
/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 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.