summaryrefslogtreecommitdiffstats
path: root/utils/mountd
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-01-11 12:45:48 +1100
committerNeil Brown <neilb@suse.de>2007-01-11 12:45:48 +1100
commit8fd9fad1ea4b25b8962d70133f476650ef0637b0 (patch)
treeebc6a359e751f4dcc7167ed1cbe83c86d3a9e0c2 /utils/mountd
parent95b414a6038d1d4efb1b1ec90c2da17def7064b2 (diff)
Error check messages sent to the kernel.
And make sure that if we fail to export a filesystem in mountd, then we don't try to get a filehandle on it, or a deadlock might occur.
Diffstat (limited to 'utils/mountd')
-rw-r--r--utils/mountd/cache.c27
-rw-r--r--utils/mountd/mountd.c7
2 files changed, 21 insertions, 13 deletions
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 726b98f..dcb5dac 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -35,7 +35,7 @@
* Record is terminated with newline.
*
*/
-void cache_export_ent(char *domain, struct exportent *exp);
+int cache_export_ent(char *domain, struct exportent *exp);
char *lbuf = NULL;
@@ -352,12 +352,12 @@ int cache_process_req(fd_set *readfds)
* % echo $domain $path $[now+30*60] $options $anonuid $anongid $fsid > /proc/net/rpc/nfsd.export/channel
*/
-void cache_export_ent(char *domain, struct exportent *exp)
+int cache_export_ent(char *domain, struct exportent *exp)
{
-
+ int err;
FILE *f = fopen("/proc/net/rpc/nfsd.export/channel", "w");
if (!f)
- return;
+ return -1;
qword_print(f, domain);
qword_print(f, exp->e_path);
@@ -366,28 +366,32 @@ void cache_export_ent(char *domain, struct exportent *exp)
qword_printint(f, exp->e_anonuid);
qword_printint(f, exp->e_anongid);
qword_printint(f, exp->e_fsid);
- qword_eol(f);
+ err = qword_eol(f);
fclose(f);
+ return err;
}
-void cache_export(nfs_export *exp)
+int cache_export(nfs_export *exp)
{
+ int err;
FILE *f;
f = fopen("/proc/net/rpc/auth.unix.ip/channel", "w");
if (!f)
- return;
+ return -1;
qword_print(f, "nfsd");
qword_print(f, inet_ntoa(exp->m_client->m_addrlist[0]));
qword_printint(f, time(0)+30*60);
qword_print(f, exp->m_client->m_hostname);
- qword_eol(f);
+ err = qword_eol(f);
fclose(f);
- cache_export_ent(exp->m_client->m_hostname, &exp->m_export);
+ err = cache_export_ent(exp->m_client->m_hostname, &exp->m_export)
+ || err;
+ return err;
}
/* Get a filehandle.
@@ -413,9 +417,10 @@ cache_get_filehandle(nfs_export *exp, int len, char *p)
qword_print(f, exp->m_client->m_hostname);
qword_print(f, p);
qword_printint(f, len);
- qword_eol(f);
+ failed = qword_eol(f);
- failed = (fgets(buf, sizeof(buf), f) == NULL);
+ if (!failed)
+ failed = (fgets(buf, sizeof(buf), f) == NULL);
fclose(f);
if (failed)
return NULL;
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index 08f294d..72332ce 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -29,7 +29,7 @@
extern void cache_open(void);
extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p);
-extern void cache_export(nfs_export *exp);
+extern int cache_export(nfs_export *exp);
extern void my_svc_run(void);
@@ -416,7 +416,10 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
*/
struct nfs_fh_len *fh;
- cache_export(exp);
+ if (cache_export(exp)) {
+ *error = NFSERR_ACCES;
+ return NULL;
+ }
fh = cache_get_filehandle(exp, v3?64:32, p);
if (fh == NULL)
*error = NFSERR_ACCES;