From 4703fc724a5b5070fa0fce5204015faaf38858f1 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Fri, 17 Jul 2015 10:39:02 +0200 Subject: nfs: a unix-domain-socket should not be created as fifo Cherry picked from commit 381afd4f480533f212e1f62a0ccfd9dcf7248e17: > Change-Id: Ic6a23165df1703b330636a059967c3c674dbde57 > BUG: 1235231 > Signed-off-by: Niels de Vos > Reviewed-on: http://review.gluster.org/11355 > Tested-by: NetBSD Build System > Reviewed-by: Kaleb KEITHLEY > Tested-by: Gluster Build System Change-Id: Ic6a23165df1703b330636a059967c3c674dbde57 BUG: 1244118 Signed-off-by: Niels de Vos Reviewed-on: http://review.gluster.org/11710 Tested-by: Gluster Build System Reviewed-by: Kaleb KEITHLEY --- tests/bugs/nfs/socket-as-fifo.py | 33 +++++++++++++++++++++++++++++++++ tests/bugs/nfs/socket-as-fifo.t | 22 ++++++++++++++++++++++ xlators/nfs/server/src/nfs3.c | 15 ++++++++------- 3 files changed, 63 insertions(+), 7 deletions(-) create mode 100755 tests/bugs/nfs/socket-as-fifo.py create mode 100644 tests/bugs/nfs/socket-as-fifo.t 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 +# + +import os +import stat +import sys +import socket + +ret = 1 + +if len(sys.argv) != 2: + print 'Usage: %s ' % (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 0fea135c784..22f2345a419 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -3030,7 +3030,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) @@ -3126,7 +3126,7 @@ nfs3err: } -int +static int nfs3_mknod_device (nfs3_call_state_t *cs) { int ret = -EFAULT; @@ -3157,12 +3157,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; @@ -3181,7 +3180,7 @@ nfs3_mknod_fifo (nfs3_call_state_t *cs) } -int +static int nfs3_mknod_resume (void *carg) { nfsstat3 stat = NFS3ERR_SERVERFAULT; @@ -3200,8 +3199,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; -- cgit