* [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined
@ 2026-03-26 20:18 david.laight.linux
2026-03-26 20:24 ` Pablo Neira Ayuso
2026-03-27 9:47 ` Petr Mladek
0 siblings, 2 replies; 6+ messages in thread
From: david.laight.linux @ 2026-03-26 20:18 UTC (permalink / raw)
To: Pablo Neira Ayuso, Florian Westphal, Phil Sutter, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
netfilter-devel, coreteam, netdev, linux-kernel
Cc: David Laight, Masami Hiramatsu, Petr Mladek, Rasmus Villemoes,
Andy Shevchenko, Steven Rostedt, Sergey Senozhatsky,
Andrew Morton
From: David Laight <david.laight.linux@gmail.com>
The trace lines are indented using PRINT("%*.s", xx, " ").
Userspace will treat this as "%*.0s" and will output no characters
when 'xx' is zero, the kernel treats it as "%*s" and will output
a single ' ' - which is probably what is intended.
Change all the formats to "%*s" removing the default precision.
This gives a single space indent when level is zero.
Signed-off-by: David Laight <david.laight.linux@gmail.com>
---
net/netfilter/nf_conntrack_h323_asn1.c | 38 +++++++++++++-------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conntrack_h323_asn1.c
index 7b1497ed97d2..287402428975 100644
--- a/net/netfilter/nf_conntrack_h323_asn1.c
+++ b/net/netfilter/nf_conntrack_h323_asn1.c
@@ -276,7 +276,7 @@ static unsigned int get_uint(struct bitstr *bs, int b)
static int decode_nul(struct bitstr *bs, const struct field_t *f,
char *base, int level)
{
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
return H323_ERROR_NONE;
}
@@ -284,7 +284,7 @@ static int decode_nul(struct bitstr *bs, const struct field_t *f,
static int decode_bool(struct bitstr *bs, const struct field_t *f,
char *base, int level)
{
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
INC_BIT(bs);
if (nf_h323_error_boundary(bs, 0, 0))
@@ -297,7 +297,7 @@ static int decode_oid(struct bitstr *bs, const struct field_t *f,
{
int len;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
BYTE_ALIGN(bs);
if (nf_h323_error_boundary(bs, 1, 0))
@@ -316,7 +316,7 @@ static int decode_int(struct bitstr *bs, const struct field_t *f,
{
unsigned int len;
- PRINT("%*.s%s", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s", level * TAB_SIZE, " ", f->name);
switch (f->sz) {
case BYTE: /* Range == 256 */
@@ -363,7 +363,7 @@ static int decode_int(struct bitstr *bs, const struct field_t *f,
static int decode_enum(struct bitstr *bs, const struct field_t *f,
char *base, int level)
{
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
if ((f->attr & EXT) && get_bit(bs)) {
INC_BITS(bs, 7);
@@ -381,7 +381,7 @@ static int decode_bitstr(struct bitstr *bs, const struct field_t *f,
{
unsigned int len;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
BYTE_ALIGN(bs);
switch (f->sz) {
@@ -417,7 +417,7 @@ static int decode_numstr(struct bitstr *bs, const struct field_t *f,
{
unsigned int len;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
/* 2 <= Range <= 255 */
if (nf_h323_error_boundary(bs, 0, f->sz))
@@ -437,7 +437,7 @@ static int decode_octstr(struct bitstr *bs, const struct field_t *f,
{
unsigned int len;
- PRINT("%*.s%s", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s", level * TAB_SIZE, " ", f->name);
switch (f->sz) {
case FIXD: /* Range == 1 */
@@ -490,7 +490,7 @@ static int decode_bmpstr(struct bitstr *bs, const struct field_t *f,
{
unsigned int len;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
switch (f->sz) {
case BYTE: /* Range == 256 */
@@ -522,7 +522,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
const struct field_t *son;
unsigned char *beg = NULL;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
/* Decode? */
base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
@@ -544,7 +544,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
/* Decode the root components */
for (i = opt = 0, son = f->fields; i < f->lb; i++, son++) {
if (son->attr & STOP) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
son->name);
return H323_ERROR_STOP;
}
@@ -562,7 +562,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
if (nf_h323_error_boundary(bs, len, 0))
return H323_ERROR_BOUND;
if (!base || !(son->attr & DECODE)) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE,
" ", son->name);
bs->cur += len;
continue;
@@ -615,7 +615,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
}
if (son->attr & STOP) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
son->name);
return H323_ERROR_STOP;
}
@@ -629,7 +629,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
if (nf_h323_error_boundary(bs, len, 0))
return H323_ERROR_BOUND;
if (!base || !(son->attr & DECODE)) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
son->name);
bs->cur += len;
continue;
@@ -655,7 +655,7 @@ static int decode_seqof(struct bitstr *bs, const struct field_t *f,
const struct field_t *son;
unsigned char *beg = NULL;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
/* Decode? */
base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
@@ -710,7 +710,7 @@ static int decode_seqof(struct bitstr *bs, const struct field_t *f,
if (nf_h323_error_boundary(bs, len, 0))
return H323_ERROR_BOUND;
if (!base || !(son->attr & DECODE)) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE,
" ", son->name);
bs->cur += len;
continue;
@@ -751,7 +751,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
const struct field_t *son;
unsigned char *beg = NULL;
- PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
+ PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
/* Decode? */
base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
@@ -792,7 +792,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
/* Transfer to son level */
son = &f->fields[type];
if (son->attr & STOP) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ", son->name);
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ", son->name);
return H323_ERROR_STOP;
}
@@ -804,7 +804,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
if (nf_h323_error_boundary(bs, len, 0))
return H323_ERROR_BOUND;
if (!base || !(son->attr & DECODE)) {
- PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
+ PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
son->name);
bs->cur += len;
return H323_ERROR_NONE;
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined
2026-03-26 20:18 [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined david.laight.linux
@ 2026-03-26 20:24 ` Pablo Neira Ayuso
2026-03-26 22:18 ` David Laight
2026-03-27 9:47 ` Petr Mladek
1 sibling, 1 reply; 6+ messages in thread
From: Pablo Neira Ayuso @ 2026-03-26 20:24 UTC (permalink / raw)
To: david.laight.linux
Cc: Florian Westphal, Phil Sutter, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman, netfilter-devel,
coreteam, netdev, linux-kernel, Masami Hiramatsu, Petr Mladek,
Rasmus Villemoes, Andy Shevchenko, Steven Rostedt,
Sergey Senozhatsky, Andrew Morton
Hi David,
On Thu, Mar 26, 2026 at 08:18:19PM +0000, david.laight.linux@gmail.com wrote:
> From: David Laight <david.laight.linux@gmail.com>
>
> The trace lines are indented using PRINT("%*.s", xx, " ").
> Userspace will treat this as "%*.0s" and will output no characters
> when 'xx' is zero, the kernel treats it as "%*s" and will output
> a single ' ' - which is probably what is intended.
>
> Change all the formats to "%*s" removing the default precision.
> This gives a single space indent when level is zero.
Do you have a setup using this helper? Or you just found this via
visual inspection?
> Signed-off-by: David Laight <david.laight.linux@gmail.com>
> ---
> net/netfilter/nf_conntrack_h323_asn1.c | 38 +++++++++++++-------------
> 1 file changed, 19 insertions(+), 19 deletions(-)
>
> diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conntrack_h323_asn1.c
> index 7b1497ed97d2..287402428975 100644
> --- a/net/netfilter/nf_conntrack_h323_asn1.c
> +++ b/net/netfilter/nf_conntrack_h323_asn1.c
> @@ -276,7 +276,7 @@ static unsigned int get_uint(struct bitstr *bs, int b)
> static int decode_nul(struct bitstr *bs, const struct field_t *f,
> char *base, int level)
> {
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> return H323_ERROR_NONE;
> }
> @@ -284,7 +284,7 @@ static int decode_nul(struct bitstr *bs, const struct field_t *f,
> static int decode_bool(struct bitstr *bs, const struct field_t *f,
> char *base, int level)
> {
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> INC_BIT(bs);
> if (nf_h323_error_boundary(bs, 0, 0))
> @@ -297,7 +297,7 @@ static int decode_oid(struct bitstr *bs, const struct field_t *f,
> {
> int len;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> BYTE_ALIGN(bs);
> if (nf_h323_error_boundary(bs, 1, 0))
> @@ -316,7 +316,7 @@ static int decode_int(struct bitstr *bs, const struct field_t *f,
> {
> unsigned int len;
>
> - PRINT("%*.s%s", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s", level * TAB_SIZE, " ", f->name);
>
> switch (f->sz) {
> case BYTE: /* Range == 256 */
> @@ -363,7 +363,7 @@ static int decode_int(struct bitstr *bs, const struct field_t *f,
> static int decode_enum(struct bitstr *bs, const struct field_t *f,
> char *base, int level)
> {
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> if ((f->attr & EXT) && get_bit(bs)) {
> INC_BITS(bs, 7);
> @@ -381,7 +381,7 @@ static int decode_bitstr(struct bitstr *bs, const struct field_t *f,
> {
> unsigned int len;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> BYTE_ALIGN(bs);
> switch (f->sz) {
> @@ -417,7 +417,7 @@ static int decode_numstr(struct bitstr *bs, const struct field_t *f,
> {
> unsigned int len;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> /* 2 <= Range <= 255 */
> if (nf_h323_error_boundary(bs, 0, f->sz))
> @@ -437,7 +437,7 @@ static int decode_octstr(struct bitstr *bs, const struct field_t *f,
> {
> unsigned int len;
>
> - PRINT("%*.s%s", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s", level * TAB_SIZE, " ", f->name);
>
> switch (f->sz) {
> case FIXD: /* Range == 1 */
> @@ -490,7 +490,7 @@ static int decode_bmpstr(struct bitstr *bs, const struct field_t *f,
> {
> unsigned int len;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> switch (f->sz) {
> case BYTE: /* Range == 256 */
> @@ -522,7 +522,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> const struct field_t *son;
> unsigned char *beg = NULL;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> /* Decode? */
> base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
> @@ -544,7 +544,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> /* Decode the root components */
> for (i = opt = 0, son = f->fields; i < f->lb; i++, son++) {
> if (son->attr & STOP) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> son->name);
> return H323_ERROR_STOP;
> }
> @@ -562,7 +562,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> if (nf_h323_error_boundary(bs, len, 0))
> return H323_ERROR_BOUND;
> if (!base || !(son->attr & DECODE)) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE,
> " ", son->name);
> bs->cur += len;
> continue;
> @@ -615,7 +615,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> }
>
> if (son->attr & STOP) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> son->name);
> return H323_ERROR_STOP;
> }
> @@ -629,7 +629,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> if (nf_h323_error_boundary(bs, len, 0))
> return H323_ERROR_BOUND;
> if (!base || !(son->attr & DECODE)) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> son->name);
> bs->cur += len;
> continue;
> @@ -655,7 +655,7 @@ static int decode_seqof(struct bitstr *bs, const struct field_t *f,
> const struct field_t *son;
> unsigned char *beg = NULL;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> /* Decode? */
> base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
> @@ -710,7 +710,7 @@ static int decode_seqof(struct bitstr *bs, const struct field_t *f,
> if (nf_h323_error_boundary(bs, len, 0))
> return H323_ERROR_BOUND;
> if (!base || !(son->attr & DECODE)) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE,
> " ", son->name);
> bs->cur += len;
> continue;
> @@ -751,7 +751,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
> const struct field_t *son;
> unsigned char *beg = NULL;
>
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> /* Decode? */
> base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
> @@ -792,7 +792,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
> /* Transfer to son level */
> son = &f->fields[type];
> if (son->attr & STOP) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ", son->name);
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ", son->name);
> return H323_ERROR_STOP;
> }
>
> @@ -804,7 +804,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
> if (nf_h323_error_boundary(bs, len, 0))
> return H323_ERROR_BOUND;
> if (!base || !(son->attr & DECODE)) {
> - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> son->name);
> bs->cur += len;
> return H323_ERROR_NONE;
> --
> 2.39.5
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined
2026-03-26 20:24 ` Pablo Neira Ayuso
@ 2026-03-26 22:18 ` David Laight
2026-03-27 9:24 ` Andy Shevchenko
0 siblings, 1 reply; 6+ messages in thread
From: David Laight @ 2026-03-26 22:18 UTC (permalink / raw)
To: Pablo Neira Ayuso
Cc: Florian Westphal, Phil Sutter, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Simon Horman, netfilter-devel,
coreteam, netdev, linux-kernel, Masami Hiramatsu, Petr Mladek,
Rasmus Villemoes, Andy Shevchenko, Steven Rostedt,
Sergey Senozhatsky, Andrew Morton
On Thu, 26 Mar 2026 21:24:39 +0100
Pablo Neira Ayuso <pablo@netfilter.org> wrote:
> Hi David,
>
> On Thu, Mar 26, 2026 at 08:18:19PM +0000, david.laight.linux@gmail.com wrote:
> > From: David Laight <david.laight.linux@gmail.com>
> >
> > The trace lines are indented using PRINT("%*.s", xx, " ").
> > Userspace will treat this as "%*.0s" and will output no characters
> > when 'xx' is zero, the kernel treats it as "%*s" and will output
> > a single ' ' - which is probably what is intended.
> >
> > Change all the formats to "%*s" removing the default precision.
> > This gives a single space indent when level is zero.
>
> Do you have a setup using this helper? Or you just found this via
> visual inspection?
Found with grep looking for places which might be affected by 'fixing'
the kernel printf code to be POSIX compliant.
David
>
> > Signed-off-by: David Laight <david.laight.linux@gmail.com>
> > ---
> > net/netfilter/nf_conntrack_h323_asn1.c | 38 +++++++++++++-------------
> > 1 file changed, 19 insertions(+), 19 deletions(-)
> >
> > diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conntrack_h323_asn1.c
> > index 7b1497ed97d2..287402428975 100644
> > --- a/net/netfilter/nf_conntrack_h323_asn1.c
> > +++ b/net/netfilter/nf_conntrack_h323_asn1.c
> > @@ -276,7 +276,7 @@ static unsigned int get_uint(struct bitstr *bs, int b)
> > static int decode_nul(struct bitstr *bs, const struct field_t *f,
> > char *base, int level)
> > {
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > return H323_ERROR_NONE;
> > }
> > @@ -284,7 +284,7 @@ static int decode_nul(struct bitstr *bs, const struct field_t *f,
> > static int decode_bool(struct bitstr *bs, const struct field_t *f,
> > char *base, int level)
> > {
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > INC_BIT(bs);
> > if (nf_h323_error_boundary(bs, 0, 0))
> > @@ -297,7 +297,7 @@ static int decode_oid(struct bitstr *bs, const struct field_t *f,
> > {
> > int len;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > BYTE_ALIGN(bs);
> > if (nf_h323_error_boundary(bs, 1, 0))
> > @@ -316,7 +316,7 @@ static int decode_int(struct bitstr *bs, const struct field_t *f,
> > {
> > unsigned int len;
> >
> > - PRINT("%*.s%s", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s", level * TAB_SIZE, " ", f->name);
> >
> > switch (f->sz) {
> > case BYTE: /* Range == 256 */
> > @@ -363,7 +363,7 @@ static int decode_int(struct bitstr *bs, const struct field_t *f,
> > static int decode_enum(struct bitstr *bs, const struct field_t *f,
> > char *base, int level)
> > {
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > if ((f->attr & EXT) && get_bit(bs)) {
> > INC_BITS(bs, 7);
> > @@ -381,7 +381,7 @@ static int decode_bitstr(struct bitstr *bs, const struct field_t *f,
> > {
> > unsigned int len;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > BYTE_ALIGN(bs);
> > switch (f->sz) {
> > @@ -417,7 +417,7 @@ static int decode_numstr(struct bitstr *bs, const struct field_t *f,
> > {
> > unsigned int len;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > /* 2 <= Range <= 255 */
> > if (nf_h323_error_boundary(bs, 0, f->sz))
> > @@ -437,7 +437,7 @@ static int decode_octstr(struct bitstr *bs, const struct field_t *f,
> > {
> > unsigned int len;
> >
> > - PRINT("%*.s%s", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s", level * TAB_SIZE, " ", f->name);
> >
> > switch (f->sz) {
> > case FIXD: /* Range == 1 */
> > @@ -490,7 +490,7 @@ static int decode_bmpstr(struct bitstr *bs, const struct field_t *f,
> > {
> > unsigned int len;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > switch (f->sz) {
> > case BYTE: /* Range == 256 */
> > @@ -522,7 +522,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> > const struct field_t *son;
> > unsigned char *beg = NULL;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > /* Decode? */
> > base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
> > @@ -544,7 +544,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> > /* Decode the root components */
> > for (i = opt = 0, son = f->fields; i < f->lb; i++, son++) {
> > if (son->attr & STOP) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> > son->name);
> > return H323_ERROR_STOP;
> > }
> > @@ -562,7 +562,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> > if (nf_h323_error_boundary(bs, len, 0))
> > return H323_ERROR_BOUND;
> > if (!base || !(son->attr & DECODE)) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE,
> > " ", son->name);
> > bs->cur += len;
> > continue;
> > @@ -615,7 +615,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> > }
> >
> > if (son->attr & STOP) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> > son->name);
> > return H323_ERROR_STOP;
> > }
> > @@ -629,7 +629,7 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
> > if (nf_h323_error_boundary(bs, len, 0))
> > return H323_ERROR_BOUND;
> > if (!base || !(son->attr & DECODE)) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> > son->name);
> > bs->cur += len;
> > continue;
> > @@ -655,7 +655,7 @@ static int decode_seqof(struct bitstr *bs, const struct field_t *f,
> > const struct field_t *son;
> > unsigned char *beg = NULL;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > /* Decode? */
> > base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
> > @@ -710,7 +710,7 @@ static int decode_seqof(struct bitstr *bs, const struct field_t *f,
> > if (nf_h323_error_boundary(bs, len, 0))
> > return H323_ERROR_BOUND;
> > if (!base || !(son->attr & DECODE)) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE,
> > " ", son->name);
> > bs->cur += len;
> > continue;
> > @@ -751,7 +751,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
> > const struct field_t *son;
> > unsigned char *beg = NULL;
> >
> > - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> > + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
> >
> > /* Decode? */
> > base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;
> > @@ -792,7 +792,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
> > /* Transfer to son level */
> > son = &f->fields[type];
> > if (son->attr & STOP) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ", son->name);
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ", son->name);
> > return H323_ERROR_STOP;
> > }
> >
> > @@ -804,7 +804,7 @@ static int decode_choice(struct bitstr *bs, const struct field_t *f,
> > if (nf_h323_error_boundary(bs, len, 0))
> > return H323_ERROR_BOUND;
> > if (!base || !(son->attr & DECODE)) {
> > - PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",
> > + PRINT("%*s%s\n", (level + 1) * TAB_SIZE, " ",
> > son->name);
> > bs->cur += len;
> > return H323_ERROR_NONE;
> > --
> > 2.39.5
> >
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined
2026-03-26 22:18 ` David Laight
@ 2026-03-27 9:24 ` Andy Shevchenko
2026-03-27 9:51 ` David Laight
0 siblings, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2026-03-27 9:24 UTC (permalink / raw)
To: David Laight
Cc: Pablo Neira Ayuso, Florian Westphal, Phil Sutter, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
netfilter-devel, coreteam, netdev, linux-kernel, Masami Hiramatsu,
Petr Mladek, Rasmus Villemoes, Steven Rostedt, Sergey Senozhatsky,
Andrew Morton
On Thu, Mar 26, 2026 at 10:18:09PM +0000, David Laight wrote:
> On Thu, 26 Mar 2026 21:24:39 +0100
> Pablo Neira Ayuso <pablo@netfilter.org> wrote:
> > On Thu, Mar 26, 2026 at 08:18:19PM +0000, david.laight.linux@gmail.com wrote:
> > >
> > > The trace lines are indented using PRINT("%*.s", xx, " ").
> > > Userspace will treat this as "%*.0s" and will output no characters
> > > when 'xx' is zero, the kernel treats it as "%*s" and will output
> > > a single ' ' - which is probably what is intended.
> > >
> > > Change all the formats to "%*s" removing the default precision.
> > > This gives a single space indent when level is zero.
> >
> > Do you have a setup using this helper? Or you just found this via
> > visual inspection?
>
> Found with grep looking for places which might be affected by 'fixing'
> the kernel printf code to be POSIX compliant.
Do we have the respective test case in printf_kunit?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined
2026-03-26 20:18 [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined david.laight.linux
2026-03-26 20:24 ` Pablo Neira Ayuso
@ 2026-03-27 9:47 ` Petr Mladek
1 sibling, 0 replies; 6+ messages in thread
From: Petr Mladek @ 2026-03-27 9:47 UTC (permalink / raw)
To: david.laight.linux
Cc: Pablo Neira Ayuso, Florian Westphal, Phil Sutter, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
netfilter-devel, coreteam, netdev, linux-kernel, Masami Hiramatsu,
Rasmus Villemoes, Andy Shevchenko, Steven Rostedt,
Sergey Senozhatsky, Andrew Morton
On Thu 2026-03-26 20:18:19, david.laight.linux@gmail.com wrote:
> From: David Laight <david.laight.linux@gmail.com>
>
> The trace lines are indented using PRINT("%*.s", xx, " ").
> Userspace will treat this as "%*.0s" and will output no characters
> when 'xx' is zero, the kernel treats it as "%*s" and will output
> a single ' ' - which is probably what is intended.
>
> Change all the formats to "%*s" removing the default precision.
> This gives a single space indent when level is zero.
>
> Signed-off-by: David Laight <david.laight.linux@gmail.com>
> ---
> net/netfilter/nf_conntrack_h323_asn1.c | 38 +++++++++++++-------------
> 1 file changed, 19 insertions(+), 19 deletions(-)
>
> diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conntrack_h323_asn1.c
> index 7b1497ed97d2..287402428975 100644
> --- a/net/netfilter/nf_conntrack_h323_asn1.c
> +++ b/net/netfilter/nf_conntrack_h323_asn1.c
> @@ -276,7 +276,7 @@ static unsigned int get_uint(struct bitstr *bs, int b)
> static int decode_nul(struct bitstr *bs, const struct field_t *f,
> char *base, int level)
> {
> - PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);
> + PRINT("%*s%s\n", level * TAB_SIZE, " ", f->name);
>
> return H323_ERROR_NONE;
> }
The change is important for making the kernel %*.s handling POSIX
compliant. The dot '.' without any following number is handled
a zero precision by POSIX. It would print no space "" when
also the field width was zero, aka when level == 0.
It has no efect if the field width (@level) is always > 0 because
vsprintf() would add the required emptry spaces ' ' anyway.
Reviewed-by: Petr Mladek <pmladek@suse.com>
Best Regards,
Petr
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined
2026-03-27 9:24 ` Andy Shevchenko
@ 2026-03-27 9:51 ` David Laight
0 siblings, 0 replies; 6+ messages in thread
From: David Laight @ 2026-03-27 9:51 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Pablo Neira Ayuso, Florian Westphal, Phil Sutter, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
netfilter-devel, coreteam, netdev, linux-kernel, Masami Hiramatsu,
Petr Mladek, Rasmus Villemoes, Steven Rostedt, Sergey Senozhatsky,
Andrew Morton
On Fri, 27 Mar 2026 11:24:50 +0200
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
> On Thu, Mar 26, 2026 at 10:18:09PM +0000, David Laight wrote:
> > On Thu, 26 Mar 2026 21:24:39 +0100
> > Pablo Neira Ayuso <pablo@netfilter.org> wrote:
> > > On Thu, Mar 26, 2026 at 08:18:19PM +0000, david.laight.linux@gmail.com wrote:
> > > >
> > > > The trace lines are indented using PRINT("%*.s", xx, " ").
> > > > Userspace will treat this as "%*.0s" and will output no characters
> > > > when 'xx' is zero, the kernel treats it as "%*s" and will output
> > > > a single ' ' - which is probably what is intended.
> > > >
> > > > Change all the formats to "%*s" removing the default precision.
> > > > This gives a single space indent when level is zero.
> > >
> > > Do you have a setup using this helper? Or you just found this via
> > > visual inspection?
> >
> > Found with grep looking for places which might be affected by 'fixing'
> > the kernel printf code to be POSIX compliant.
>
> Do we have the respective test case in printf_kunit?
>
There are definitely related ones and this comment:
static void
test_string(struct kunit *kunittest)
{
[...]
/*
* POSIX and C99 say that a negative precision (which is only
* possible to pass via a * argument) should be treated as if
* the precision wasn't present, and that if the precision is
* omitted (as in %.s), the precision should be taken to be
* 0. However, the kernel's printf behave exactly opposite,
* treating a negative precision as 0 and treating an omitted
* precision specifier as if no precision was given.
*
* These test cases document the current behaviour; should
* anyone ever feel the need to follow the standards more
* closely, this can be revisited.
*/
test(" ", "%4.*s", -5, "123456");
[...]
}
I suspect whoever wrote the tests found the code was non-conformant.
But there isn't a comment in the snprintf() code itself.
I've not checked what the kernel code does (I've just written/fixed all
this for nolibc - the kernel will fail the nolibc tests).
David
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-03-27 9:52 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-26 20:18 [PATCH next] netfilter: nf_conntrack_h323: Correct indentation when H323_TRACE defined david.laight.linux
2026-03-26 20:24 ` Pablo Neira Ayuso
2026-03-26 22:18 ` David Laight
2026-03-27 9:24 ` Andy Shevchenko
2026-03-27 9:51 ` David Laight
2026-03-27 9:47 ` Petr Mladek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox