Fix memory leak of temporary filenames

This commit is contained in:
Eric Fischer 2016-04-26 16:32:32 -07:00
parent 235939ea23
commit 0205086886

View File

@ -87,12 +87,6 @@ static long long diskfree;
#define MAX_ZOOM 24 #define MAX_ZOOM 24
struct reader { struct reader {
char *metaname;
char *poolname;
char *treename;
char *geomname;
char *indexname;
int metafd; int metafd;
int poolfd; int poolfd;
int treefd; int treefd;
@ -1585,83 +1579,78 @@ int read_json(int argc, struct source **sourcelist, char *fname, const char *lay
for (i = 0; i < CPUS; i++) { for (i = 0; i < CPUS; i++) {
struct reader *r = reader + i; struct reader *r = reader + i;
r->metaname = malloc(strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1); char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1];
r->poolname = malloc(strlen(tmpdir) + strlen("/pool.XXXXXXXX") + 1); char poolname[strlen(tmpdir) + strlen("/pool.XXXXXXXX") + 1];
r->treename = malloc(strlen(tmpdir) + strlen("/tree.XXXXXXXX") + 1); char treename[strlen(tmpdir) + strlen("/tree.XXXXXXXX") + 1];
r->geomname = malloc(strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1); char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1];
r->indexname = malloc(strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1); char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1];
if (r->metaname == NULL || r->poolname == NULL || r->treename == NULL || r->geomname == NULL || r->indexname == NULL) { sprintf(metaname, "%s%s", tmpdir, "/meta.XXXXXXXX");
perror("Out of memory"); sprintf(poolname, "%s%s", tmpdir, "/pool.XXXXXXXX");
exit(EXIT_FAILURE); sprintf(treename, "%s%s", tmpdir, "/tree.XXXXXXXX");
} sprintf(geomname, "%s%s", tmpdir, "/geom.XXXXXXXX");
sprintf(indexname, "%s%s", tmpdir, "/index.XXXXXXXX");
sprintf(r->metaname, "%s%s", tmpdir, "/meta.XXXXXXXX"); r->metafd = mkstemp(metaname);
sprintf(r->poolname, "%s%s", tmpdir, "/pool.XXXXXXXX");
sprintf(r->treename, "%s%s", tmpdir, "/tree.XXXXXXXX");
sprintf(r->geomname, "%s%s", tmpdir, "/geom.XXXXXXXX");
sprintf(r->indexname, "%s%s", tmpdir, "/index.XXXXXXXX");
r->metafd = mkstemp(r->metaname);
if (r->metafd < 0) { if (r->metafd < 0) {
perror(r->metaname); perror(metaname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->poolfd = mkstemp(r->poolname); r->poolfd = mkstemp(poolname);
if (r->poolfd < 0) { if (r->poolfd < 0) {
perror(r->poolname); perror(poolname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->treefd = mkstemp(r->treename); r->treefd = mkstemp(treename);
if (r->treefd < 0) { if (r->treefd < 0) {
perror(r->treename); perror(treename);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->geomfd = mkstemp(r->geomname); r->geomfd = mkstemp(geomname);
if (r->geomfd < 0) { if (r->geomfd < 0) {
perror(r->geomname); perror(geomname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->indexfd = mkstemp(r->indexname); r->indexfd = mkstemp(indexname);
if (r->indexfd < 0) { if (r->indexfd < 0) {
perror(r->indexname); perror(indexname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->metafile = fopen(r->metaname, "wb"); r->metafile = fopen(metaname, "wb");
if (r->metafile == NULL) { if (r->metafile == NULL) {
perror(r->metaname); perror(metaname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->poolfile = memfile_open(r->poolfd); r->poolfile = memfile_open(r->poolfd);
if (r->poolfile == NULL) { if (r->poolfile == NULL) {
perror(r->poolname); perror(poolname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->treefile = memfile_open(r->treefd); r->treefile = memfile_open(r->treefd);
if (r->treefile == NULL) { if (r->treefile == NULL) {
perror(r->treename); perror(treename);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->geomfile = fopen(r->geomname, "wb"); r->geomfile = fopen(geomname, "wb");
if (r->geomfile == NULL) { if (r->geomfile == NULL) {
perror(r->geomname); perror(geomname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->indexfile = fopen(r->indexname, "wb"); r->indexfile = fopen(indexname, "wb");
if (r->indexfile == NULL) { if (r->indexfile == NULL) {
perror(r->indexname); perror(indexname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
r->metapos = 0; r->metapos = 0;
r->geompos = 0; r->geompos = 0;
r->indexpos = 0; r->indexpos = 0;
unlink(r->metaname); unlink(metaname);
unlink(r->poolname); unlink(poolname);
unlink(r->treename); unlink(treename);
unlink(r->geomname); unlink(geomname);
unlink(r->indexname); unlink(indexname);
// To distinguish a null value // To distinguish a null value
{ {