1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Check decoding of netlink attribute.
3*cf84ac9aSAndroid Build Coastguard Worker *
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2017 JingPiao Chen <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2017-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker *
8*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker * are met:
11*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker *
19*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker */
30*cf84ac9aSAndroid Build Coastguard Worker
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker
33*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <stdint.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
37*cf84ac9aSAndroid Build Coastguard Worker #include <sys/socket.h>
38*cf84ac9aSAndroid Build Coastguard Worker #include <netinet/tcp.h>
39*cf84ac9aSAndroid Build Coastguard Worker #include "netlink.h"
40*cf84ac9aSAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
41*cf84ac9aSAndroid Build Coastguard Worker #include <linux/sock_diag.h>
42*cf84ac9aSAndroid Build Coastguard Worker #include <linux/unix_diag.h>
43*cf84ac9aSAndroid Build Coastguard Worker
44*cf84ac9aSAndroid Build Coastguard Worker static void
test_nlattr(const int fd)45*cf84ac9aSAndroid Build Coastguard Worker test_nlattr(const int fd)
46*cf84ac9aSAndroid Build Coastguard Worker {
47*cf84ac9aSAndroid Build Coastguard Worker static const struct msg {
48*cf84ac9aSAndroid Build Coastguard Worker struct nlmsghdr nlh;
49*cf84ac9aSAndroid Build Coastguard Worker struct unix_diag_msg udm;
50*cf84ac9aSAndroid Build Coastguard Worker } c_msg = {
51*cf84ac9aSAndroid Build Coastguard Worker .nlh = {
52*cf84ac9aSAndroid Build Coastguard Worker .nlmsg_len = sizeof(struct msg),
53*cf84ac9aSAndroid Build Coastguard Worker .nlmsg_type = SOCK_DIAG_BY_FAMILY,
54*cf84ac9aSAndroid Build Coastguard Worker .nlmsg_flags = NLM_F_DUMP
55*cf84ac9aSAndroid Build Coastguard Worker },
56*cf84ac9aSAndroid Build Coastguard Worker .udm = {
57*cf84ac9aSAndroid Build Coastguard Worker .udiag_family = AF_UNIX,
58*cf84ac9aSAndroid Build Coastguard Worker .udiag_type = SOCK_STREAM,
59*cf84ac9aSAndroid Build Coastguard Worker .udiag_state = TCP_FIN_WAIT1
60*cf84ac9aSAndroid Build Coastguard Worker }
61*cf84ac9aSAndroid Build Coastguard Worker };
62*cf84ac9aSAndroid Build Coastguard Worker struct msg *msg;
63*cf84ac9aSAndroid Build Coastguard Worker struct nlattr *nla;
64*cf84ac9aSAndroid Build Coastguard Worker unsigned int msg_len;
65*cf84ac9aSAndroid Build Coastguard Worker long rc;
66*cf84ac9aSAndroid Build Coastguard Worker
67*cf84ac9aSAndroid Build Coastguard Worker /* fetch fail: len < sizeof(struct nlattr) */
68*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + 2;
69*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len);
70*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
71*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
72*cf84ac9aSAndroid Build Coastguard Worker memcpy(nla, "12", 2);
73*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
74*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
75*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
76*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
77*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, \"\\x31\\x32\"}, %u"
78*cf84ac9aSAndroid Build Coastguard Worker ", MSG_DONTWAIT, NULL, 0) = %s\n",
79*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, msg_len, sprintrc(rc));
80*cf84ac9aSAndroid Build Coastguard Worker
81*cf84ac9aSAndroid Build Coastguard Worker /* fetch fail: short read */
82*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + sizeof(*nla);
83*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len - 1);
84*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
85*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
86*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
87*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
88*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
89*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, %p}, %u"
90*cf84ac9aSAndroid Build Coastguard Worker ", MSG_DONTWAIT, NULL, 0) = %s\n",
91*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, (void *) msg + NLMSG_SPACE(sizeof(msg->udm)),
92*cf84ac9aSAndroid Build Coastguard Worker msg_len, sprintrc(rc));
93*cf84ac9aSAndroid Build Coastguard Worker
94*cf84ac9aSAndroid Build Coastguard Worker /* print one struct nlattr */
95*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + sizeof(*nla);
96*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len);
97*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
98*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
99*cf84ac9aSAndroid Build Coastguard Worker *nla = (struct nlattr) {
100*cf84ac9aSAndroid Build Coastguard Worker .nla_len = sizeof(*nla),
101*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_NAME
102*cf84ac9aSAndroid Build Coastguard Worker };
103*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
104*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
105*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
106*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
107*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
108*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_NAME}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
109*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, msg_len, sprintrc(rc));
110*cf84ac9aSAndroid Build Coastguard Worker
111*cf84ac9aSAndroid Build Coastguard Worker /* print one struct nlattr with nla_len out of msg_len bounds */
112*cf84ac9aSAndroid Build Coastguard Worker nla->nla_len += 8;
113*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
114*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
115*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
116*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
117*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
118*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_NAME}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
119*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, msg_len, sprintrc(rc));
120*cf84ac9aSAndroid Build Coastguard Worker
121*cf84ac9aSAndroid Build Coastguard Worker /* print one struct nlattr and some data */
122*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + NLA_HDRLEN + 4;
123*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len);
124*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
125*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
126*cf84ac9aSAndroid Build Coastguard Worker *nla = (struct nlattr) {
127*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN + 4,
128*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_SHUTDOWN + 1
129*cf84ac9aSAndroid Build Coastguard Worker };
130*cf84ac9aSAndroid Build Coastguard Worker memcpy(RTA_DATA(nla), "1234", 4);
131*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
132*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
133*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
134*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
135*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {{nla_len=%u"
136*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=%#x /* UNIX_DIAG_??? */}"
137*cf84ac9aSAndroid Build Coastguard Worker ", \"\\x31\\x32\\x33\\x34\"}}"
138*cf84ac9aSAndroid Build Coastguard Worker ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
139*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, UNIX_DIAG_SHUTDOWN + 1,
140*cf84ac9aSAndroid Build Coastguard Worker msg_len, sprintrc(rc));
141*cf84ac9aSAndroid Build Coastguard Worker
142*cf84ac9aSAndroid Build Coastguard Worker /* print one struct nlattr and fetch fail second struct nlattr */
143*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + NLA_HDRLEN + 2;
144*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len);
145*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
146*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
147*cf84ac9aSAndroid Build Coastguard Worker SET_STRUCT(struct nlattr, nla,
148*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN,
149*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_NAME
150*cf84ac9aSAndroid Build Coastguard Worker );
151*cf84ac9aSAndroid Build Coastguard Worker memcpy(nla + 1, "12", 2);
152*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
153*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
154*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
155*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
156*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, [{nla_len=%u"
157*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_NAME}, \"\\x31\\x32\"]}, %u"
158*cf84ac9aSAndroid Build Coastguard Worker ", MSG_DONTWAIT, NULL, 0) = %s\n",
159*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, NLA_HDRLEN, msg_len, sprintrc(rc));
160*cf84ac9aSAndroid Build Coastguard Worker
161*cf84ac9aSAndroid Build Coastguard Worker /* print one struct nlattr and short read of second struct nlattr */
162*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + NLA_HDRLEN * 2;
163*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len - 1);
164*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
165*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
166*cf84ac9aSAndroid Build Coastguard Worker SET_STRUCT(struct nlattr, nla,
167*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN,
168*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_NAME
169*cf84ac9aSAndroid Build Coastguard Worker );
170*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
171*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
172*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
173*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
174*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, [{nla_len=%u"
175*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_NAME}, ... /* %p */]}, %u"
176*cf84ac9aSAndroid Build Coastguard Worker ", MSG_DONTWAIT, NULL, 0) = %s\n",
177*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, NLA_HDRLEN, nla + 1, msg_len, sprintrc(rc));
178*cf84ac9aSAndroid Build Coastguard Worker
179*cf84ac9aSAndroid Build Coastguard Worker /* print two struct nlattr */
180*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + NLA_HDRLEN * 2;
181*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len);
182*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
183*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
184*cf84ac9aSAndroid Build Coastguard Worker *nla = (struct nlattr) {
185*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN,
186*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_NAME
187*cf84ac9aSAndroid Build Coastguard Worker };
188*cf84ac9aSAndroid Build Coastguard Worker *(nla + 1) = (struct nlattr) {
189*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN,
190*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_PEER
191*cf84ac9aSAndroid Build Coastguard Worker };
192*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
193*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
194*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
195*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
196*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, [{nla_len=%u"
197*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_NAME}, {nla_len=%u"
198*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_PEER}]}, %u"
199*cf84ac9aSAndroid Build Coastguard Worker ", MSG_DONTWAIT, NULL, 0) = %s\n",
200*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, nla->nla_len,
201*cf84ac9aSAndroid Build Coastguard Worker msg_len, sprintrc(rc));
202*cf84ac9aSAndroid Build Coastguard Worker
203*cf84ac9aSAndroid Build Coastguard Worker /* print first nlattr only when its nla_len is less than NLA_HDRLEN */
204*cf84ac9aSAndroid Build Coastguard Worker nla->nla_len = NLA_HDRLEN - 1;
205*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
206*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
207*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
208*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
209*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
210*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=UNIX_DIAG_NAME}}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
211*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, msg_len, sprintrc(rc));
212*cf84ac9aSAndroid Build Coastguard Worker
213*cf84ac9aSAndroid Build Coastguard Worker /* unrecognized attribute data, abbreviated output */
214*cf84ac9aSAndroid Build Coastguard Worker #define ABBREV_LEN (DEFAULT_STRLEN + 1)
215*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + NLA_HDRLEN * ABBREV_LEN * 2;
216*cf84ac9aSAndroid Build Coastguard Worker msg = tail_alloc(msg_len);
217*cf84ac9aSAndroid Build Coastguard Worker memcpy(msg, &c_msg, sizeof(c_msg));
218*cf84ac9aSAndroid Build Coastguard Worker msg->nlh.nlmsg_len = msg_len;
219*cf84ac9aSAndroid Build Coastguard Worker unsigned int i;
220*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
221*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < ABBREV_LEN; ++i) {
222*cf84ac9aSAndroid Build Coastguard Worker nla[i * 2] = (struct nlattr) {
223*cf84ac9aSAndroid Build Coastguard Worker .nla_len = NLA_HDRLEN * 2 - 1,
224*cf84ac9aSAndroid Build Coastguard Worker .nla_type = UNIX_DIAG_SHUTDOWN + 1 + i
225*cf84ac9aSAndroid Build Coastguard Worker };
226*cf84ac9aSAndroid Build Coastguard Worker fill_memory_ex(&nla[i * 2 + 1], NLA_HDRLEN,
227*cf84ac9aSAndroid Build Coastguard Worker '0' + i, '~' - '0' - i);
228*cf84ac9aSAndroid Build Coastguard Worker }
229*cf84ac9aSAndroid Build Coastguard Worker
230*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
231*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
232*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}"
233*cf84ac9aSAndroid Build Coastguard Worker ", {udiag_family=AF_UNIX, udiag_type=SOCK_STREAM"
234*cf84ac9aSAndroid Build Coastguard Worker ", udiag_state=TCP_FIN_WAIT1, udiag_ino=0"
235*cf84ac9aSAndroid Build Coastguard Worker ", udiag_cookie=[0, 0]}, [",
236*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len);
237*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < DEFAULT_STRLEN; ++i) {
238*cf84ac9aSAndroid Build Coastguard Worker if (i)
239*cf84ac9aSAndroid Build Coastguard Worker printf(", ");
240*cf84ac9aSAndroid Build Coastguard Worker printf("{{nla_len=%u, nla_type=%#x /* UNIX_DIAG_??? */}, ",
241*cf84ac9aSAndroid Build Coastguard Worker nla->nla_len, UNIX_DIAG_SHUTDOWN + 1 + i);
242*cf84ac9aSAndroid Build Coastguard Worker print_quoted_hex(&nla[i * 2 + 1], NLA_HDRLEN - 1);
243*cf84ac9aSAndroid Build Coastguard Worker printf("}");
244*cf84ac9aSAndroid Build Coastguard Worker }
245*cf84ac9aSAndroid Build Coastguard Worker printf(", ...]}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
246*cf84ac9aSAndroid Build Coastguard Worker msg_len, sprintrc(rc));
247*cf84ac9aSAndroid Build Coastguard Worker }
248*cf84ac9aSAndroid Build Coastguard Worker
249*cf84ac9aSAndroid Build Coastguard Worker static void
test_nla_type(const int fd)250*cf84ac9aSAndroid Build Coastguard Worker test_nla_type(const int fd)
251*cf84ac9aSAndroid Build Coastguard Worker {
252*cf84ac9aSAndroid Build Coastguard Worker static const struct msg {
253*cf84ac9aSAndroid Build Coastguard Worker struct nlmsghdr nlh;
254*cf84ac9aSAndroid Build Coastguard Worker struct unix_diag_msg udm;
255*cf84ac9aSAndroid Build Coastguard Worker } c_msg = {
256*cf84ac9aSAndroid Build Coastguard Worker .nlh = {
257*cf84ac9aSAndroid Build Coastguard Worker .nlmsg_len = sizeof(struct msg),
258*cf84ac9aSAndroid Build Coastguard Worker .nlmsg_type = SOCK_DIAG_BY_FAMILY,
259*cf84ac9aSAndroid Build Coastguard Worker .nlmsg_flags = NLM_F_DUMP
260*cf84ac9aSAndroid Build Coastguard Worker },
261*cf84ac9aSAndroid Build Coastguard Worker .udm = {
262*cf84ac9aSAndroid Build Coastguard Worker .udiag_family = AF_UNIX,
263*cf84ac9aSAndroid Build Coastguard Worker .udiag_type = SOCK_STREAM,
264*cf84ac9aSAndroid Build Coastguard Worker .udiag_state = TCP_FIN_WAIT1
265*cf84ac9aSAndroid Build Coastguard Worker }
266*cf84ac9aSAndroid Build Coastguard Worker };
267*cf84ac9aSAndroid Build Coastguard Worker struct msg *msg;
268*cf84ac9aSAndroid Build Coastguard Worker struct nlattr *nla;
269*cf84ac9aSAndroid Build Coastguard Worker unsigned int msg_len;
270*cf84ac9aSAndroid Build Coastguard Worker long rc;
271*cf84ac9aSAndroid Build Coastguard Worker
272*cf84ac9aSAndroid Build Coastguard Worker msg_len = NLMSG_SPACE(sizeof(msg->udm)) + sizeof(*nla);
273*cf84ac9aSAndroid Build Coastguard Worker msg = tail_memdup(&c_msg, msg_len);
274*cf84ac9aSAndroid Build Coastguard Worker memcpy(&msg->nlh.nlmsg_len, &msg_len, sizeof(msg_len));
275*cf84ac9aSAndroid Build Coastguard Worker nla = NLMSG_ATTR(msg, sizeof(msg->udm));
276*cf84ac9aSAndroid Build Coastguard Worker *nla = (struct nlattr) {
277*cf84ac9aSAndroid Build Coastguard Worker .nla_len = sizeof(*nla),
278*cf84ac9aSAndroid Build Coastguard Worker .nla_type = NLA_F_NESTED | UNIX_DIAG_NAME
279*cf84ac9aSAndroid Build Coastguard Worker };
280*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
281*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
282*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
283*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
284*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
285*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=NLA_F_NESTED|UNIX_DIAG_NAME}}"
286*cf84ac9aSAndroid Build Coastguard Worker ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
287*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, msg_len, sprintrc(rc));
288*cf84ac9aSAndroid Build Coastguard Worker
289*cf84ac9aSAndroid Build Coastguard Worker nla->nla_type = NLA_F_NET_BYTEORDER | UNIX_DIAG_NAME;
290*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
291*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
292*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
293*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
294*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
295*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=NLA_F_NET_BYTEORDER|UNIX_DIAG_NAME}}"
296*cf84ac9aSAndroid Build Coastguard Worker ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
297*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, msg_len, sprintrc(rc));
298*cf84ac9aSAndroid Build Coastguard Worker
299*cf84ac9aSAndroid Build Coastguard Worker nla->nla_type = NLA_F_NESTED | NLA_F_NET_BYTEORDER | UNIX_DIAG_NAME;
300*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg_len, MSG_DONTWAIT, NULL, 0);
301*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
302*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
303*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
304*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
305*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=NLA_F_NESTED|NLA_F_NET_BYTEORDER|UNIX_DIAG_NAME}}"
306*cf84ac9aSAndroid Build Coastguard Worker ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
307*cf84ac9aSAndroid Build Coastguard Worker fd, msg_len, nla->nla_len, msg_len, sprintrc(rc));
308*cf84ac9aSAndroid Build Coastguard Worker
309*cf84ac9aSAndroid Build Coastguard Worker nla->nla_type = NLA_F_NESTED | (UNIX_DIAG_SHUTDOWN + 1);
310*cf84ac9aSAndroid Build Coastguard Worker rc = sendto(fd, msg, msg->nlh.nlmsg_len, MSG_DONTWAIT, NULL, 0);
311*cf84ac9aSAndroid Build Coastguard Worker printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"
312*cf84ac9aSAndroid Build Coastguard Worker ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX"
313*cf84ac9aSAndroid Build Coastguard Worker ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1"
314*cf84ac9aSAndroid Build Coastguard Worker ", udiag_ino=0, udiag_cookie=[0, 0]}, {nla_len=%u"
315*cf84ac9aSAndroid Build Coastguard Worker ", nla_type=NLA_F_NESTED|%#x /* UNIX_DIAG_??? */}}"
316*cf84ac9aSAndroid Build Coastguard Worker ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
317*cf84ac9aSAndroid Build Coastguard Worker fd, msg->nlh.nlmsg_len, nla->nla_len, UNIX_DIAG_SHUTDOWN + 1,
318*cf84ac9aSAndroid Build Coastguard Worker msg->nlh.nlmsg_len, sprintrc(rc));
319*cf84ac9aSAndroid Build Coastguard Worker }
320*cf84ac9aSAndroid Build Coastguard Worker
main(void)321*cf84ac9aSAndroid Build Coastguard Worker int main(void)
322*cf84ac9aSAndroid Build Coastguard Worker {
323*cf84ac9aSAndroid Build Coastguard Worker skip_if_unavailable("/proc/self/fd/");
324*cf84ac9aSAndroid Build Coastguard Worker
325*cf84ac9aSAndroid Build Coastguard Worker const int fd = create_nl_socket(NETLINK_SOCK_DIAG);
326*cf84ac9aSAndroid Build Coastguard Worker
327*cf84ac9aSAndroid Build Coastguard Worker test_nlattr(fd);
328*cf84ac9aSAndroid Build Coastguard Worker test_nla_type(fd);
329*cf84ac9aSAndroid Build Coastguard Worker
330*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
331*cf84ac9aSAndroid Build Coastguard Worker
332*cf84ac9aSAndroid Build Coastguard Worker return 0;
333*cf84ac9aSAndroid Build Coastguard Worker }
334