summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2013-01-21 21:04:26 -0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-01-25 12:42:43 +0000
commit8adcafc239ccb3fa9fc968140b43da90d735ce21 (patch)
treedab876fab92305921a4b7e3c0f93f9360f4a6e94
parent3991c5520e584635d3034f27ce817c453b36fb2d (diff)
downloadpoky-8adcafc239ccb3fa9fc968140b43da90d735ce21.tar.gz
nfs-utils: Upgrade 1.2.3 -> 1.2.8-rc3
Disable nfsv4l since it needs LVM2 which is not available in OE-Core Disable nfsdcltrack since its configure time check for sqlite3 is not cross compiling safe It can support ipv6 but thats disabled since we disable libtirpc which is needed for ipv6 support in nfs-utils Patches imported from fedora to take us to 1.2.8-rc3 (From OE-Core rev: 658bfe4690005d0a68dc4e3ca2bc741ff4c89f28) Signed-off-by: Khem Raj <raj.khem@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.0.6-uclibc.patch39
-rw-r--r--meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.2.3-sm-notify-res_init.patch36
-rw-r--r--meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-nfsctl-x32-fix.patch30
-rw-r--r--meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils.1.2.8.rc3.patch599
-rw-r--r--meta/recipes-connectivity/nfs-utils/nfs-utils_1.2.7.bb (renamed from meta/recipes-connectivity/nfs-utils/nfs-utils_1.2.3.bb)25
5 files changed, 671 insertions, 58 deletions
diff --git a/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.0.6-uclibc.patch b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.0.6-uclibc.patch
index 6d46d3a591..c3442380e1 100644
--- a/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.0.6-uclibc.patch
+++ b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.0.6-uclibc.patch
@@ -1,22 +1,27 @@
1Signed-off-by: Khem Raj <raj.khem@gmail.com>
2
1Upstream-Status: Inappropriate [embedded specific] 3Upstream-Status: Inappropriate [embedded specific]
2 4
3Index: nfs-utils-1.2.3/support/nfs/svc_socket.c 5Index: nfs-utils-1.2.6/support/nfs/svc_socket.c
4=================================================================== 6===================================================================
5--- nfs-utils-1.2.3.orig/support/nfs/svc_socket.c 7--- nfs-utils-1.2.6.orig/support/nfs/svc_socket.c 2012-05-14 07:40:52.000000000 -0700
6+++ nfs-utils-1.2.3/support/nfs/svc_socket.c 8+++ nfs-utils-1.2.6/support/nfs/svc_socket.c 2012-10-28 02:42:50.179222457 -0700
7@@ -67,6 +67,7 @@ svc_socket (u_long number, int type, int 9@@ -40,8 +40,9 @@
8 memset (&addr, 0, sizeof (addr)); 10 char rpcdata[1024], servdata[1024];
9 addr.sin_family = AF_INET; 11 struct rpcent rpcbuf, *rpcp;
12 struct servent servbuf, *servp = NULL;
13- int ret;
14+ int ret = 0;
10 15
11+#ifndef __UCLIBC__ /* neither getrpcbynumber() nor getrpcbynumber_r() is SuSv3 */ 16+#ifndef __UCLIBC__ /* neither getrpcbynumber() nor getrpcbynumber_r() is SuSv3 */
12 ret = getrpcbynumber_r (number, &rpcbuf, rpcdata, sizeof rpcdata, 17 ret = getrpcbynumber_r(number, &rpcbuf, rpcdata, sizeof rpcdata,
13 &rpcp); 18 &rpcp);
14 if (ret == 0 && rpcp != NULL) 19 if (ret == 0 && rpcp != NULL) {
15@@ -100,6 +101,7 @@ svc_socket (u_long number, int type, int 20@@ -60,6 +61,7 @@
21 }
22 }
16 } 23 }
17 } 24+#endif /* __UCLIBC__ */
18 else 25
19+#endif 26 if (ret == 0 && servp != NULL)
20 { 27 return ntohs(servp->s_port);
21 addr.sin_port = 0;
22 if (bind (sock, (struct sockaddr *) &addr, len) < 0)
diff --git a/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.2.3-sm-notify-res_init.patch b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.2.3-sm-notify-res_init.patch
new file mode 100644
index 0000000000..d8f8181670
--- /dev/null
+++ b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-1.2.3-sm-notify-res_init.patch
@@ -0,0 +1,36 @@
1Fixes errors like
2sm-notify[1070]: DNS resolution of a.b.c.d..com failed; retrying later
3This error will occur anytime sm-notify is run before the network if fully up,
4which is happening more and more with parallel startup systems.
5The res_init() call is simple, safe, quick, and a patch to use it should be
6able to go upstream. Presumably the whole reason sm-notify tries several
7times is to wait for possible changes to the network configuration, but without
8calling res_init() it will never be aware of those changes
9
10Backported drom Fedora
11
12Upstream-Status: Pending
13Signed-off-by: Khem Raj <raj.khem@gmail.com>
14
15
16diff -up nfs-utils-1.2.3/utils/statd/sm-notify.c.orig nfs-utils-1.2.3/utils/statd/sm-notify.c
17--- nfs-utils-1.2.3/utils/statd/sm-notify.c.orig 2010-09-28 08:24:16.000000000 -0400
18+++ nfs-utils-1.2.3/utils/statd/sm-notify.c 2010-10-15 16:44:43.487119601 -0400
19@@ -28,6 +28,9 @@
20 #include <netdb.h>
21 #include <errno.h>
22 #include <grp.h>
23+#include <netinet/in.h>
24+#include <arpa/nameser.h>
25+#include <resolv.h>
26
27 #include "sockaddr.h"
28 #include "xlog.h"
29@@ -84,6 +87,7 @@ smn_lookup(const char *name)
30 };
31 int error;
32
33+ res_init();
34 error = getaddrinfo(name, NULL, &hint, &ai);
35 if (error != 0) {
36 xlog(D_GENERAL, "getaddrinfo(3): %s", gai_strerror(error));
diff --git a/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-nfsctl-x32-fix.patch b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-nfsctl-x32-fix.patch
deleted file mode 100644
index 26b463136a..0000000000
--- a/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils-nfsctl-x32-fix.patch
+++ /dev/null
@@ -1,30 +0,0 @@
1
2Upstream-Status: Pending
3
4Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
5
6--- nfs-utils-1.2.3/support/nfs/nfsctl.c.x32 2010-09-28 05:24:16.000000000 -0700
7+++ nfs-utils-1.2.3/support/nfs/nfsctl.c 2011-11-30 13:34:09.369917161 -0800
8@@ -12,15 +12,22 @@
9
10 #include <unistd.h>
11 #include <asm/unistd.h>
12+#include <errno.h>
13 #include "nfslib.h"
14
15 /* compatibility hack... */
16 #ifndef __NR_nfsctl
17+#ifdef __NR_nfsservctl
18 #define __NR_nfsctl __NR_nfsservctl
19 #endif
20+#endif
21
22 int
23 nfsctl (int cmd, struct nfsctl_arg * argp, union nfsctl_res * resp)
24 {
25+#ifdef __NR_nfsctl
26 return syscall (__NR_nfsctl, cmd, argp, resp);
27+#else
28+ return -ENOSYS;
29+#endif
30 }
diff --git a/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils.1.2.8.rc3.patch b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils.1.2.8.rc3.patch
new file mode 100644
index 0000000000..0411b47982
--- /dev/null
+++ b/meta/recipes-connectivity/nfs-utils/nfs-utils/nfs-utils.1.2.8.rc3.patch
@@ -0,0 +1,599 @@
1Backported from Fedora
2
3This is a cumulative fixes patch between 1.2.7 and 1.2.8 latest rc
4
5Upstream-Status: Backport
6Signed-off-by: Khem Raj <raj.khem@gmail.com>
7
8diff --git a/support/export/rmtab.c b/support/export/rmtab.c
9index 31c0f50..d16b3b3 100644
10--- a/support/export/rmtab.c
11+++ b/support/export/rmtab.c
12@@ -1,7 +1,7 @@
13 /*
14- * support/export/rmntab.c
15+ * support/export/rmtab.c
16 *
17- * Interface to the rmnt file.
18+ * Interface to the rmtab file.
19 *
20 */
21
22@@ -12,7 +12,7 @@
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26-#include "xmalloc.h"
27+
28 #include "misc.h"
29 #include "nfslib.h"
30 #include "exportfs.h"
31diff --git a/support/export/xtab.c b/support/export/xtab.c
32index 2a43193..e953071 100644
33--- a/support/export/xtab.c
34+++ b/support/export/xtab.c
35@@ -14,7 +14,7 @@
36 #include <unistd.h>
37 #include <stdlib.h>
38 #include <string.h>
39-#include "xmalloc.h"
40+
41 #include "nfslib.h"
42 #include "exportfs.h"
43 #include "xio.h"
44diff --git a/support/nfs/cacheio.c b/support/nfs/cacheio.c
45index e641c45..61e07a8 100644
46--- a/support/nfs/cacheio.c
47+++ b/support/nfs/cacheio.c
48@@ -162,11 +162,16 @@ int qword_eol(FILE *f)
49 {
50 int err;
51
52- fprintf(f,"\n");
53- err = fflush(f);
54- if (err) {
55- xlog_warn("qword_eol: fflush failed: errno %d (%s)",
56+ err = fprintf(f,"\n");
57+ if (err < 0) {
58+ xlog_warn("qword_eol: fprintf failed: errno %d (%s)",
59 errno, strerror(errno));
60+ } else {
61+ err = fflush(f);
62+ if (err) {
63+ xlog_warn("qword_eol: fflush failed: errno %d (%s)",
64+ errno, strerror(errno));
65+ }
66 }
67 /*
68 * We must send one line (and one line only) in a single write
69diff --git a/utils/gssd/gssd_proc.c b/utils/gssd/gssd_proc.c
70index ec251fa..d01ba2f 100644
71--- a/utils/gssd/gssd_proc.c
72+++ b/utils/gssd/gssd_proc.c
73@@ -52,6 +52,7 @@
74 #include <sys/socket.h>
75 #include <arpa/inet.h>
76 #include <sys/fsuid.h>
77+#include <sys/resource.h>
78
79 #include <stdio.h>
80 #include <stdlib.h>
81@@ -250,21 +251,10 @@ read_service_info(char *info_file_name, char **servicename, char **servername,
82 if ((p = strstr(buf, "port")) != NULL)
83 sscanf(p, "port: %127s\n", port);
84
85- /* check service, program, and version */
86- if (memcmp(service, "nfs", 3) != 0)
87- return -1;
88+ /* get program, and version numbers */
89 *prog = atoi(program + 1); /* skip open paren */
90 *vers = atoi(version);
91
92- if (strlen(service) == 3 ) {
93- if ((*prog != 100003) || ((*vers != 2) && (*vers != 3) &&
94- (*vers != 4)))
95- goto fail;
96- } else if (memcmp(service, "nfs4_cb", 7) == 0) {
97- if (*vers != 1)
98- goto fail;
99- }
100-
101 if (!addrstr_to_sockaddr(addr, address, port))
102 goto fail;
103
104@@ -398,10 +388,10 @@ process_clnt_dir_files(struct clnt_info * clp)
105 static int
106 get_poll_index(int *ind)
107 {
108- int i;
109+ unsigned int i;
110
111 *ind = -1;
112- for (i=0; i<FD_ALLOC_BLOCK; i++) {
113+ for (i=0; i<pollsize; i++) {
114 if (pollarray[i].events == 0) {
115 *ind = i;
116 break;
117@@ -483,9 +473,13 @@ fail_keep_client:
118 void
119 init_client_list(void)
120 {
121+ struct rlimit rlim;
122 TAILQ_INIT(&clnt_list);
123 /* Eventually plan to grow/shrink poll array: */
124 pollsize = FD_ALLOC_BLOCK;
125+ if (getrlimit(RLIMIT_NOFILE, &rlim) < 0 &&
126+ rlim.rlim_cur != RLIM_INFINITY)
127+ pollsize = rlim.rlim_cur;
128 pollarray = calloc(pollsize, sizeof(struct pollfd));
129 }
130
131@@ -567,9 +561,8 @@ process_pipedir(char *pipe_name)
132
133 update_old_clients(namelist, j, pipe_name);
134 for (i=0; i < j; i++) {
135- if (i < FD_ALLOC_BLOCK
136- && !strncmp(namelist[i]->d_name, "clnt", 4)
137- && !find_client(namelist[i]->d_name, pipe_name))
138+ if (!strncmp(namelist[i]->d_name, "clnt", 4)
139+ && !find_client(namelist[i]->d_name, pipe_name))
140 process_clnt_dir(namelist[i]->d_name, pipe_name);
141 free(namelist[i]);
142 }
143@@ -962,12 +955,6 @@ process_krb5_upcall(struct clnt_info *clp, uid_t uid, int fd, char *tgtname,
144
145 printerr(1, "handling krb5 upcall (%s)\n", clp->dirname);
146
147- if (tgtname) {
148- if (clp->servicename) {
149- free(clp->servicename);
150- clp->servicename = strdup(tgtname);
151- }
152- }
153 token.length = 0;
154 token.value = NULL;
155 memset(&pd, 0, sizeof(struct authgss_private_data));
156@@ -1016,7 +1003,8 @@ process_krb5_upcall(struct clnt_info *clp, uid_t uid, int fd, char *tgtname,
157 int success = 0;
158 do {
159 gssd_refresh_krb5_machine_credential(clp->servername,
160- NULL, service);
161+ NULL, service,
162+ tgtname);
163 /*
164 * Get a list of credential cache names and try each
165 * of them until one works or we've tried them all
166diff --git a/utils/gssd/krb5_util.c b/utils/gssd/krb5_util.c
167index 60ba594..aeb8f70 100644
168--- a/utils/gssd/krb5_util.c
169+++ b/utils/gssd/krb5_util.c
170@@ -774,12 +774,16 @@ gssd_search_krb5_keytab(krb5_context context, krb5_keytab kt,
171 }
172
173 /*
174- * Find a keytab entry to use for a given target hostname.
175+ * Find a keytab entry to use for a given target realm.
176 * Tries to find the most appropriate keytab to use given the
177 * name of the host we are trying to connect with.
178+ *
179+ * Note: the tgtname contains a hostname in the realm that we
180+ * are authenticating to. It may, or may not be the same as
181+ * the server hostname.
182 */
183 static int
184-find_keytab_entry(krb5_context context, krb5_keytab kt, const char *hostname,
185+find_keytab_entry(krb5_context context, krb5_keytab kt, const char *tgtname,
186 krb5_keytab_entry *kte, const char **svcnames)
187 {
188 krb5_error_code code;
189@@ -795,7 +799,7 @@ find_keytab_entry(krb5_context context, krb5_keytab kt, const char *hostname,
190
191
192 /* Get full target hostname */
193- retval = get_full_hostname(hostname, targethostname,
194+ retval = get_full_hostname(tgtname, targethostname,
195 sizeof(targethostname));
196 if (retval)
197 goto out;
198@@ -1128,7 +1132,7 @@ gssd_get_krb5_machine_cred_list(char ***list)
199 if (ple->ccname) {
200 /* Make sure cred is up-to-date before returning it */
201 retval = gssd_refresh_krb5_machine_credential(NULL, ple,
202- NULL);
203+ NULL, NULL);
204 if (retval)
205 continue;
206 if (i + 1 > listsize) {
207@@ -1219,7 +1223,8 @@ gssd_destroy_krb5_machine_creds(void)
208 int
209 gssd_refresh_krb5_machine_credential(char *hostname,
210 struct gssd_k5_kt_princ *ple,
211- char *service)
212+ char *service,
213+ char *tgtname)
214 {
215 krb5_error_code code = 0;
216 krb5_context context;
217@@ -1258,7 +1263,10 @@ gssd_refresh_krb5_machine_credential(char *hostname,
218 if (ple == NULL) {
219 krb5_keytab_entry kte;
220
221- code = find_keytab_entry(context, kt, hostname, &kte, svcnames);
222+ if (tgtname == NULL)
223+ tgtname = hostname;
224+
225+ code = find_keytab_entry(context, kt, tgtname, &kte, svcnames);
226 if (code) {
227 printerr(0, "ERROR: %s: no usable keytab entry found "
228 "in keytab %s for connection with host %s\n",
229diff --git a/utils/gssd/krb5_util.h b/utils/gssd/krb5_util.h
230index cd6e107..9f41625 100644
231--- a/utils/gssd/krb5_util.h
232+++ b/utils/gssd/krb5_util.h
233@@ -31,7 +31,8 @@ void gssd_setup_krb5_machine_gss_ccache(char *servername);
234 void gssd_destroy_krb5_machine_creds(void);
235 int gssd_refresh_krb5_machine_credential(char *hostname,
236 struct gssd_k5_kt_princ *ple,
237- char *service);
238+ char *service,
239+ char *tgtname);
240 char *gssd_k5_err_msg(krb5_context context, krb5_error_code code);
241 void gssd_k5_get_default_realm(char **def_realm);
242
243diff --git a/utils/gssd/svcgssd_krb5.c b/utils/gssd/svcgssd_krb5.c
244index 6c34faf..1d44d34 100644
245--- a/utils/gssd/svcgssd_krb5.c
246+++ b/utils/gssd/svcgssd_krb5.c
247@@ -38,6 +38,7 @@
248
249 #include <stdio.h>
250 #include <errno.h>
251+#include <ctype.h>
252 #include <gssapi/gssapi.h>
253 #include <krb5.h>
254
255@@ -98,6 +99,12 @@ parse_enctypes(char *enctypes)
256 if (n == 0)
257 return ENOENT;
258
259+ /* Skip pass any non digits */
260+ while (*enctypes && isdigit(*enctypes) == 0)
261+ enctypes++;
262+ if (*enctypes == '\0')
263+ return EINVAL;
264+
265 /* Allocate space for enctypes array */
266 if ((parsed_enctypes = (int *) calloc(n, sizeof(int))) == NULL) {
267 return ENOMEM;
268diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c
269index e80efb4..beba9c4 100644
270--- a/utils/idmapd/idmapd.c
271+++ b/utils/idmapd/idmapd.c
272@@ -145,7 +145,6 @@ static void svrreopen(int, short, void *);
273 static int nfsopen(struct idmap_client *);
274 static void nfscb(int, short, void *);
275 static void nfsdcb(int, short, void *);
276-static int validateascii(char *, u_int32_t);
277 static int addfield(char **, ssize_t *, char *);
278 static int getfield(char **, char *, size_t);
279
280@@ -425,7 +424,8 @@ dirscancb(int UNUSED(fd), short UNUSED(which), void *data)
281 pipefsdir, ents[i]->d_name);
282
283 if ((ic->ic_dirfd = open(path, O_RDONLY, 0)) == -1) {
284- xlog_warn("dirscancb: open(%s): %s", path, strerror(errno));
285+ if (verbose > 0)
286+ xlog_warn("dirscancb: open(%s): %s", path, strerror(errno));
287 free(ic);
288 goto out;
289 }
290@@ -642,6 +642,8 @@ out:
291 static void
292 imconv(struct idmap_client *ic, struct idmap_msg *im)
293 {
294+ u_int32_t len;
295+
296 switch (im->im_conv) {
297 case IDMAP_CONV_IDTONAME:
298 idtonameres(im);
299@@ -652,10 +654,10 @@ imconv(struct idmap_client *ic, struct idmap_msg *im)
300 im->im_id, im->im_name);
301 break;
302 case IDMAP_CONV_NAMETOID:
303- if (validateascii(im->im_name, sizeof(im->im_name)) == -1) {
304- im->im_status |= IDMAP_STATUS_INVALIDMSG;
305+ len = strnlen(im->im_name, IDMAP_NAMESZ - 1);
306+ /* Check for NULL termination just to be careful */
307+ if (im->im_name[len+1] != '\0')
308 return;
309- }
310 nametoidres(im);
311 if (verbose > 1)
312 xlog_warn("%s %s: (%s) name \"%s\" -> id \"%d\"",
313@@ -855,25 +857,6 @@ nametoidres(struct idmap_msg *im)
314 }
315
316 static int
317-validateascii(char *string, u_int32_t len)
318-{
319- u_int32_t i;
320-
321- for (i = 0; i < len; i++) {
322- if (string[i] == '\0')
323- break;
324-
325- if (string[i] & 0x80)
326- return (-1);
327- }
328-
329- if ((i >= len) || string[i] != '\0')
330- return (-1);
331-
332- return (i + 1);
333-}
334-
335-static int
336 addfield(char **bpp, ssize_t *bsizp, char *fld)
337 {
338 char ch, *bp = *bpp;
339diff --git a/utils/mount/error.c b/utils/mount/error.c
340index 83ad1d2..f8fc13f 100644
341--- a/utils/mount/error.c
342+++ b/utils/mount/error.c
343@@ -225,7 +225,7 @@ void mount_error(const char *spec, const char *mount_point, int error)
344 case ENOENT:
345 if (spec)
346 nfs_error(_("%s: mounting %s failed, "
347- "reason given by server:\n %s"),
348+ "reason given by server: %s"),
349 progname, spec, strerror(error));
350 else
351 nfs_error(_("%s: mount point %s does not exist"),
352diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
353index 9b4197b..8ee3024 100644
354--- a/utils/mount/stropts.c
355+++ b/utils/mount/stropts.c
356@@ -666,6 +666,7 @@ static int nfs_try_mount_v3v2(struct nfsmount_info *mi)
357 case EOPNOTSUPP:
358 case EHOSTUNREACH:
359 case ETIMEDOUT:
360+ case EACCES:
361 continue;
362 default:
363 goto out;
364@@ -761,6 +762,7 @@ static int nfs_try_mount_v4(struct nfsmount_info *mi)
365 case ECONNREFUSED:
366 case EHOSTUNREACH:
367 case ETIMEDOUT:
368+ case EACCES:
369 continue;
370 default:
371 goto out;
372diff --git a/utils/mountd/auth.c b/utils/mountd/auth.c
373index 508040a..330cab5 100644
374--- a/utils/mountd/auth.c
375+++ b/utils/mountd/auth.c
376@@ -10,10 +10,12 @@
377 #include <config.h>
378 #endif
379
380+#include <sys/types.h>
381 #include <sys/stat.h>
382 #include <netinet/in.h>
383 #include <arpa/inet.h>
384 #include <errno.h>
385+#include <fcntl.h>
386 #include <unistd.h>
387
388 #include "sockaddr.h"
389@@ -21,7 +23,6 @@
390 #include "nfslib.h"
391 #include "exportfs.h"
392 #include "mountd.h"
393-#include "xmalloc.h"
394 #include "v4root.h"
395
396 enum auth_error
397diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
398index e950ec6..45012be 100644
399--- a/utils/mountd/cache.c
400+++ b/utils/mountd/cache.c
401@@ -29,7 +29,6 @@
402 #include "nfslib.h"
403 #include "exportfs.h"
404 #include "mountd.h"
405-#include "xmalloc.h"
406 #include "fsloc.h"
407 #include "pseudoflavors.h"
408
409@@ -109,12 +108,10 @@ static void auth_unix_ip(FILE *f)
410 struct addrinfo *ai = NULL;
411
412 ai = client_resolve(tmp->ai_addr);
413- if (ai == NULL)
414- goto out;
415- client = client_compose(ai);
416- freeaddrinfo(ai);
417- if (!client)
418- goto out;
419+ if (ai) {
420+ client = client_compose(ai);
421+ freeaddrinfo(ai);
422+ }
423 }
424 qword_print(f, "nfsd");
425 qword_print(f, ipaddr);
426@@ -127,7 +124,6 @@ static void auth_unix_ip(FILE *f)
427 xlog(D_CALL, "auth_unix_ip: client %p '%s'", client, client?client: "DEFAULT");
428
429 free(client);
430-out:
431 freeaddrinfo(tmp);
432
433 }
434@@ -347,6 +343,30 @@ static char *next_mnt(void **v, char *p)
435 return me->mnt_dir;
436 }
437
438+static int is_subdirectory(char *child, char *parent)
439+{
440+ size_t l = strlen(parent);
441+
442+ if (strcmp(parent, "/") == 0)
443+ return 1;
444+
445+ return strcmp(child, parent) == 0
446+ || (strncmp(child, parent, l) == 0 && child[l] == '/');
447+}
448+
449+static int path_matches(nfs_export *exp, char *path)
450+{
451+ if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT)
452+ return is_subdirectory(path, exp->m_export.e_path);
453+ return strcmp(path, exp->m_export.e_path) == 0;
454+}
455+
456+static int
457+export_matches(nfs_export *exp, char *dom, char *path, struct addrinfo *ai)
458+{
459+ return path_matches(exp, path) && client_matches(exp, dom, ai);
460+}
461+
462 /* True iff e1 is a child of e2 and e2 has crossmnt set: */
463 static bool subexport(struct exportent *e1, struct exportent *e2)
464 {
465@@ -354,8 +374,7 @@ static bool subexport(struct exportent *e1, struct exportent *e2)
466 size_t l2 = strlen(p2);
467
468 return e2->e_flags & NFSEXP_CROSSMOUNT
469- && strncmp(p1, p2, l2) == 0
470- && p1[l2] == '/';
471+ && is_subdirectory(p1, p2);
472 }
473
474 struct parsed_fsid {
475@@ -756,27 +775,6 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
476 return qword_eol(f);
477 }
478
479-static int is_subdirectory(char *child, char *parent)
480-{
481- size_t l = strlen(parent);
482-
483- return strcmp(child, parent) == 0
484- || (strncmp(child, parent, l) == 0 && child[l] == '/');
485-}
486-
487-static int path_matches(nfs_export *exp, char *path)
488-{
489- if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT)
490- return is_subdirectory(path, exp->m_export.e_path);
491- return strcmp(path, exp->m_export.e_path) == 0;
492-}
493-
494-static int
495-export_matches(nfs_export *exp, char *dom, char *path, struct addrinfo *ai)
496-{
497- return path_matches(exp, path) && client_matches(exp, dom, ai);
498-}
499-
500 static nfs_export *
501 lookup_export(char *dom, char *path, struct addrinfo *ai)
502 {
503@@ -830,6 +828,7 @@ lookup_export(char *dom, char *path, struct addrinfo *ai)
504
505 #ifdef HAVE_NFS_PLUGIN_H
506 #include <dlfcn.h>
507+#include <link.h>
508 #include <nfs-plugin.h>
509
510 /*
511@@ -1094,6 +1093,7 @@ static struct exportent *lookup_junction(char *dom, const char *pathname,
512 struct addrinfo *ai)
513 {
514 struct exportent *exp;
515+ struct link_map *map;
516 void *handle;
517
518 handle = dlopen("libnfsjunct.so", RTLD_NOW);
519@@ -1101,6 +1101,11 @@ static struct exportent *lookup_junction(char *dom, const char *pathname,
520 xlog(D_GENERAL, "%s: dlopen: %s", __func__, dlerror());
521 return NULL;
522 }
523+
524+ if (dlinfo(handle, RTLD_DI_LINKMAP, &map) == 0)
525+ xlog(D_GENERAL, "%s: loaded plug-in %s",
526+ __func__, map->l_name);
527+
528 (void)dlerror(); /* Clear any error */
529
530 exp = invoke_junction_ops(handle, dom, pathname, ai);
531diff --git a/utils/nfsdcltrack/nfsdcltrack.c b/utils/nfsdcltrack/nfsdcltrack.c
532index 9801b9c..4334340 100644
533--- a/utils/nfsdcltrack/nfsdcltrack.c
534+++ b/utils/nfsdcltrack/nfsdcltrack.c
535@@ -379,6 +379,17 @@ cltrack_legacy_gracedone(void)
536 while ((entry = readdir(v4recovery))) {
537 int len;
538
539+ /* skip "." and ".." */
540+ if (entry->d_name[0] == '.') {
541+ switch (entry->d_name[1]) {
542+ case '\0':
543+ continue;
544+ case '.':
545+ if (entry->d_name[2] == '\0')
546+ continue;
547+ }
548+ }
549+
550 /* borrow the clientid blob for this */
551 len = snprintf((char *)blob, sizeof(blob), "%s/%s", dirname,
552 entry->d_name);
553diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c
554index 4ecb03c..fd576d9 100644
555--- a/utils/statd/rmtcall.c
556+++ b/utils/statd/rmtcall.c
557@@ -68,21 +68,19 @@ statd_get_socket(void)
558 {
559 struct sockaddr_in sin;
560 struct servent *se;
561- int loopcnt = 100;
562+ const int loopcnt = 100;
563+ int i, tmp_sockets[loopcnt];
564
565 if (sockfd >= 0)
566 return sockfd;
567
568- while (loopcnt-- > 0) {
569-
570- if (sockfd >= 0) close(sockfd);
571+ for (i = 0; i < loopcnt; ++i) {
572
573 if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
574 xlog(L_ERROR, "%s: Can't create socket: %m", __func__);
575- return -1;
576+ break;
577 }
578
579-
580 memset(&sin, 0, sizeof(sin));
581 sin.sin_family = AF_INET;
582 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
583@@ -96,7 +94,16 @@ statd_get_socket(void)
584 if (se == NULL)
585 break;
586 /* rather not use that port, try again */
587+
588+ tmp_sockets[i] = sockfd;
589 }
590+
591+ while (--i >= 0)
592+ close(tmp_sockets[i]);
593+
594+ if (sockfd < 0)
595+ return -1;
596+
597 FD_SET(sockfd, &SVC_FDSET);
598 return sockfd;
599 }
diff --git a/meta/recipes-connectivity/nfs-utils/nfs-utils_1.2.3.bb b/meta/recipes-connectivity/nfs-utils/nfs-utils_1.2.7.bb
index 84b8e76315..5bad6f17ad 100644
--- a/meta/recipes-connectivity/nfs-utils/nfs-utils_1.2.3.bb
+++ b/meta/recipes-connectivity/nfs-utils/nfs-utils_1.2.7.bb
@@ -4,24 +4,23 @@ NFS server and related tools."
4HOMEPAGE = "http://nfs.sourceforge.net/" 4HOMEPAGE = "http://nfs.sourceforge.net/"
5SECTION = "console/network" 5SECTION = "console/network"
6 6
7LICENSE = "GPLv2+" 7LICENSE = "MIT & GPLv2+ & BSD"
8LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3" 8LIC_FILES_CHKSUM = "file://COPYING;md5=95f3a93a5c3c7888de623b46ea085a84"
9 9
10# util-linux for libblkid 10# util-linux for libblkid
11DEPENDS = "libcap libnfsidmap libevent util-linux tcp-wrappers" 11DEPENDS = "libcap libnfsidmap libevent util-linux tcp-wrappers sqlite3"
12RDEPENDS_${PN} = "rpcbind" 12RDEPENDS_${PN} = "rpcbind"
13RRECOMMENDS_${PN} = "kernel-module-nfsd" 13RRECOMMENDS_${PN} = "kernel-module-nfsd"
14 14
15PR = "r5" 15SRC_URI = "${KERNELORG_MIRROR}/linux/utils/nfs-utils/${PV}/nfs-utils-${PV}.tar.bz2 \
16 16 file://nfs-utils.1.2.8.rc3.patch \
17SRC_URI = "${SOURCEFORGE_MIRROR}/nfs/nfs-utils-${PV}.tar.bz2 \
18 file://nfs-utils-1.0.6-uclibc.patch \ 17 file://nfs-utils-1.0.6-uclibc.patch \
19 file://nfs-utils-1.2.3-uclibc-libio.h.patch \ 18 file://nfs-utils-1.2.3-uclibc-libio.h.patch \
20 file://nfs-utils-nfsctl-x32-fix.patch \ 19 file://nfs-utils-1.2.3-sm-notify-res_init.patch \
21 file://nfsserver" 20 file://nfsserver"
22 21
23SRC_URI[md5sum] = "1131dc5f27c4f3905a6e7ee0d594fd4d" 22SRC_URI[md5sum] = "3b5ca797197765dc0c3a4122720c7716"
24SRC_URI[sha256sum] = "5575ece941097cbfa67fbe0d220dfa11b73f5e6d991e7939c9339bd72259ff19" 23SRC_URI[sha256sum] = "7ef8e0a8b22cd7ff33f3afd28e770d45643fae303468a180640c2967833fe75e"
25 24
26PARALLEL_MAKE = "" 25PARALLEL_MAKE = ""
27 26
@@ -38,11 +37,15 @@ inherit autotools update-rc.d
38 37
39# --enable-uuid is need for cross-compiling 38# --enable-uuid is need for cross-compiling
40EXTRA_OECONF = "--with-statduser=nobody \ 39EXTRA_OECONF = "--with-statduser=nobody \
41 --enable-nfsv41 \ 40 --enable-mountconfig \
41 --enable-libmount-mount \
42 --disable-nfsv41 \
42 --enable-uuid \ 43 --enable-uuid \
43 --disable-gss \ 44 --disable-gss \
44 --disable-tirpc \ 45 --disable-tirpc \
45 --with-statedir=/var/lib/nfs" 46 --disable-nfsdcltrack \
47 --with-statdpath=/var/lib/nfs/statd \
48 "
46 49
47INHIBIT_AUTO_STAGE = "1" 50INHIBIT_AUTO_STAGE = "1"
48 51