[Libsysio-commit] HEAD: libsysio/src readlink.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2004-08-27 18:11:37
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31294/src Modified Files: readlink.c Log Message: Cray SPR 729924. Bad return values. Was returning the negated error code instead of -1. Fixed. Index: readlink.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/readlink.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -w -b -B -p -r1.3 -r1.4 --- readlink.c 27 Jul 2004 15:00:48 -0000 1.3 +++ readlink.c 27 Aug 2004 18:11:24 -0000 1.4 @@ -45,6 +45,7 @@ #include <errno.h> #include <assert.h> #include <sys/types.h> +#include <sys/stat.h> #include <sys/queue.h> #include "sysio.h" @@ -58,6 +59,7 @@ SYSIO_INTERFACE_NAME(readlink)(const cha int err; struct pnode *pno; struct inode *ino; + struct intnl_stat stbuf; SYSIO_INTERFACE_DISPLAY_BLOCK; SYSIO_INTERFACE_ENTER; @@ -66,6 +68,13 @@ SYSIO_INTERFACE_NAME(readlink)(const cha if (err) goto out; ino = pno->p_base->pb_ino; + err = (*ino->i_ops.inop_getattr)(pno, ino, &stbuf); + if (err) + goto error; + if (!S_ISLNK(stbuf.st_mode)) { + err = -EINVAL; + goto error; + } err = (*ino->i_ops.inop_readlink)(pno, buf, bufsiz); if (err) goto error; @@ -73,7 +82,7 @@ SYSIO_INTERFACE_NAME(readlink)(const cha error: P_RELE(pno); out: - SYSIO_INTERFACE_RETURN(err, err >= 0 ? 0 : err); + SYSIO_INTERFACE_RETURN(err < 0 ? -1 : err, err >= 0 ? 0 : err); } #ifdef REDSTORM |