2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 2005-2015 Dmitry V. Levin <ldv@altlinux.org>
7 * Copyright (c) 2014-2018 The strace developers.
10 * SPDX-License-Identifier: LGPL-2.1-or-later
15 #include DEF_MPERS_TYPE(kernel_dirent)
19 #define D_NAME_LEN_MAX 256
22 print_old_dirent(struct tcb *const tcp, const kernel_ulong_t addr)
26 if (umove_or_printaddr(tcp, addr, &d))
29 tprintf("{d_ino=%llu, d_off=%llu, d_reclen=%u, d_name=",
30 zero_extend_signed_to_ull(d.d_ino),
31 zero_extend_signed_to_ull(d.d_off), d.d_reclen);
32 if (d.d_reclen > D_NAME_LEN_MAX)
33 d.d_reclen = D_NAME_LEN_MAX;
34 printpathn(tcp, addr + offsetof(kernel_dirent, d_name), d.d_reclen);
41 printfd(tcp, tcp->u_arg[0]);
45 printaddr(tcp->u_arg[1]);
47 print_old_dirent(tcp, tcp->u_arg[1]);
48 /* Not much point in printing this out, it is always 1. */
49 if (tcp->u_arg[2] != 1)
50 tprintf(", %" PRI_klu, tcp->u_arg[2]);
57 unsigned int i, len, dents = 0;
61 printfd(tcp, tcp->u_arg[0]);
65 const unsigned int count = tcp->u_arg[2];
67 if (syserror(tcp) || !verbose(tcp)) {
69 printaddr(tcp->u_arg[1]);
70 tprintf(", %u", count);
74 /* Beware of insanely large or too small values in tcp->u_rval */
75 if (tcp->u_rval > 1024*1024)
77 else if (tcp->u_rval < (int) sizeof(kernel_dirent))
84 if (!buf || umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
86 printaddr(tcp->u_arg[1]);
87 tprintf(", %u", count);
98 for (i = 0; len && i <= len - sizeof(kernel_dirent); ) {
99 kernel_dirent *d = (kernel_dirent *) &buf[i];
102 int oob = d->d_reclen < sizeof(kernel_dirent) ||
103 i + d->d_reclen - 1 >= len;
104 int d_name_len = oob ? len - i : d->d_reclen;
105 d_name_len -= offsetof(kernel_dirent, d_name) + 1;
106 if (d_name_len > D_NAME_LEN_MAX)
107 d_name_len = D_NAME_LEN_MAX;
109 tprintf("%s{d_ino=%llu, d_off=%llu, d_reclen=%u"
110 ", d_name=", i ? ", " : "",
111 zero_extend_signed_to_ull(d->d_ino),
112 zero_extend_signed_to_ull(d->d_off),
115 print_quoted_cstring(d->d_name, d_name_len);
117 tprints(", d_type=");
121 printxval(dirent_types, buf[i + d->d_reclen - 1], "DT_???");
125 if (d->d_reclen < sizeof(kernel_dirent)) {
126 tprints_comment("d_reclen < sizeof(struct dirent)");
134 tprintf_comment("%u entries", dents);
135 tprintf(", %u", count);