diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2014-03-16 20:04:11 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2014-03-16 20:04:11 +0100 |
commit | 2294f2fdffcf724cc28653976b8029351e41fd77 (patch) | |
tree | 476fefdf6ea438f95e3a6f68b2a01967622cd445 | |
parent | e5e577cc30171232ca9a9ca6fd6f97e3d59539a1 (diff) |
Fix handling of console readlink errors
* console-client/trans.c (netfs_attempt_lookup): Look for errors returned by
`readlink' before allocating a node.
(netfs_attempt_readlink): Look for errors returned by `readlink'.
-rw-r--r-- | console-client/trans.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/console-client/trans.c b/console-client/trans.c index 00c5407e..d65161c0 100644 --- a/console-client/trans.c +++ b/console-client/trans.c @@ -269,7 +269,20 @@ netfs_attempt_lookup (struct iouser *user, struct node *dir, { if (cn->node == NULL) { - struct netnode *nn = calloc (1, sizeof *nn); + struct netnode *nn; + ssize_t size = 0; + + if (cn->readlink) + { + size = cn->readlink (user, NULL, NULL); + if (size < 0) + { + err = -size; + goto out; + } + } + + nn = calloc (1, sizeof *nn); if (nn == NULL) { err = ENOMEM; @@ -283,15 +296,10 @@ netfs_attempt_lookup (struct iouser *user, struct node *dir, (*node)->nn_stat.st_mode = (netfs_root_node->nn_stat.st_mode & ~S_IFMT & ~S_ITRANS); (*node)->nn_stat.st_ino = 5; if (cn->readlink) - { (*node)->nn_stat.st_mode |= S_IFLNK; - (*node)->nn_stat.st_size = cn->readlink (user, NULL, NULL); - } else - { (*node)->nn_stat.st_mode |= S_IFCHR; - (*node)->nn_stat.st_size = 0; - } + (*node)->nn_stat.st_size = size; cn->node = *node; goto out; } @@ -508,7 +516,13 @@ netfs_attempt_readlink (struct iouser *user, struct node *np, char *buf) { if (np->nn->node && np->nn->node->readlink) - return np->nn->node->readlink (user, np, buf); + { + error_t err = np->nn->node->readlink (user, np, buf); + if (err < 0) + return -err; + else + return 0; + } return EOPNOTSUPP; } |