fix memory leaks

This commit is contained in:
Alexandre Ratchov 2012-10-15 18:43:34 +02:00
parent 61c00bcef2
commit 3edbce0c18
7 changed files with 47 additions and 5 deletions

View File

@ -73,10 +73,11 @@ listen_close(struct listen *f)
if (f->path != NULL) {
unlink(f->path);
free(f->path);
xfree(f->path);
}
file_del(f->file);
close(f->fd);
xfree(f);
}
void
@ -108,7 +109,7 @@ listen_new_un(char *path)
f->file = file_new(&listen_fileops, f, path, 1);
if (f->file == NULL)
goto bad_close;
f->path = strdup(path);
f->path = xstrdup(path);
if (f->path == NULL) {
perror("strdup");
exit(1);

View File

@ -350,7 +350,7 @@ midi_out(struct midi *oep, unsigned char *idata, int icount)
void
port_log(struct port *p)
{
log_puts(p->path);
midi_log(p->midi);
}
#endif
@ -440,8 +440,15 @@ int
port_open(struct port *c)
{
c->mio = miofile_new(c);
if (c->mio == NULL)
if (c->mio == NULL) {
if (log_level >= 1) {
port_log(c);
log_puts(": ");
log_puts(c->path);
log_puts(": failed to open midi port\n");
}
return 0;
}
c->state = PORT_INIT;
return 1;
}

View File

@ -119,3 +119,20 @@ opt_byname(char *name, unsigned int num)
}
return NULL;
}
void
opt_del(struct opt *o)
{
struct opt **po;
for (po = &opt_list; *po != o; po = &(*po)->next) {
#ifdef DEBUG
if (*po == NULL) {
log_puts("opt_del: not on list\n");
panic();
}
#endif
}
*po = o->next;
xfree(o);
}

View File

@ -36,7 +36,7 @@ extern struct opt *opt_list;
struct opt *opt_new(char *, struct dev *, int, int, int, int,
int, int, int, unsigned int);
int opt_bind(struct opt *);
void opt_del(struct opt *);
struct opt *opt_byname(char *, unsigned int);
#endif /* !defined(OPT_H) */

View File

@ -471,6 +471,8 @@ main(int argc, char **argv)
listen_close(listen_list);
while (sock_list != NULL)
sock_close(sock_list);
while (opt_list != NULL)
opt_del(opt_list);
for (d = dev_list; d != NULL; d = d->next)
dev_done(d);
for (p = port_list; p != NULL; p = p->next)
@ -485,5 +487,6 @@ main(int argc, char **argv)
filelist_done();
rmdir(base);
unsetsig();
mem_stats();
return 0;
}

View File

@ -253,3 +253,15 @@ mem_stats(void)
log_puts("\n");
}
}
char *
mem_strdup(const char *s, char *tag)
{
size_t size;
void *p;
size = strlen(s) + 1;
p = mem_alloc(size, tag);
memcpy(p, s, size);
return p;
}

View File

@ -28,10 +28,12 @@ void log_flush(void);
//void *xmalloc(size_t);
void *mem_alloc(size_t, char *);
char *mem_strdup(const char *, char *);
void mem_free(void *);
void mem_stats(void);
#define xmalloc(s) (mem_alloc((s), (char *)__func__))
#define xstrdup(s) (mem_strdup((s), (char *)__func__))
#define xfree(p) (mem_free((p)))
void memrnd(void *, size_t);