diff options
-rwxr-xr-x | tests/bugs/nfs/socket-as-fifo.py | 33 | ||||
-rw-r--r-- | tests/bugs/nfs/socket-as-fifo.t | 22 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs3.c | 15 |
3 files changed, 63 insertions, 7 deletions
diff --git a/tests/bugs/nfs/socket-as-fifo.py b/tests/bugs/nfs/socket-as-fifo.py new file mode 100755 index 00000000000..1fce5b96896 --- /dev/null +++ b/tests/bugs/nfs/socket-as-fifo.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# +# Create a unix domain socket and test if it is a socket (and not a fifo/pipe). +# +# Author: Niels de Vos <ndevos@redhat.com> +# + +import os +import stat +import sys +import socket + +ret = 1 + +if len(sys.argv) != 2: + print 'Usage: %s <socket>' % (sys.argv[0]) + sys.exit(ret) + +path = sys.argv[1] + +sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) +sock.bind(path) + +stbuf = os.stat(path) +mode = stbuf.st_mode + +if stat.S_ISSOCK(mode): + ret = 0 + +sock.close() +os.unlink(path) + +sys.exit(ret) diff --git a/tests/bugs/nfs/socket-as-fifo.t b/tests/bugs/nfs/socket-as-fifo.t new file mode 100644 index 00000000000..94a800a2ceb --- /dev/null +++ b/tests/bugs/nfs/socket-as-fifo.t @@ -0,0 +1,22 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../nfs.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/$V0 +TEST $CLI volume start $V0 +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; +TEST mount_nfs $H0:/$V0 $N0 nolock + +# this is the actual test +TEST $(dirname $0)/socket-as-fifo.py $N0/not-a-fifo.socket + +TEST umount_nfs $N0 + +cleanup diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index a239d289d13..b4f95cae993 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -3153,7 +3153,7 @@ rpcerr: } -int +static int nfs3_mknod_reply (rpcsvc_request_t *req, nfsstat3 stat, struct nfs3_fh *fh, struct iatt *buf, struct iatt *preparent, struct iatt *postparent) @@ -3249,7 +3249,7 @@ nfs3err: } -int +static int nfs3_mknod_device (nfs3_call_state_t *cs) { int ret = -EFAULT; @@ -3280,12 +3280,11 @@ nfs3_mknod_device (nfs3_call_state_t *cs) } -int -nfs3_mknod_fifo (nfs3_call_state_t *cs) +static int +nfs3_mknod_fifo (nfs3_call_state_t *cs, mode_t mode) { int ret = -EFAULT; nfs_user_t nfu = {0, }; - mode_t mode = S_IFIFO; if (!cs) return ret; @@ -3304,7 +3303,7 @@ nfs3_mknod_fifo (nfs3_call_state_t *cs) } -int +static int nfs3_mknod_resume (void *carg) { nfsstat3 stat = NFS3ERR_SERVERFAULT; @@ -3323,8 +3322,10 @@ nfs3_mknod_resume (void *carg) ret = nfs3_mknod_device (cs); break; case NF3SOCK: + ret = nfs3_mknod_fifo (cs, S_IFSOCK); + break; case NF3FIFO: - ret = nfs3_mknod_fifo (cs); + ret = nfs3_mknod_fifo (cs, S_IFIFO); break; default: ret = -EBADF; |