diff options
-rw-r--r-- | api/src/glfs-mgmt.c | 32 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd-messages.h | 3 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 32 | ||||
-rwxr-xr-x | tests/basic/symbol-check.sh | 33 |
4 files changed, 90 insertions, 10 deletions
diff --git a/api/src/glfs-mgmt.c b/api/src/glfs-mgmt.c index 994f43c82f2..fac903b805a 100644 --- a/api/src/glfs-mgmt.c +++ b/api/src/glfs-mgmt.c @@ -582,6 +582,8 @@ glfs_mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, struct glfs *fs = NULL; dict_t *dict = NULL; char *servers_list = NULL; + int tmp_fd = -1; + char template[] = "/tmp/gfapi.volfile.XXXXXX"; frame = myframe; ctx = frame->this->ctx; @@ -668,11 +670,28 @@ volfile: goto out; } - tmpfp = tmpfile (); - if (!tmpfp) { - ret = -1; - goto out; - } + /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */ + tmp_fd = mkstemp (template); + if (-1 == tmp_fd) { + ret = -1; + goto out; + } + + /* Calling unlink so that when the file is closed or program + * terminates the temporary file is deleted. + */ + ret = sys_unlink (template); + if (ret < 0) { + gf_msg (frame->this->name, GF_LOG_INFO, 0, API_MSG_VOLFILE_INFO, + "Unable to delete file: %s", template); + ret = 0; + } + + tmpfp = fdopen (tmp_fd, "w+b"); + if (!tmpfp) { + ret = -1; + goto out; + } fwrite (rsp.spec, size, 1, tmpfp); fflush (tmpfp); @@ -706,6 +725,7 @@ volfile: ret = glfs_process_volfp (fs, tmpfp); /* tmpfp closed */ tmpfp = NULL; + tmp_fd = -1; if (ret) goto out; @@ -745,6 +765,8 @@ out: if (tmpfp) fclose (tmpfp); + else if (tmp_fd != -1) + sys_close (tmp_fd); return 0; } diff --git a/glusterfsd/src/glusterfsd-messages.h b/glusterfsd/src/glusterfsd-messages.h index 95fc79ef8d0..e7df714064a 100644 --- a/glusterfsd/src/glusterfsd-messages.h +++ b/glusterfsd/src/glusterfsd-messages.h @@ -61,7 +61,8 @@ GLFS_MSGID(GLUSTERFSD, glusterfsd_msg_35, glusterfsd_msg_36, glusterfsd_msg_37, - glusterfsd_msg_38 + glusterfsd_msg_38, + glusterfsd_msg_39 ); #endif /* !_GLUSTERFSD_MESSAGES_H_ */ diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index e954c1f3d33..bf56bc0abfa 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -1901,6 +1901,8 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, char sha256_hash[SHA256_DIGEST_LENGTH] = {0, }; dict_t *dict = NULL; char *servers_list = NULL; + int tmp_fd = -1; + char template[] = "/tmp/glfs.volfile.XXXXXX"; frame = myframe; ctx = frame->this->ctx; @@ -1990,7 +1992,32 @@ volfile: } } - tmpfp = tmpfile (); + /* coverity[secure_temp] mkstemp uses 0600 as the mode and is + * safe + */ + tmp_fd = mkstemp (template); + if (-1 == tmp_fd) { + gf_msg (frame->this->name, GF_LOG_ERROR, 0, + glusterfsd_msg_39, + "Unable to create temporary file: %s", + template); + ret = -1; + goto out; + } + + /* Calling unlink so that when the file is closed or program + * terminates the temporary file is deleted. + */ + ret = sys_unlink (template); + if (ret < 0) { + gf_msg (frame->this->name, GF_LOG_INFO, 0, + glusterfsd_msg_39, + "Unable to delete temporary file: %s", + template); + ret = 0; + } + + tmpfp = fdopen (tmp_fd, "w+b"); if (!tmpfp) { ret = -1; goto out; @@ -2036,6 +2063,7 @@ volfile: ret = glusterfs_process_volfp (ctx, tmpfp); /* tmpfp closed */ tmpfp = NULL; + tmp_fd = -1; if (ret) goto out; @@ -2103,6 +2131,8 @@ out: if (tmpfp) fclose (tmpfp); + else if (tmp_fd != -1) + sys_close (tmp_fd); return 0; } diff --git a/tests/basic/symbol-check.sh b/tests/basic/symbol-check.sh index f84d591facb..0f8243ca731 100755 --- a/tests/basic/symbol-check.sh +++ b/tests/basic/symbol-check.sh @@ -13,6 +13,8 @@ syscalls32=$'creat\nfallocate\nftruncate\n__fxstat\n__fxstatat\n\ lseek\n__lxstat\nopenat\nreaddir\nstatvfs\ntruncate\nstat\n\ preadv\npwritev\npread\npwrite' +glibccalls=$'tmpfile' + exclude_files=$'/libglusterfs/src/.libs/libglusterfs_la-syscall.o\n\ /libglusterfs/src/.libs/libglusterfs_la-gen_uuid.o\n\ /contrib/fuse-util/fusermount.o\n\ @@ -33,13 +35,14 @@ function main() done local retval=0 - local t=$(nm ${1} | grep " U " | sed -e "s/ //g" -e "s/ U //g") + local t + t=$(nm "${1}" | grep " U " | sed -e "s/ //g" -e "s/ U //g") for symy in ${t}; do for symx in ${syscalls}; do - if [[ ${symx} = ${symy} ]]; then + if [[ ${symx} = "${symy}" ]]; then case ${symx} in "creat64") sym="creat";; @@ -70,12 +73,36 @@ function main() for symx in ${syscalls32}; do - if [[ ${symx} = ${symy} ]]; then + if [[ ${symx} = "${symy}" ]]; then echo "${1} was not compiled with -D_FILE_OFFSET_BITS=64" >&2 retval=1 fi done + + symy_glibc=$(echo "${symy}" | sed -e "s/@@GLIBC.*//g") + # Eliminate false positives, check if we have a GLIBC symbol in 'y' + if [[ ${symy} != "${symy_glibc}" ]]; then + for symx in ${glibccalls}; do + + if [[ ${symx} = "${symy_glibc}" ]]; then + + case ${symx} in + "tmpfile") alt="mkstemp";; + *) alt="none";; + esac + + if [[ ${alt} = "none" ]]; then + echo "${1} should not call ${symy_glibc}"; + else + echo "${1} should use ${alt} instead of ${symy_glibc}" >&2; + fi + + retval=1 + fi + done + fi + done if [ ${retval} = 1 ]; then |