Pullup ticket #6282 - requested by oster mail/opendmarc: bugfix Revisions pulled up: - mail/opendmarc/Makefile 1.19 - mail/opendmarc/distinfo 1.7 - mail/opendmarc/patches/patch-build-config.h.in 1.1 - mail/opendmarc/patches/patch-configure 1.2 - mail/opendmarc/patches/patch-configure.ac 1.2 - mail/opendmarc/patches/patch-libopendmarc_opendmarc__dns.c 1.1 - mail/opendmarc/patches/patch-libopendmarc_opendmarc__spf__dns.c 1.1 --- Module Name: pkgsrc Committed By: oster Date: Mon Jul 27 20:41:10 UTC 2020 Modified Files: pkgsrc/mail/opendmarc: distinfo pkgsrc/mail/opendmarc/patches: patch-configure patch-configure.ac Added Files: pkgsrc/mail/opendmarc/patches: patch-build-config.h.in patch-libopendmarc_opendmarc__dns.c patch-libopendmarc_opendmarc__spf__dns.c Log Message: Fix resource leakage observed when using opendmarc on NetBSD. Use res_ndestroy() instead of res_nclose() to properly cleanup resources on NetBSD (and others that use __res_ndestroy() or res_ndestroy() instead of res_nclose()). Original patch by Roy Marples. --- Module Name: pkgsrc Committed By: oster Date: Mon Jul 27 22:28:47 UTC 2020 Modified Files: pkgsrc/mail/opendmarc: Makefile Log Message: Bump pkgrevision. Thanks, Joerg.diff -r1.18 -r1.18.4.1 pkgsrc/mail/opendmarc/Makefile
(bsiegert)
@@ -1,17 +1,17 @@ | @@ -1,17 +1,17 @@ | |||
1 | # $NetBSD: Makefile,v 1.18 2020/01/25 10:45:11 jperkin Exp $ | 1 | # $NetBSD: Makefile,v 1.18.4.1 2020/07/30 18:48:38 bsiegert Exp $ | |
2 | 2 | |||
3 | DISTNAME= opendmarc-1.3.1 | 3 | DISTNAME= opendmarc-1.3.1 | |
4 | PKGREVISION= 6 | 4 | PKGREVISION= 7 | |
5 | CATEGORIES= mail | 5 | CATEGORIES= mail | |
6 | MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=opendmarc/} | 6 | MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=opendmarc/} | |
7 | 7 | |||
8 | MAINTAINER= pettai@NetBSD.org | 8 | MAINTAINER= pettai@NetBSD.org | |
9 | HOMEPAGE= http://www.trusteddomain.org/opendmarc/ | 9 | HOMEPAGE= http://www.trusteddomain.org/opendmarc/ | |
10 | COMMENT= Open source DMARC library, MTA filter implementation and tools | 10 | COMMENT= Open source DMARC library, MTA filter implementation and tools | |
11 | LICENSE= modified-bsd | 11 | LICENSE= modified-bsd | |
12 | 12 | |||
13 | DEPENDS+= p5-DBI-[0-9]*:../../databases/p5-DBI | 13 | DEPENDS+= p5-DBI-[0-9]*:../../databases/p5-DBI | |
14 | DEPENDS+= p5-DBD-mysql-[0-9]*:../../databases/p5-DBD-mysql | 14 | DEPENDS+= p5-DBD-mysql-[0-9]*:../../databases/p5-DBD-mysql | |
15 | #DEPENDS+= {perl>=5.6.1,p5-File-Temp-[0-9]*}:../../devel/p5-File-Temp | 15 | #DEPENDS+= {perl>=5.6.1,p5-File-Temp-[0-9]*}:../../devel/p5-File-Temp | |
16 | DEPENDS+= p5-Switch-[0-9]*:../../lang/p5-Switch | 16 | DEPENDS+= p5-Switch-[0-9]*:../../lang/p5-Switch | |
17 | 17 |
@@ -1,8 +1,11 @@ | @@ -1,8 +1,11 @@ | |||
1 | $NetBSD: distinfo,v 1.6 2015/11/03 23:27:11 agc Exp $ | 1 | $NetBSD: distinfo,v 1.6.36.1 2020/07/30 18:48:38 bsiegert Exp $ | |
2 | 2 | |||
3 | SHA1 (opendmarc-1.3.1.tar.gz) = bdd12713888c16e77334281238f88990df225929 | 3 | SHA1 (opendmarc-1.3.1.tar.gz) = bdd12713888c16e77334281238f88990df225929 | |
4 | RMD160 (opendmarc-1.3.1.tar.gz) = 623b51544f428ade14f0a5d6204f8bf41af8375a | 4 | RMD160 (opendmarc-1.3.1.tar.gz) = 623b51544f428ade14f0a5d6204f8bf41af8375a | |
5 | SHA512 (opendmarc-1.3.1.tar.gz) = 0be11540bc26bd3b3e6cc9817bc379a5d290b63ef16c5d3559bf96b241ad6628bea7a9daeb468afac855bc16be16676f722b3c1d468ea82c8d8364e8a8137226 | 5 | SHA512 (opendmarc-1.3.1.tar.gz) = 0be11540bc26bd3b3e6cc9817bc379a5d290b63ef16c5d3559bf96b241ad6628bea7a9daeb468afac855bc16be16676f722b3c1d468ea82c8d8364e8a8137226 | |
6 | Size (opendmarc-1.3.1.tar.gz) = 640151 bytes | 6 | Size (opendmarc-1.3.1.tar.gz) = 640151 bytes | |
7 | SHA1 (patch-configure) = 15abea1f890249c46eb0b969133fc809507feb6a | 7 | SHA1 (patch-build-config.h.in) = 14723ab0a578978117be7dcc1d60fe5af955b610 | |
8 | SHA1 (patch-configure.ac) = b7ee9ae49e04fceaf2872dac7e2f60a15d3c9aa0 | 8 | SHA1 (patch-configure) = 1af3b346ac6db51d1701af8ba4e123e0e6a6b973 | |
9 | SHA1 (patch-configure.ac) = bfd2c16d22e25b564d33220b5e7ceadedc5ee016 | |||
10 | SHA1 (patch-libopendmarc_opendmarc__dns.c) = 7c75d464bcdba6baf963cb002e7ba94a60593ecc | |||
11 | SHA1 (patch-libopendmarc_opendmarc__spf__dns.c) = 82f22fd2e224ddef1cd3c6788518e629fdea125f |
$NetBSD: patch-build-config.h.in,v 1.1.2.2 2020/07/30 18:48:39 bsiegert Exp $
We need to use res_ndestroy() to cleanup after res_init().
--- build-config.h.in.orig 2015-02-23 20:32:27.000000000 +0000
+++ build-config.h.in
@@ -104,6 +104,9 @@
/* Define to 1 if you have the `res_ninit()' function. */
#undef HAVE_RES_NINIT
+/* Define to 1 if you have the 'res_ndestroy()' function. */
+#undef HAVE_RES_NDESTROY
+
/* Define to 1 if you have the <signal.h> header file. */
#undef HAVE_SIGNAL_H
$NetBSD: patch-libopendmarc_opendmarc__dns.c,v 1.1.2.2 2020/07/30 18:48:39 bsiegert Exp $
Patch from Roy Marples: if we have res_ndestroy(), use that in place of just res_nclose().
--- libopendmarc/opendmarc_dns.c.orig 2015-02-23 20:31:51.000000000 +0000
+++ libopendmarc/opendmarc_dns.c
@@ -211,7 +211,11 @@ dmarc_dns_get_record(char *domain, int *
(void) opendmarc_policy_library_dns_hook(&resp.nscount,
&resp.nsaddr_list);
answer_len = res_nquery(&resp, bp, C_IN, T_TXT, answer_buf, sizeof answer_buf);
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#else /* HAVE_RES_NINIT */
#if defined RES_USE_DNSSEC
_res.options |= RES_USE_DNSSEC;
$NetBSD: patch-libopendmarc_opendmarc__spf__dns.c,v 1.1.2.2 2020/07/30 18:48:39 bsiegert Exp $
Patch from Roy Marples: if we have res_ndestroy(), use that in place of just res_nclose().
--- libopendmarc/opendmarc_spf_dns.c.orig 2015-02-23 20:31:51.000000000 +0000
+++ libopendmarc/opendmarc_spf_dns.c
@@ -108,7 +108,11 @@ opendmarc_spf_dns_lookup_a_actual(char *
#ifdef HAVE_RES_NINIT
k = res_nquery(&resp, bp, C_IN, sought, a_buf, sizeof a_buf);
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#else /* HAVE_RES_NINIT */
k = res_query(bp, C_IN, sought, a_buf, sizeof a_buf);
#endif /* HAVE_RES_NINIT */
@@ -253,7 +257,11 @@ opendmarc_spf_dns_lookup_mx(char *domain
memset(&resp, '\0', sizeof resp);
res_ninit(&resp);
k = res_nquery(&resp, domain, C_IN, T_MX, (u_char *) &q, sizeof(q));
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#else /* HAVE_RES_NINIT */
k = res_query(domain, C_IN, T_MX, (u_char *) &q, sizeof(q));
#endif /* HAVE_RES_NINIT */
@@ -366,7 +374,11 @@ opendmarc_spf_dns_lookup_ptr(char *ip, c
memset(&resp, '\0', sizeof resp);
res_ninit(&resp);
k = res_nquery(&resp, (char *)buf, C_IN, T_PTR, (u_char *) &q, sizeof(q));
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#else /* HAVE_RES_NINIT */
k = res_query((char *)buf, C_IN, T_PTR, (u_char *) &q, sizeof(q));
#endif /* HAVE_RES_NINIT */
@@ -461,7 +473,11 @@ opendmarc_spf_dns_does_domain_exist(char
(void) res_nquery(&resp, domain, C_IN, T_AAAA, aaaa_q, sizeof aaaa_q);
#endif /* T_AAAA */
(void) res_nquery(&resp, domain, C_IN, T_MX, mx_q, sizeof mx_q);
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#else /* HAVE_RES_NINIT */
(void) res_query(domain, C_IN, T_A, a_q, sizeof a_q);
#ifdef T_AAAA
@@ -603,13 +619,21 @@ opendmarc_spf_dns_get_record(char *domai
}
*rp = h_errno;
#ifdef HAVE_RES_NINIT
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#endif /* HAVE_RES_NINIT */
return NULL;
}
got_spf_record:
#ifdef HAVE_RES_NINIT
+#ifdef HAVE_RES_NDESTROY
+ res_ndestroy(&resp);
+#else
res_nclose(&resp);
+#endif
#endif /* HAVE_RES_NINIT */
if (k > (int)(sizeof txt_buf))
@@ -1,22 +1,83 @@ | @@ -1,22 +1,83 @@ | |||
1 | $NetBSD: patch-configure,v 1.1 2014/12/05 16:00:23 christos Exp $ | 1 | $NetBSD: patch-configure,v 1.1.44.1 2020/07/30 18:48:39 bsiegert Exp $ | |
2 | Search also for __res_ninit on NetBSD because of namespace protection | |||
3 | 2 | |||
4 | --- configure.orig 2014-12-05 10:53:31.000000000 -0500 | 3 | Check for res_ndestroy(), __res_init(), and __res_ndestroy(). | |
5 | +++ configure 2014-12-05 10:54:50.000000000 -0500 | 4 | ||
6 | @@ -12969,6 +12969,64 @@ | 5 | --- configure.orig 2015-02-23 20:32:13.000000000 +0000 | |
6 | +++ configure | |||
7 | @@ -12971,6 +12971,184 @@ $as_echo "#define HAVE_RES_NINIT 1" >>co | |||
7 | 8 | |||
8 | fi | 9 | fi | |
9 | 10 | |||
11 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing res_ndestroy" >&5 | |||
12 | +$as_echo_n "checking for library containing res_ndestroy... " >&6; } | |||
13 | +if ${ac_cv_search_res_ndestroy+:} false; then : | |||
14 | + $as_echo_n "(cached) " >&6 | |||
15 | +else | |||
16 | + ac_func_search_save_LIBS=$LIBS | |||
17 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |||
18 | +/* end confdefs.h. */ | |||
19 | + | |||
20 | +/* Override any GCC internal prototype to avoid an error. | |||
21 | + Use char because int might match the return type of a GCC | |||
22 | + builtin and then its argument prototype would still apply. */ | |||
23 | +#ifdef __cplusplus | |||
24 | +extern "C" | |||
25 | +#endif | |||
26 | +char res_ndestroy (); | |||
27 | +int | |||
28 | +main () | |||
29 | +{ | |||
30 | +return res_ndestroy (); | |||
31 | + ; | |||
32 | + return 0; | |||
33 | +} | |||
34 | +_ACEOF | |||
35 | +for ac_lib in '' resolv; do | |||
36 | + if test -z "$ac_lib"; then | |||
37 | + ac_res="none required" | |||
38 | + else | |||
39 | + ac_res=-l$ac_lib | |||
40 | + LIBS="-l$ac_lib $ac_func_search_save_LIBS" | |||
41 | + fi | |||
42 | + if ac_fn_c_try_link "$LINENO"; then : | |||
43 | + ac_cv_search_res_ndestroy=$ac_res | |||
44 | +fi | |||
45 | +rm -f core conftest.err conftest.$ac_objext \ | |||
46 | + conftest$ac_exeext | |||
47 | + if ${ac_cv_search_res_ndestroy+:} false; then : | |||
48 | + break | |||
49 | +fi | |||
50 | +done | |||
51 | +if ${ac_cv_search_res_ndestroy+:} false; then : | |||
52 | + | |||
53 | +else | |||
54 | + ac_cv_search_res_ndestroy=no | |||
55 | +fi | |||
56 | +rm conftest.$ac_ext | |||
57 | +LIBS=$ac_func_search_save_LIBS | |||
58 | +fi | |||
59 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_ndestroy" >&5 | |||
60 | +$as_echo "$ac_cv_search_res_ndestroy" >&6; } | |||
61 | +ac_res=$ac_cv_search_res_ndestroy | |||
62 | +if test "$ac_res" != no; then : | |||
63 | + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" | |||
64 | + | |||
65 | +$as_echo "#define HAVE_RES_NDESTROY 1" >>confdefs.h | |||
66 | + | |||
67 | +fi | |||
68 | + | |||
69 | + | |||
70 | + | |||
10 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing __res_ninit" >&5 | 71 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing __res_ninit" >&5 | |
11 | +$as_echo_n "checking for library containing __res_ninit... " >&6; } | 72 | +$as_echo_n "checking for library containing __res_ninit... " >&6; } | |
12 | +if ${ac_cv_search___res_ninit+:} false; then : | 73 | +if ${ac_cv_search___res_ninit+:} false; then : | |
13 | + $as_echo_n "(cached) " >&6 | 74 | + $as_echo_n "(cached) " >&6 | |
14 | +else | 75 | +else | |
15 | + ac_func_search_save_LIBS=$LIBS | 76 | + ac_func_search_save_LIBS=$LIBS | |
16 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | 77 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
17 | +/* end confdefs.h. */ | 78 | +/* end confdefs.h. */ | |
18 | + | 79 | + | |
19 | +/* Override any GCC internal prototype to avoid an error. | 80 | +/* Override any GCC internal prototype to avoid an error. | |
20 | + Use char because int might match the return type of a GCC | 81 | + Use char because int might match the return type of a GCC | |
21 | + builtin and then its argument prototype would still apply. */ | 82 | + builtin and then its argument prototype would still apply. */ | |
22 | +#ifdef __cplusplus | 83 | +#ifdef __cplusplus | |
@@ -55,16 +116,76 @@ Search also for __res_ninit on NetBSD be | @@ -55,16 +116,76 @@ Search also for __res_ninit on NetBSD be | |||
55 | +rm conftest.$ac_ext | 116 | +rm conftest.$ac_ext | |
56 | +LIBS=$ac_func_search_save_LIBS | 117 | +LIBS=$ac_func_search_save_LIBS | |
57 | +fi | 118 | +fi | |
58 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search___res_ninit" >&5 | 119 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search___res_ninit" >&5 | |
59 | +$as_echo "$ac_cv_search___res_ninit" >&6; } | 120 | +$as_echo "$ac_cv_search___res_ninit" >&6; } | |
60 | +ac_res=$ac_cv_search___res_ninit | 121 | +ac_res=$ac_cv_search___res_ninit | |
61 | +if test "$ac_res" != no; then : | 122 | +if test "$ac_res" != no; then : | |
62 | + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" | 123 | + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" | |
63 | + | 124 | + | |
64 | +$as_echo "#define HAVE_RES_NINIT 1" >>confdefs.h | 125 | +$as_echo "#define HAVE_RES_NINIT 1" >>confdefs.h | |
65 | + | 126 | + | |
66 | +fi | 127 | +fi | |
67 | + | 128 | + | |
129 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing __res_ndestroy" >&5 | |||
130 | +$as_echo_n "checking for library containing __res_ndestroy... " >&6; } | |||
131 | +if ${ac_cv_search___res_ndestroy+:} false; then : | |||
132 | + $as_echo_n "(cached) " >&6 | |||
133 | +else | |||
134 | + ac_func_search_save_LIBS=$LIBS | |||
135 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |||
136 | +/* end confdefs.h. */ | |||
137 | + | |||
138 | +/* Override any GCC internal prototype to avoid an error. | |||
139 | + Use char because int might match the return type of a GCC | |||
140 | + builtin and then its argument prototype would still apply. */ | |||
141 | +#ifdef __cplusplus | |||
142 | +extern "C" | |||
143 | +#endif | |||
144 | +char __res_ndestroy (); | |||
145 | +int | |||
146 | +main () | |||
147 | +{ | |||
148 | +return __res_ndestroy (); | |||
149 | + ; | |||
150 | + return 0; | |||
151 | +} | |||
152 | +_ACEOF | |||
153 | +for ac_lib in '' resolv; do | |||
154 | + if test -z "$ac_lib"; then | |||
155 | + ac_res="none required" | |||
156 | + else | |||
157 | + ac_res=-l$ac_lib | |||
158 | + LIBS="-l$ac_lib $ac_func_search_save_LIBS" | |||
159 | + fi | |||
160 | + if ac_fn_c_try_link "$LINENO"; then : | |||
161 | + ac_cv_search___res_ndestroy=$ac_res | |||
162 | +fi | |||
163 | +rm -f core conftest.err conftest.$ac_objext \ | |||
164 | + conftest$ac_exeext | |||
165 | + if ${ac_cv_search___res_ndestroy+:} false; then : | |||
166 | + break | |||
167 | +fi | |||
168 | +done | |||
169 | +if ${ac_cv_search___res_ndestroy+:} false; then : | |||
170 | + | |||
171 | +else | |||
172 | + ac_cv_search___res_ndestroy=no | |||
173 | +fi | |||
174 | +rm conftest.$ac_ext | |||
175 | +LIBS=$ac_func_search_save_LIBS | |||
176 | +fi | |||
177 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search___res_ndestroy" >&5 | |||
178 | +$as_echo "$ac_cv_search___res_ndestroy" >&6; } | |||
179 | +ac_res=$ac_cv_search___res_ndestroy | |||
180 | +if test "$ac_res" != no; then : | |||
181 | + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" | |||
182 | + | |||
183 | +$as_echo "#define HAVE_RES_NDESTROY 1" >>confdefs.h | |||
184 | + | |||
185 | +fi | |||
186 | + | |||
187 | + | |||
188 | + | |||
68 | { $as_echo "$as_me:${as_lineno-$LINENO}: checking for idn_free in -lidn" >&5 | 189 | { $as_echo "$as_me:${as_lineno-$LINENO}: checking for idn_free in -lidn" >&5 | |
69 | $as_echo_n "checking for idn_free in -lidn... " >&6; } | 190 | $as_echo_n "checking for idn_free in -lidn... " >&6; } | |
70 | if ${ac_cv_lib_idn_idn_free+:} false; then : | 191 | if ${ac_cv_lib_idn_idn_free+:} false; then : |
@@ -1,15 +1,24 @@ | @@ -1,15 +1,24 @@ | |||
1 | $NetBSD: patch-configure.ac,v 1.1 2014/12/05 16:00:23 christos Exp $ | 1 | $NetBSD: patch-configure.ac,v 1.1.44.1 2020/07/30 18:48:39 bsiegert Exp $ | |
2 | Search also for __res_ninit on NetBSD because of namespace protection | |||
3 | 2 | |||
4 | --- configure.ac.orig 2014-12-05 10:53:36.000000000 -0500 | 3 | Add appropriate flags if res_ndestroy(), __res_ninit(), or | |
5 | +++ configure.ac 2014-12-05 10:53:51.000000000 -0500 | 4 | __res_ndestroy() are found. | |
6 | @@ -126,6 +126,9 @@ | 5 | ||
6 | --- configure.ac.orig 2015-02-23 20:31:50.000000000 +0000 | |||
7 | +++ configure.ac | |||
8 | @@ -126,6 +126,16 @@ AC_CHECK_LIB(resolv, inet_aton, , , [-ln | |||
7 | AC_SEARCH_LIBS(res_ninit, resolv, | 9 | AC_SEARCH_LIBS(res_ninit, resolv, | |
8 | AC_DEFINE(HAVE_RES_NINIT, 1, | 10 | AC_DEFINE(HAVE_RES_NINIT, 1, | |
9 | [Define to 1 if you have the `res_ninit()' function.])) | 11 | [Define to 1 if you have the `res_ninit()' function.])) | |
12 | +AC_SEARCH_LIBS(res_ndestroy, resolv, | |||
13 | + AC_DEFINE(HAVE_RES_NDESTROY, 1, | |||
14 | + [Define to 1 if you have the `res_ndestroy()' function.])) | |||
10 | +AC_SEARCH_LIBS(__res_ninit, resolv, | 15 | +AC_SEARCH_LIBS(__res_ninit, resolv, | |
11 | + AC_DEFINE(HAVE_RES_NINIT, 1, | 16 | + AC_DEFINE(HAVE_RES_NINIT, 1, | |
12 | + [Define to 1 if you have the `res_ninit()' function.])) | 17 | + [Define to 1 if you have the `__res_ninit()' function.])) | |
18 | +AC_SEARCH_LIBS(__res_ndestroy, resolv, | |||
19 | + AC_DEFINE(HAVE_RES_NDESTROY, 1, | |||
20 | + [Define to 1 if you have the `__res_ndestroy()' function.])) | |||
21 | + | |||
13 | AC_CHECK_LIB(idn, idn_free) | 22 | AC_CHECK_LIB(idn, idn_free) | |
14 | AC_CHECK_LIB(rt, nanosleep) | 23 | AC_CHECK_LIB(rt, nanosleep) | |
15 | AC_SEARCH_LIBS(inet_addr, nsl) | 24 | AC_SEARCH_LIBS(inet_addr, nsl) |