[DTrace-devel] [PATCH] print: Fix truncation

eugene.loh at oracle.com eugene.loh at oracle.com
Sat Dec 23 00:51:15 UTC 2023


From: Eugene Loh <eugene.loh at oracle.com>

The printsize option can be used to limit how much data is reported
by print().  A few corrections are needed.

1)  In dt_print_visit(), we check if offset/NBBY > dv_size.  E.g.,
if a 40-byte limit is set, then an 8-byte record at offset 40 will
be reported.  Change to offset/NBBY >= dv_size.  We do not worry
about the case where the print size ends in the middle of a record.

2)  dt_print_type() sets the size and then calls dt_print_visit().
But dt_print_visit() can also call itself recursively, and in this
case dv_size is not set.  The dv_size values at deeper depths are
garbage.  Have dt_print_visit() set dva2.dt_size.

The existing test for -xprintsize is corrected and a new test,
focused on truncation at deeper depths, is added.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_printf.c                        |   3 +-
 test/unittest/print/tst.print.local.trunc.d  |   9 +-
 test/unittest/print/tst.print.local.trunc.r  |   1 +
 test/unittest/print/tst.print.local.trunc2.d |  55 ++++++++
 test/unittest/print/tst.print.local.trunc2.r | 125 +++++++++++++++++++
 5 files changed, 191 insertions(+), 2 deletions(-)
 create mode 100644 test/unittest/print/tst.print.local.trunc2.d
 create mode 100644 test/unittest/print/tst.print.local.trunc2.r

diff --git a/libdtrace/dt_printf.c b/libdtrace/dt_printf.c
index 2658c6a8..e844dc1b 100644
--- a/libdtrace/dt_printf.c
+++ b/libdtrace/dt_printf.c
@@ -1993,7 +1993,7 @@ dt_print_visit(const char *name, ctf_id_t type, unsigned long offset,
 	int i;
 
 	/* run out of data to display, or hit depth limit? */
-	if ((offset/NBBY) > dva->dv_size || depth >= DT_PRINT_DEPTH) {
+	if ((offset/NBBY) >= dva->dv_size || depth >= DT_PRINT_DEPTH) {
 		dt_printf(dva->dv_dtp, dva->dv_fp, "%*s...\n",
 			  dva->dv_startindent + depth, "");
 		return -1;
@@ -2197,6 +2197,7 @@ doprint:
 		dva2.dv_fp = dva->dv_fp;
 		dva2.dv_data = dva->dv_data;
 		dva2.dv_startindent = dva->dv_startindent;
+		dva2.dv_size = dva->dv_size;
 		if (ctf_type_encoding(dva->dv_ctfp, a.ctr_contents, &e) < 0) {
 			dt_dprintf("error retrieving type encoding for array contents in [%ld]: %s\n",
 				   a.ctr_contents,
diff --git a/test/unittest/print/tst.print.local.trunc.d b/test/unittest/print/tst.print.local.trunc.d
index 25ad54b0..2e40dd84 100644
--- a/test/unittest/print/tst.print.local.trunc.d
+++ b/test/unittest/print/tst.print.local.trunc.d
@@ -41,9 +41,16 @@ BEGIN
 	t->s.f = 100,
 	t->g = 1;
 	t->h = FIRSTVAL;
+	printf("a %d; b %d; u %d; s %d; g %d; h %d\n",
+	    offsetof(struct test_struct, a),
+	    offsetof(struct test_struct, b),
+	    offsetof(struct test_struct, u),
+	    offsetof(struct test_struct, s),
+	    offsetof(struct test_struct, g),
+	    offsetof(struct test_struct, h));
 	print(t);
 	/* ensure printsize can be dynamically changed */
-	setopt("printsize", "16");
+	setopt("printsize", "24");
 	print(t);
 	exit(0);
 }
diff --git a/test/unittest/print/tst.print.local.trunc.r b/test/unittest/print/tst.print.local.trunc.r
index df5708d9..8cefaa17 100644
--- a/test/unittest/print/tst.print.local.trunc.r
+++ b/test/unittest/print/tst.print.local.trunc.r
@@ -1,3 +1,4 @@
+a 0; b 4; u 16; s 24; g 40; h 44
 {ptr} = *
                                             (struct test_struct) {
                                              .a = (int)1,
diff --git a/test/unittest/print/tst.print.local.trunc2.d b/test/unittest/print/tst.print.local.trunc2.d
new file mode 100644
index 00000000..5f500fc8
--- /dev/null
+++ b/test/unittest/print/tst.print.local.trunc2.d
@@ -0,0 +1,55 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+/* @@nosort */
+
+#pragma D option quiet
+
+struct test_struct {
+	long long	x;
+	struct {
+		long long x;
+		struct {
+			long long x;
+			struct {
+				long long x;
+				struct {
+					long long x;
+					struct {
+						long long x;
+						struct {
+							long long x;
+							struct {
+								long long x;
+							} g;
+						} f;
+					} e;
+				} d;
+			} c;
+		} b;
+	} a;
+};
+
+BEGIN
+{
+	t = (struct test_struct *)alloca(sizeof (struct test_struct));
+	t->x = 1111111111111111ll;
+	t->a.x = 2222222222222222ll;
+	t->a.b.x = 3333333333333333ll;
+	t->a.b.c.x = 4444444444444444ll;
+	t->a.b.c.d.x = 5555555555555555ll;
+	t->a.b.c.d.e.x = 6666666666666666ll;
+	t->a.b.c.d.e.f.x = 7777777777777777ll;
+	t->a.b.c.d.e.f.g.x = 8888888888888888ll;
+
+	setopt("printsize", "90"); print(t);
+	setopt("printsize", "64"); print(t);
+	setopt("printsize", "56"); print(t);
+	setopt("printsize", "48"); print(t);
+	setopt("printsize", "40"); print(t);
+	setopt("printsize", "32"); print(t);
+	exit(0);
+}
diff --git a/test/unittest/print/tst.print.local.trunc2.r b/test/unittest/print/tst.print.local.trunc2.r
new file mode 100644
index 00000000..7de3136c
--- /dev/null
+++ b/test/unittest/print/tst.print.local.trunc2.r
@@ -0,0 +1,125 @@
+{ptr} = *
+                                            (struct test_struct) {
+                                             .x = (long long)1111111111111111,
+                                             .a = (struct) {
+                                              .x = (long long)2222222222222222,
+                                              .b = (struct) {
+                                               .x = (long long)3333333333333333,
+                                               .c = (struct) {
+                                                .x = (long long)4444444444444444,
+                                                .d = (struct) {
+                                                 .x = (long long)5555555555555555,
+                                                 .e = (struct) {
+                                                  .x = (long long)6666666666666666,
+                                                  .f = (struct) {
+                                                   .x = (long long)7777777777777777,
+                                                   .g = (struct) {
+                                                    .x = (long long)8888888888888888,
+                                                   },
+                                                  },
+                                                 },
+                                                },
+                                               },
+                                              },
+                                             },
+                                            }
+{ptr} = *
+                                            (struct test_struct) {
+                                             .x = (long long)1111111111111111,
+                                             .a = (struct) {
+                                              .x = (long long)2222222222222222,
+                                              .b = (struct) {
+                                               .x = (long long)3333333333333333,
+                                               .c = (struct) {
+                                                .x = (long long)4444444444444444,
+                                                .d = (struct) {
+                                                 .x = (long long)5555555555555555,
+                                                 .e = (struct) {
+                                                  .x = (long long)6666666666666666,
+                                                  .f = (struct) {
+                                                   .x = (long long)7777777777777777,
+                                                   .g = (struct) {
+                                                    .x = (long long)8888888888888888,
+                                                   },
+                                                  },
+                                                 },
+                                                },
+                                               },
+                                              },
+                                             },
+                                            }
+{ptr} = *
+                                            (struct test_struct) {
+                                             .x = (long long)1111111111111111,
+                                             .a = (struct) {
+                                              .x = (long long)2222222222222222,
+                                              .b = (struct) {
+                                               .x = (long long)3333333333333333,
+                                               .c = (struct) {
+                                                .x = (long long)4444444444444444,
+                                                .d = (struct) {
+                                                 .x = (long long)5555555555555555,
+                                                 .e = (struct) {
+                                                  .x = (long long)6666666666666666,
+                                                  .f = (struct) {
+                                                   .x = (long long)7777777777777777,
+                                                   ...
+                                                  },
+                                                 },
+                                                },
+                                               },
+                                              },
+                                             },
+                                            }
+{ptr} = *
+                                            (struct test_struct) {
+                                             .x = (long long)1111111111111111,
+                                             .a = (struct) {
+                                              .x = (long long)2222222222222222,
+                                              .b = (struct) {
+                                               .x = (long long)3333333333333333,
+                                               .c = (struct) {
+                                                .x = (long long)4444444444444444,
+                                                .d = (struct) {
+                                                 .x = (long long)5555555555555555,
+                                                 .e = (struct) {
+                                                  .x = (long long)6666666666666666,
+                                                  ...
+                                                 },
+                                                },
+                                               },
+                                              },
+                                             },
+                                            }
+{ptr} = *
+                                            (struct test_struct) {
+                                             .x = (long long)1111111111111111,
+                                             .a = (struct) {
+                                              .x = (long long)2222222222222222,
+                                              .b = (struct) {
+                                               .x = (long long)3333333333333333,
+                                               .c = (struct) {
+                                                .x = (long long)4444444444444444,
+                                                .d = (struct) {
+                                                 .x = (long long)5555555555555555,
+                                                 ...
+                                                },
+                                               },
+                                              },
+                                             },
+                                            }
+{ptr} = *
+                                            (struct test_struct) {
+                                             .x = (long long)1111111111111111,
+                                             .a = (struct) {
+                                              .x = (long long)2222222222222222,
+                                              .b = (struct) {
+                                               .x = (long long)3333333333333333,
+                                               .c = (struct) {
+                                                .x = (long long)4444444444444444,
+                                                ...
+                                               },
+                                              },
+                                             },
+                                            }
+
-- 
2.18.4




More information about the DTrace-devel mailing list