diff options
author | Krishnan Parthasarathi <kparthas@redhat.com> | 2013-03-20 23:01:39 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2013-03-22 13:34:29 -0700 |
commit | 71496826955cacac37abfd5fd017340a04988971 (patch) | |
tree | 93ab5aaa9896a680aa13969d19fe15c0f5b196a5 /libglusterfs | |
parent | e0e34d04aa68ac154818b55e7c337607fb141971 (diff) |
glusterfsd: Fixed fd leak due to use of tmpfile()
Change-Id: I3c2dc070ebe967100170e39f3545acacc6016d61
BUG: 924075
Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-on: http://review.gluster.org/4703
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/graph.y | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/libglusterfs/src/graph.y b/libglusterfs/src/graph.y index a640f240215..92267c4c743 100644 --- a/libglusterfs/src/graph.y +++ b/libglusterfs/src/graph.y @@ -553,52 +553,54 @@ glusterfs_graph_t * glusterfs_graph_construct (FILE *fp) { int ret = 0; + int tmp_fd = -1; glusterfs_graph_t *graph = NULL; - FILE *tmp_file = NULL; + FILE *tmp_file = NULL; + char template[PATH_MAX] = {0}; graph = glusterfs_graph_new (); if (!graph) - return NULL; + goto err; - tmp_file = tmpfile (); + strcpy (template, "/tmp/tmp.XXXXXX"); + tmp_fd = mkstemp (template); + if (-1 == tmp_fd) + goto err; - if (tmp_file == NULL) { - gf_log ("parser", GF_LOG_ERROR, - "cannot create temporary file"); + tmp_file = fdopen (tmp_fd, "w+b"); + if (!tmp_file) + goto err; - glusterfs_graph_destroy (graph); - return NULL; - } - - ret = preprocess (fp, tmp_file); - if (ret < 0) { - gf_log ("parser", GF_LOG_ERROR, - "parsing of backticks failed"); - - glusterfs_graph_destroy (graph); - fclose (tmp_file); - return NULL; - } + ret = preprocess (fp, tmp_file); + if (ret < 0) { + gf_log ("parser", GF_LOG_ERROR, "parsing of backticks failed"); + goto err; + } yyin = tmp_file; - construct = graph; - ret = yyparse (); - construct = NULL; - fclose (tmp_file); - if (ret == 1) { gf_log ("parser", GF_LOG_DEBUG, - "parsing of volfile failed, please review it " - "once more"); - - glusterfs_graph_destroy (graph); - return NULL; + "parsing of volfile failed, please review it " + "once more"); + goto err; } + fclose (tmp_file); return graph; +err: + if (tmp_file) { + fclose (tmp_file); + } else { + gf_log ("parser", GF_LOG_ERROR, "cannot create temporary file"); + if (-1 != tmp_fd) + close (tmp_fd); + } + + glusterfs_graph_destroy (graph); + return NULL; } |