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/src | |
| 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/src')
| -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;  }  | 
