? quick,patch Index: ChangeLog =================================================================== RCS file: /cvsroot/hurd/hurd/nfs/ChangeLog,v retrieving revision 1.48 diff -u -p -r1.48 ChangeLog --- ChangeLog 29 Sep 2002 15:11:59 -0000 1.48 +++ ChangeLog 9 Nov 2002 15:51:07 -0000 @@ -1,3 +1,13 @@ +2002-11-09 James A. Morrison <ja2morri@uwaterloo.ca> + + * ops.c (netfs_attempt_mkfile): Use asprintf instead of sprintf. + (netfs_attempt_unlink): Likewise. + (netfs_report_access): Pass !ERR to process_returned_stat as similar + calls to process_returned_stat do. + * nfs.c (xdr_decode_fhandle): Check the return value of lookup_fhandle. + * cache.c (lookup_fhandle): Return an error_t. + * nfs.h: Make lookup_fhandle return an error_t. + 2002-09-29 Marcus Brinkmann <marcus@gnu.org> * mount.c (mount_root): Add parenthesis for post-decrement (even Index: cache.c =================================================================== RCS file: /cvsroot/hurd/hurd/nfs/cache.c,v retrieving revision 1.16 diff -u -p -r1.16 cache.c --- cache.c 29 Sep 2002 15:11:59 -0000 1.16 +++ cache.c 9 Nov 2002 15:51:07 -0000 @@ -50,9 +50,10 @@ hash (int *data, size_t len) hash table. Whichever course, a new reference is generated and the node is returned in *NPP; the lock on the node, (*NPP)->LOCK, is held. */ -void +error_t lookup_fhandle (void *p, size_t len, struct node **npp) { + error_t err = 0; struct node *np; struct netnode *nn; int h; @@ -70,12 +71,13 @@ lookup_fhandle (void *p, size_t len, str spin_unlock (&netfs_node_refcnt_lock); mutex_lock (&np->lock); *npp = np; - return; + return 0; } /* Could not find it */ nn = malloc (sizeof (struct netnode)); - assert (nn); + if (!nn) + return errno; nn->handle.size = len; memcpy (nn->handle.data, p, len); @@ -85,16 +87,21 @@ lookup_fhandle (void *p, size_t len, str nn->dead_name = 0; np = netfs_make_node (nn); - mutex_lock (&np->lock); - nn->hnext = nodehash[h]; - if (nn->hnext) - nn->hnext->nn->hprevp = &nn->hnext; - nn->hprevp = &nodehash[h]; - nodehash[h] = np; + if (np) + { + mutex_lock (&np->lock); + nn->hnext = nodehash[h]; + if (nn->hnext) + nn->hnext->nn->hprevp = &nn->hnext; + nn->hprevp = &nodehash[h]; + *npp = nodehash[h] = np; + } + else + err = errno; spin_unlock (&netfs_node_refcnt_lock); - - *npp = np; + + return err; } /* Package holding args to forked_node_delete. */ Index: nfs.c =================================================================== RCS file: /cvsroot/hurd/hurd/nfs/nfs.c,v retrieving revision 1.27 diff -u -p -r1.27 nfs.c --- nfs.c 29 Sep 2002 15:11:59 -0000 1.27 +++ nfs.c 9 Nov 2002 15:51:08 -0000 @@ -390,7 +390,8 @@ xdr_decode_fhandle (int *p, struct node p++; } /* Enter into cache. */ - lookup_fhandle (p, len, npp); + err = lookup_fhandle (p, len, npp); + assert_perror (err); return p + len / sizeof (int); } Index: nfs.h =================================================================== RCS file: /cvsroot/hurd/hurd/nfs/nfs.h,v retrieving revision 1.18 diff -u -p -r1.18 nfs.h --- nfs.h 29 Dec 2001 00:40:09 -0000 1.18 +++ nfs.h 9 Nov 2002 15:51:09 -0000 @@ -1,5 +1,5 @@ /* Data structures and global variables for NFS client - Copyright (C) 1994,95,96,97,99,2001 Free Software Foundation, Inc. + Copyright (C) 1994,95,96,97,99,2001,02 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -191,7 +191,7 @@ void timeout_service_thread (void); void rpc_receive_thread (void); /* cache.c */ -void lookup_fhandle (void *, size_t, struct node **); +error_t lookup_fhandle (void *, size_t, struct node **); int *recache_handle (int *, struct node *); /* name-cache.c */ Index: ops.c =================================================================== RCS file: /cvsroot/hurd/hurd/nfs/ops.c,v retrieving revision 1.44 diff -u -p -r1.44 ops.c --- ops.c 29 Sep 2002 15:11:59 -0000 1.44 +++ ops.c 9 Nov 2002 15:51:13 -0000 @@ -1111,20 +1111,17 @@ netfs_attempt_mkfile (struct iouser *cre char *name; static int n = 0; - /* This is the best we can do. */ - - name = malloc (50); - if (! name) - return ENOMEM; - do { - sprintf (name, ".nfstmpgnu.0", n++); + if (asprintf (&name, ".nfstmpgnu.0", n++) < 0) + return errno; err = netfs_attempt_create_file (cred, dir, name, mode, newnp); if (err == EEXIST) - mutex_lock (&dir->lock); /* XXX is this right? does create need this - and drop this on error? Doesn't look - like it. */ + { + mutex_lock (&dir->lock); /* Relock the directory so we can try to + create another file. */ + free (name); + } } while (err == EEXIST); @@ -1274,18 +1271,17 @@ netfs_attempt_unlink (struct iouser *cre mutex_unlock (&dir->lock); - newname = malloc (50); - if (! newname) - { - mutex_lock (&dir->lock); - netfs_nrele (np); /* XXX Is this the correct thing to do? */ - return ENOMEM; - } - do { - sprintf (newname, ".nfs%txgnu.0", (ptrdiff_t) np, n++); + if (asprintf (&newname, ".nfs%txgnu.0", (ptrdiff_t) np, n++) < 0) + { + mutex_lock (&dir->lock); + netfs_nrele (np); /* XXX Is this the correct thing to do? */ + return errno; + } err = netfs_attempt_link (cred, dir, np, newname, 1); + if (err == EEXIST) + free (newname); } while (err == EEXIST); @@ -1532,9 +1528,7 @@ netfs_report_access (struct iouser *cred { err = nfs_error_trans (ntohl (*p)); p++; - p = process_returned_stat (np, p, 0); /* XXX Should this be - protected by the - if (!err) ? */ + p = process_returned_stat (np, p, !err); if (!err) { ret = ntohl (*p);