X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Fsymlink.c;h=2a31e372862203bb84efacbb38de84a9326fac9b;hb=a97e4898ad9e0b65f457b01bdfa954f7d7cd272d;hp=a90aba07997db870a3e8056a3537ec67378d6607;hpb=58fa00472edb92e5cef936727774625b47e70ec3;p=fs%2Flustre-release.git diff --git a/libsysio/src/symlink.c b/libsysio/src/symlink.c index a90aba0..2a31e37 100644 --- a/libsysio/src/symlink.c +++ b/libsysio/src/symlink.c @@ -9,7 +9,7 @@ * terms of the GNU Lesser General Public License * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html) * - * Cplant(TM) Copyright 1998-2003 Sandia Corporation. + * Cplant(TM) Copyright 1998-2006 Sandia Corporation. * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive * license for use of this work by or on behalf of the US Government. * Export of this program may require a license from the United States @@ -64,18 +64,22 @@ SYSIO_INTERFACE_NAME(symlink)(const char *oldpath, const char *newpath) SYSIO_INTERFACE_ENTER; INTENT_INIT(&intent, INT_CREAT, NULL, NULL); - err = _sysio_namei(_sysio_cwd, newpath, ND_NEGOK, &intent, &pno); + err = + _sysio_namei(_sysio_cwd, + newpath, + ND_NOFOLLOW|ND_NEGOK, + &intent, + &pno); if (err) goto out; if (pno->p_base->pb_ino) { err = -EEXIST; goto error; } - - if (IS_RDONLY(pno, pno->p_base->pb_ino)) { - err = -EROFS; + err = _sysio_permitted(pno->p_parent, W_OK); + if (err) goto error; - } + /* * Use the parent node operations to request the task in case the * driver is implemented using differentiated inode operations based