From: Cyril Hrubis <chrubis@suse.cz>
To: Wei Gao <wegao@suse.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v7 2/2] ptrace06: Refactor the test using new LTP API
Date: Thu, 16 Jan 2025 17:50:16 +0100 [thread overview]
Message-ID: <Z4k4yCM67CBKMUGL@yuki.lan> (raw)
In-Reply-To: <20250114143217.21018-3-wegao@suse.com>
On Tue, Jan 14, 2025 at 09:32:17AM -0500, Wei Gao via ltp wrote:
> Signed-off-by: Wei Gao <wegao@suse.com>
> Reviewed-by: Petr Vorel <pvorel@suse.cz>
> ---
> testcases/kernel/syscalls/ptrace/ptrace06.c | 325 ++++++++++--------
> .../kernel/syscalls/ptrace/ptrace06_child.c | 16 +
> 2 files changed, 190 insertions(+), 151 deletions(-)
> create mode 100644 testcases/kernel/syscalls/ptrace/ptrace06_child.c
>
> diff --git a/testcases/kernel/syscalls/ptrace/ptrace06.c b/testcases/kernel/syscalls/ptrace/ptrace06.c
> index a1db3bab8..b760ab89d 100644
> --- a/testcases/kernel/syscalls/ptrace/ptrace06.c
> +++ b/testcases/kernel/syscalls/ptrace/ptrace06.c
> @@ -1,199 +1,222 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> /*
> - * check out-of-bound/unaligned addresses given to
> + * Copyright (c) 2008 Analog Devices Inc.
> + * Copyright (c) Linux Test Project, 2009-2022
> + * Copyright (c) 2023 Wei Gao <wegao@suse.com>
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Check out-of-bound/unaligned addresses given to
> + *
> * - {PEEK,POKE}{DATA,TEXT,USER}
> * - {GET,SET}{,FG}REGS
> * - {GET,SET}SIGINFO
> - *
> - * Copyright (c) 2008 Analog Devices Inc.
> - *
> - * Licensed under the GPL-2 or later
> */
>
> -#define _GNU_SOURCE
> -
> -#include <errno.h>
> -#include <stdbool.h>
> -#include <stdio.h>
> #include <stdlib.h>
> -#include <unistd.h>
> #include <sys/ptrace.h>
> -
> -#include "test.h"
> -#include "spawn_ptrace_child.h"
> +#include "tst_test.h"
>
> /* this should be sizeof(struct user), but that info is only found
> * in the kernel asm/user.h which is not exported to userspace.
> */
> +
> #if defined(__i386__)
> -#define SIZEOF_USER 284
> +# define SIZEOF_USER 284
> #elif defined(__x86_64__)
> -#define SIZEOF_USER 928
> +# define SIZEOF_USER 928
> #else
> -#define SIZEOF_USER 0x1000 /* just pick a big number */
> +# define SIZEOF_USER 0x1000 /* just pick a big number */
> #endif
>
> -char *TCID = "ptrace06";
> -
> -struct test_case_t {
> +static struct test_case_t {
> int request;
> long addr;
> long data;
> } test_cases[] = {
> - {
> - PTRACE_PEEKDATA,.addr = 0}, {
> - PTRACE_PEEKDATA,.addr = 1}, {
> - PTRACE_PEEKDATA,.addr = 2}, {
> - PTRACE_PEEKDATA,.addr = 3}, {
> - PTRACE_PEEKDATA,.addr = -1}, {
> - PTRACE_PEEKDATA,.addr = -2}, {
> - PTRACE_PEEKDATA,.addr = -3}, {
> - PTRACE_PEEKDATA,.addr = -4}, {
> - PTRACE_PEEKTEXT,.addr = 0}, {
> - PTRACE_PEEKTEXT,.addr = 1}, {
> - PTRACE_PEEKTEXT,.addr = 2}, {
> - PTRACE_PEEKTEXT,.addr = 3}, {
> - PTRACE_PEEKTEXT,.addr = -1}, {
> - PTRACE_PEEKTEXT,.addr = -2}, {
> - PTRACE_PEEKTEXT,.addr = -3}, {
> - PTRACE_PEEKTEXT,.addr = -4}, {
> - PTRACE_PEEKUSER,.addr = SIZEOF_USER + 1}, {
> - PTRACE_PEEKUSER,.addr = SIZEOF_USER + 2}, {
> - PTRACE_PEEKUSER,.addr = SIZEOF_USER + 3}, {
> - PTRACE_PEEKUSER,.addr = SIZEOF_USER + 4}, {
> - PTRACE_PEEKUSER,.addr = -1}, {
> - PTRACE_PEEKUSER,.addr = -2}, {
> - PTRACE_PEEKUSER,.addr = -3}, {
> - PTRACE_PEEKUSER,.addr = -4}, {
> - PTRACE_POKEDATA,.addr = 0}, {
> - PTRACE_POKEDATA,.addr = 1}, {
> - PTRACE_POKEDATA,.addr = 2}, {
> - PTRACE_POKEDATA,.addr = 3}, {
> - PTRACE_POKEDATA,.addr = -1}, {
> - PTRACE_POKEDATA,.addr = -2}, {
> - PTRACE_POKEDATA,.addr = -3}, {
> - PTRACE_POKEDATA,.addr = -4}, {
> - PTRACE_POKETEXT,.addr = 0}, {
> - PTRACE_POKETEXT,.addr = 1}, {
> - PTRACE_POKETEXT,.addr = 2}, {
> - PTRACE_POKETEXT,.addr = 3}, {
> - PTRACE_POKETEXT,.addr = -1}, {
> - PTRACE_POKETEXT,.addr = -2}, {
> - PTRACE_POKETEXT,.addr = -3}, {
> - PTRACE_POKETEXT,.addr = -4}, {
> - PTRACE_POKEUSER,.addr = SIZEOF_USER + 1}, {
> - PTRACE_POKEUSER,.addr = SIZEOF_USER + 2}, {
> - PTRACE_POKEUSER,.addr = SIZEOF_USER + 3}, {
> - PTRACE_POKEUSER,.addr = SIZEOF_USER + 4}, {
> - PTRACE_POKEUSER,.addr = -1}, {
> - PTRACE_POKEUSER,.addr = -2}, {
> - PTRACE_POKEUSER,.addr = -3}, {
> - PTRACE_POKEUSER,.addr = -4},
> + {PTRACE_PEEKDATA, .addr = 0},
> + {PTRACE_PEEKDATA, .addr = 1},
> + {PTRACE_PEEKDATA, .addr = 2},
> + {PTRACE_PEEKDATA, .addr = 3},
> + {PTRACE_PEEKDATA, .addr = -1},
> + {PTRACE_PEEKDATA, .addr = -2},
> + {PTRACE_PEEKDATA, .addr = -3},
> + {PTRACE_PEEKDATA, .addr = -4},
> + {PTRACE_PEEKTEXT, .addr = 0},
> + {PTRACE_PEEKTEXT, .addr = 1},
> + {PTRACE_PEEKTEXT, .addr = 2},
> + {PTRACE_PEEKTEXT, .addr = 3},
> + {PTRACE_PEEKTEXT, .addr = -1},
> + {PTRACE_PEEKTEXT, .addr = -2},
> + {PTRACE_PEEKTEXT, .addr = -3},
> + {PTRACE_PEEKTEXT, .addr = -4},
> + {PTRACE_PEEKUSER, .addr = SIZEOF_USER + 1},
> + {PTRACE_PEEKUSER, .addr = SIZEOF_USER + 2},
> + {PTRACE_PEEKUSER, .addr = SIZEOF_USER + 3},
> + {PTRACE_PEEKUSER, .addr = SIZEOF_USER + 4},
> + {PTRACE_PEEKUSER, .addr = -1},
> + {PTRACE_PEEKUSER, .addr = -2},
> + {PTRACE_PEEKUSER, .addr = -3},
> + {PTRACE_PEEKUSER, .addr = -4},
> + {PTRACE_POKEDATA, .addr = 0},
> + {PTRACE_POKEDATA, .addr = 1},
> + {PTRACE_POKEDATA, .addr = 2},
> + {PTRACE_POKEDATA, .addr = 3},
> + {PTRACE_POKEDATA, .addr = -1},
> + {PTRACE_POKEDATA, .addr = -2},
> + {PTRACE_POKEDATA, .addr = -3},
> + {PTRACE_POKEDATA, .addr = -4},
> + {PTRACE_POKETEXT, .addr = 0},
> + {PTRACE_POKETEXT, .addr = 1},
> + {PTRACE_POKETEXT, .addr = 2},
> + {PTRACE_POKETEXT, .addr = 3},
> + {PTRACE_POKETEXT, .addr = -1},
> + {PTRACE_POKETEXT, .addr = -2},
> + {PTRACE_POKETEXT, .addr = -3},
> + {PTRACE_POKETEXT, .addr = -4},
> + {PTRACE_POKEUSER, .addr = SIZEOF_USER + 1},
> + {PTRACE_POKEUSER, .addr = SIZEOF_USER + 2},
> + {PTRACE_POKEUSER, .addr = SIZEOF_USER + 3},
> + {PTRACE_POKEUSER, .addr = SIZEOF_USER + 4},
> + {PTRACE_POKEUSER, .addr = -1},
> + {PTRACE_POKEUSER, .addr = -2},
> + {PTRACE_POKEUSER, .addr = -3},
> + {PTRACE_POKEUSER, .addr = -4},
> #ifdef PTRACE_GETREGS
> - {
> - PTRACE_GETREGS,.data = 0}, {
> - PTRACE_GETREGS,.data = 1}, {
> - PTRACE_GETREGS,.data = 2}, {
> - PTRACE_GETREGS,.data = 3}, {
> - PTRACE_GETREGS,.data = -1}, {
> - PTRACE_GETREGS,.data = -2}, {
> - PTRACE_GETREGS,.data = -3}, {
> - PTRACE_GETREGS,.data = -4},
> + {PTRACE_GETREGS, .data = 0},
> + {PTRACE_GETREGS, .data = 1},
> + {PTRACE_GETREGS, .data = 2},
> + {PTRACE_GETREGS, .data = 3},
> + {PTRACE_GETREGS, .data = -1},
> + {PTRACE_GETREGS, .data = -2},
> + {PTRACE_GETREGS, .data = -3},
> + {PTRACE_GETREGS, .data = -4},
> #endif
> #ifdef PTRACE_GETFGREGS
> - {
> - PTRACE_GETFGREGS,.data = 0}, {
> - PTRACE_GETFGREGS,.data = 1}, {
> - PTRACE_GETFGREGS,.data = 2}, {
> - PTRACE_GETFGREGS,.data = 3}, {
> - PTRACE_GETFGREGS,.data = -1}, {
> - PTRACE_GETFGREGS,.data = -2}, {
> - PTRACE_GETFGREGS,.data = -3}, {
> - PTRACE_GETFGREGS,.data = -4},
> + {PTRACE_GETFGREGS, .data = 0},
> + {PTRACE_GETFGREGS, .data = 1},
> + {PTRACE_GETFGREGS, .data = 2},
> + {PTRACE_GETFGREGS, .data = 3},
> + {PTRACE_GETFGREGS, .data = -1},
> + {PTRACE_GETFGREGS, .data = -2},
> + {PTRACE_GETFGREGS, .data = -3},
> + {PTRACE_GETFGREGS, .data = -4},
> #endif
> #ifdef PTRACE_SETREGS
> - {
> - PTRACE_SETREGS,.data = 0}, {
> - PTRACE_SETREGS,.data = 1}, {
> - PTRACE_SETREGS,.data = 2}, {
> - PTRACE_SETREGS,.data = 3}, {
> - PTRACE_SETREGS,.data = -1}, {
> - PTRACE_SETREGS,.data = -2}, {
> - PTRACE_SETREGS,.data = -3}, {
> - PTRACE_SETREGS,.data = -4},
> + {PTRACE_SETREGS, .data = 0},
> + {PTRACE_SETREGS, .data = 1},
> + {PTRACE_SETREGS, .data = 2},
> + {PTRACE_SETREGS, .data = 3},
> + {PTRACE_SETREGS, .data = -1},
> + {PTRACE_SETREGS, .data = -2},
> + {PTRACE_SETREGS, .data = -3},
> + {PTRACE_SETREGS, .data = -4},
> #endif
> #ifdef PTRACE_SETFGREGS
> - {
> - PTRACE_SETFGREGS,.data = 0}, {
> - PTRACE_SETFGREGS,.data = 1}, {
> - PTRACE_SETFGREGS,.data = 2}, {
> - PTRACE_SETFGREGS,.data = 3}, {
> - PTRACE_SETFGREGS,.data = -1}, {
> - PTRACE_SETFGREGS,.data = -2}, {
> - PTRACE_SETFGREGS,.data = -3}, {
> - PTRACE_SETFGREGS,.data = -4},
> + {PTRACE_SETFGREGS, .data = 0},
> + {PTRACE_SETFGREGS, .data = 1},
> + {PTRACE_SETFGREGS, .data = 2},
> + {PTRACE_SETFGREGS, .data = 3},
> + {PTRACE_SETFGREGS, .data = -1},
> + {PTRACE_SETFGREGS, .data = -2},
> + {PTRACE_SETFGREGS, .data = -3},
> + {PTRACE_SETFGREGS, .data = -4},
> #endif
> #if HAVE_DECL_PTRACE_GETSIGINFO
> - {
> - PTRACE_GETSIGINFO,.data = 0}, {
> - PTRACE_GETSIGINFO,.data = 1}, {
> - PTRACE_GETSIGINFO,.data = 2}, {
> - PTRACE_GETSIGINFO,.data = 3}, {
> - PTRACE_GETSIGINFO,.data = -1}, {
> - PTRACE_GETSIGINFO,.data = -2}, {
> - PTRACE_GETSIGINFO,.data = -3}, {
> - PTRACE_GETSIGINFO,.data = -4},
> + {PTRACE_GETSIGINFO, .data = 0},
> + {PTRACE_GETSIGINFO, .data = 1},
> + {PTRACE_GETSIGINFO, .data = 2},
> + {PTRACE_GETSIGINFO, .data = 3},
> + {PTRACE_GETSIGINFO, .data = -1},
> + {PTRACE_GETSIGINFO, .data = -2},
> + {PTRACE_GETSIGINFO, .data = -3},
> + {PTRACE_GETSIGINFO, .data = -4},
> #endif
> #if HAVE_DECL_PTRACE_SETSIGINFO
> - {
> - PTRACE_SETSIGINFO,.data = 0}, {
> - PTRACE_SETSIGINFO,.data = 1}, {
> - PTRACE_SETSIGINFO,.data = 2}, {
> - PTRACE_SETSIGINFO,.data = 3}, {
> - PTRACE_SETSIGINFO,.data = -1}, {
> - PTRACE_SETSIGINFO,.data = -2}, {
> - PTRACE_SETSIGINFO,.data = -3}, {
> - PTRACE_SETSIGINFO,.data = -4},
> + {PTRACE_SETSIGINFO, .data = 0},
> + {PTRACE_SETSIGINFO, .data = 1},
> + {PTRACE_SETSIGINFO, .data = 2},
> + {PTRACE_SETSIGINFO, .data = 3},
> + {PTRACE_SETSIGINFO, .data = -1},
> + {PTRACE_SETSIGINFO, .data = -2},
> + {PTRACE_SETSIGINFO, .data = -3},
> + {PTRACE_SETSIGINFO, .data = -4},
> +#endif
> +};
> +
> +#define SPT(x)[PTRACE_##x] = #x,
> +static char *strings[] = {
> + SPT(TRACEME)
> + SPT(PEEKTEXT)
> + SPT(PEEKDATA)
> + SPT(PEEKUSER)
> + SPT(POKETEXT)
> + SPT(POKEDATA)
> + SPT(POKEUSER)
> +#ifdef PTRACE_GETREGS
> + SPT(GETREGS)
> +#endif
> +#ifdef PTRACE_SETREGS
> + SPT(SETREGS)
> +#endif
> +#ifdef PTRACE_GETSIGINFO
> + SPT(GETSIGINFO)
> #endif
> +#ifdef PTRACE_SETSIGINFO
> + SPT(SETSIGINFO)
> +#endif
> +#ifdef PTRACE_GETFGREGS
> + SPT(GETFGREGS)
> +#endif
> +#ifdef PTRACE_SETFGREGS
> + SPT(SETFGREGS)
> +#endif
> + SPT(KILL)
> + SPT(SINGLESTEP)
> };
>
> -int TST_TOTAL = ARRAY_SIZE(test_cases);
> +static void child(void)
> +{
> + SAFE_PTRACE(PTRACE_TRACEME, 0, NULL, NULL);
> + raise(SIGSTOP);
> + exit(0);
> +}
>
> -int main(int argc, char *argv[])
> +static void run(void)
> {
> size_t i;
> - long ret;
> - int saved_errno;
> + int pid;
> + int status;
> + int exp_errnos[] = {EIO, EFAULT};
> +
> + pid = SAFE_FORK();
>
> - tst_parse_opts(argc, argv, NULL, NULL);
> + if (!pid)
> + child();
>
> - make_a_baby(argc, argv);
> + SAFE_WAIT(&status);
> +
> + if (!WIFSTOPPED(status))
> + tst_brk(TBROK, "child %d was not stopped", pid);
>
> for (i = 0; i < ARRAY_SIZE(test_cases); ++i) {
> struct test_case_t *tc = &test_cases[i];
>
> - errno = 0;
> - ret =
> - ptrace(tc->request, pid, (void *)tc->addr,
> - (void *)tc->data);
> - saved_errno = errno;
> - if (ret != -1)
> - tst_resm(TFAIL,
> - "ptrace(%s, ..., %li, %li) returned %li instead of -1",
> - strptrace(tc->request), tc->addr, tc->data,
> - ret);
> - else if (saved_errno != EIO && saved_errno != EFAULT)
> - tst_resm(TFAIL,
> - "ptrace(%s, ..., %li, %li) expected errno EIO or EFAULT; actual: %i (%s)",
> - strptrace(tc->request), tc->addr, tc->data,
> - saved_errno, strerror(saved_errno));
> - else
> - tst_resm(TPASS,
> - "ptrace(%s, ..., %li, %li) failed as expected",
> - strptrace(tc->request), tc->addr, tc->data);
> + TEST(ptrace(tc->request, pid, (void *)tc->addr,
> + (void *)tc->data));
This test is not useful here, have you forget to remove this macro after
TST_EXP_FAIL_ARR() has been added?
> + TST_EXP_FAIL_ARR(ptrace(tc->request, pid, (void *)tc->addr,
> + (void *)tc->data), exp_errnos, ARRAY_SIZE(exp_errnos),
> + "ptrace(%s, ..., %li, %li) failed as expected",
> + strings[tc->request], tc->addr, tc->data);
> }
>
> - /* hopefully this worked */
> - ptrace(PTRACE_KILL, pid, NULL, NULL);
> + SAFE_PTRACE(PTRACE_CONT, pid, NULL, NULL);
>
> - tst_exit();
> }
> +
> +static struct tst_test test = {
> + .test_all = run,
> + .forks_child = 1,
> +};
> diff --git a/testcases/kernel/syscalls/ptrace/ptrace06_child.c b/testcases/kernel/syscalls/ptrace/ptrace06_child.c
> new file mode 100644
> index 000000000..350b0e8df
> --- /dev/null
> +++ b/testcases/kernel/syscalls/ptrace/ptrace06_child.c
> @@ -0,0 +1,16 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2018 Linux Test Project
> + * Copyright (C) 2015 Cyril Hrubis chrubis@suse.cz
> + */
> +
> +#define TST_NO_DEFAULT_MAIN
> +#include "tst_test.h"
> +
> +int main(int argc, char *argv[])
> +{
> +
> + tst_res(TPASS, "%s executed", argv[0]);
> +
> + return 0;
> +}
This program does not appear to be used at all.
With the useless parts removed:
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2025-01-16 16:50 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-25 11:22 [LTP] [PATCH v1 0/2] ptrace: Refactor Wei Gao via ltp
2023-09-25 11:22 ` [LTP] [PATCH v1 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2023-11-28 8:57 ` Richard Palethorpe
2023-11-28 9:24 ` Petr Vorel
2023-09-25 11:22 ` [LTP] [PATCH v1 2/2] ptrace06: " Wei Gao via ltp
2023-11-28 9:31 ` Richard Palethorpe
2023-11-28 9:51 ` Petr Vorel
2023-12-01 1:06 ` Wei Gao via ltp
2023-12-01 0:59 ` [LTP] [PATCH v2 0/2] ptrace: Refactor Wei Gao via ltp
2023-12-01 0:59 ` [LTP] [PATCH v2 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2024-02-08 16:15 ` Andrea Cervesato via ltp
2023-12-01 0:59 ` [LTP] [PATCH v2 2/2] ptrace06: " Wei Gao via ltp
2024-02-08 16:25 ` Andrea Cervesato via ltp
2024-06-03 10:35 ` [LTP] [PATCH v3 0/2] ptrace: Refactor Wei Gao via ltp
2024-06-03 10:35 ` [LTP] [PATCH v3 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2024-06-28 15:35 ` Cyril Hrubis
2024-06-03 10:35 ` [LTP] [PATCH v3 2/2] ptrace06: " Wei Gao via ltp
2024-06-28 16:15 ` Cyril Hrubis
2024-12-17 6:16 ` [LTP] [PATCH v4 0/2] ptrace: Refactor Wei Gao via ltp
2024-12-17 6:16 ` [LTP] [PATCH v4 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2025-01-08 13:39 ` Petr Vorel
2024-12-17 6:16 ` [LTP] [PATCH v4 2/2] ptrace06: " Wei Gao via ltp
2025-01-09 8:55 ` Petr Vorel
2025-01-13 8:16 ` [LTP] [PATCH v5 0/2] ptrace: Refactor Wei Gao via ltp
2025-01-13 8:16 ` [LTP] [PATCH v5 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2025-01-13 16:02 ` Cyril Hrubis
2025-01-13 21:40 ` Petr Vorel
2025-01-14 9:25 ` Cyril Hrubis
2025-01-13 8:16 ` [LTP] [PATCH v5 2/2] ptrace06: " Wei Gao via ltp
2025-01-14 12:40 ` [LTP] [PATCH v6 0/2] ptrace: Refactor Wei Gao via ltp
2025-01-14 12:40 ` [LTP] [PATCH v6 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2025-01-14 13:05 ` Cyril Hrubis
2025-01-14 12:40 ` [LTP] [PATCH v6 2/2] ptrace06: " Wei Gao via ltp
2025-01-14 14:32 ` [LTP] [PATCH v7 0/2] ptrace: Refactor Wei Gao via ltp
2025-01-14 14:32 ` [LTP] [PATCH v7 1/2] ptrace05: Refactor the test using new LTP API Wei Gao via ltp
2025-01-16 16:44 ` Cyril Hrubis
2025-01-14 14:32 ` [LTP] [PATCH v7 2/2] ptrace06: " Wei Gao via ltp
2025-01-16 16:50 ` Cyril Hrubis [this message]
2025-01-17 10:40 ` Petr Vorel
2025-01-17 10:42 ` Cyril Hrubis
2025-01-17 11:12 ` Petr Vorel
2025-01-20 4:14 ` [LTP] [PATCH v8 0/2] ptrace: Refactor Wei Gao via ltp
2025-01-20 4:14 ` [LTP] [PATCH v8 1/2] ptrace06: Refactor the test using new LTP API Wei Gao via ltp
2025-01-20 13:35 ` Petr Vorel
2025-01-20 4:14 ` [LTP] [PATCH v8 2/2] ptrace06_child.c: Remove unused ptrace06_child.c Wei Gao via ltp
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=Z4k4yCM67CBKMUGL@yuki.lan \
--to=chrubis@suse.cz \
--cc=ltp@lists.linux.it \
--cc=wegao@suse.com \
/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.