Corrected memory management flaws found by Joris Dobbelsteen

This commit is contained in:
Thomas Schmitt 2007-08-25 08:58:41 +00:00
parent a70f0b4a85
commit 3e432c0341
6 changed files with 64 additions and 8 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2007.08.22.173459" #define Cdrskin_timestamP "2007.08.25.085709"

View File

@ -100,7 +100,7 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
fd1 = open(path, O_RDONLY); fd1 = open(path, O_RDONLY);
if (fd1 == -1) if (fd1 == -1)
return NULL; return NULL;
if (subpath) { if (subpath != NULL) {
fd2 = open(subpath, O_RDONLY); fd2 = open(subpath, O_RDONLY);
if (fd2 == -1) { if (fd2 == -1) {
close(fd1); close(fd1);
@ -108,6 +108,16 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
} }
} }
fs = malloc(sizeof(struct burn_source_file)); fs = malloc(sizeof(struct burn_source_file));
/* ts A70825 */
if (fs == NULL) {
failure:;
close(fd1);
if (subpath != NULL)
close(fd2);
return NULL;
}
fs->datafd = fd1; fs->datafd = fd1;
if (subpath) if (subpath)
@ -117,6 +127,13 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
fs->fixed_size = 0; fs->fixed_size = 0;
src = burn_source_new(); src = burn_source_new();
/* ts A70825 */
if (src == NULL) {
free((char *) fs);
goto failure;
}
src->read = file_read; src->read = file_read;
if (subpath) if (subpath)
src->read_sub = file_read_sub; src->read_sub = file_read_sub;
@ -139,11 +156,20 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size)
if (datafd == -1) if (datafd == -1)
return NULL; return NULL;
fs = malloc(sizeof(struct burn_source_file)); fs = malloc(sizeof(struct burn_source_file));
if (fs == NULL) /* ts A70825 */
return NULL;
fs->datafd = datafd; fs->datafd = datafd;
fs->subfd = subfd; fs->subfd = subfd;
fs->fixed_size = size; fs->fixed_size = size;
src = burn_source_new(); src = burn_source_new();
/* ts A70825 */
if (src == NULL) {
free((char *) fs);
return NULL;
}
src->read = file_read; src->read = file_read;
if(subfd != -1) if(subfd != -1)
src->read = file_read_sub; src->read = file_read_sub;

View File

@ -1127,7 +1127,9 @@ int burn_msf_to_lba(int m, int s, int f);
*/ */
void burn_lba_to_msf(int lba, int *m, int *s, int *f); void burn_lba_to_msf(int lba, int *m, int *s, int *f);
/** Create a new disc */ /** Create a new disc
@return Pointer to a burn_disc object or NULL on failure.
*/
struct burn_disc *burn_disc_create(void); struct burn_disc *burn_disc_create(void);
/** Delete disc and decrease the reference count on all its sessions /** Delete disc and decrease the reference count on all its sessions
@ -1135,7 +1137,9 @@ struct burn_disc *burn_disc_create(void);
*/ */
void burn_disc_free(struct burn_disc *d); void burn_disc_free(struct burn_disc *d);
/** Create a new session */ /** Create a new session
@return Pointer to a burn_session object or NULL on failure.
*/
struct burn_session *burn_session_create(void); struct burn_session *burn_session_create(void);
/** Free a session (and decrease reference count on all tracks inside) /** Free a session (and decrease reference count on all tracks inside)
@ -1264,7 +1268,12 @@ int burn_track_set_default_size(struct burn_track *t, off_t size);
*/ */
void burn_source_free(struct burn_source *s); void burn_source_free(struct burn_source *s);
/** Creates a data source for an image file (and maybe subcode file) */ /** Creates a data source for an image file (and maybe subcode file)
@param path The file address for the main channel payload.
@param subpath Eventual address for subchannel data. Only used in exotic
raw write modes. Submit NULL for normal tasks.
@return Pointer to a burn_source object, NULL indicates failure
*/
struct burn_source *burn_file_source_new(const char *path, struct burn_source *burn_file_source_new(const char *path,
const char *subpath); const char *subpath);
@ -1272,9 +1281,11 @@ struct burn_source *burn_file_source_new(const char *path,
readable filedescriptor, an eventually open readable subcodes file readable filedescriptor, an eventually open readable subcodes file
descriptor and eventually a fixed size in bytes. descriptor and eventually a fixed size in bytes.
@param datafd The source of data. @param datafd The source of data.
@param subfd The eventual source for subcodes. Not used if -1. @param subfd The eventual source of subchannel data. Only used in exotic
raw write modes. Submit -1 for normal tasks.
@param size The eventual fixed size of eventually both fds. @param size The eventual fixed size of eventually both fds.
If this value is 0, the size will be determined from datafd. If this value is 0, the size will be determined from datafd.
@return Pointer to a burn_source object, NULL indicates failure
*/ */
struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size); struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size);

View File

@ -960,8 +960,9 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
d->toc_entries = 0; d->toc_entries = 0;
/* Prefering memory leaks over fandangos */ /* Prefering memory leaks over fandangos */
d->toc_entry = malloc(sizeof(struct burn_toc_entry)); d->toc_entry = malloc(sizeof(struct burn_toc_entry));
memset(&(d->toc_entry[0]), 0, sizeof(struct burn_toc_entry)); if (d->toc_entry != NULL) /* ts A70825 */
memset(&(d->toc_entry[0]), 0,
sizeof(struct burn_toc_entry));
return 0; return 0;
} }
@ -982,6 +983,8 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
a ssert(((dlen - 2) % 11) == 0); a ssert(((dlen - 2) % 11) == 0);
*/ */
d->toc_entry = malloc(d->toc_entries * sizeof(struct burn_toc_entry)); d->toc_entry = malloc(d->toc_entries * sizeof(struct burn_toc_entry));
if(d->toc_entry == NULL) /* ts A70825 */
return 0;
for (i = 0; i < d->toc_entries; i++) for (i = 0; i < d->toc_entries; i++)
memset(&(d->toc_entry[i]), 0, sizeof(struct burn_toc_entry)); memset(&(d->toc_entry[i]), 0, sizeof(struct burn_toc_entry));
tdata = c.page->data + 4; tdata = c.page->data + 4;
@ -989,9 +992,13 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
burn_print(12, "TOC:\n"); burn_print(12, "TOC:\n");
d->disc = burn_disc_create(); d->disc = burn_disc_create();
if (d->disc == NULL) /* ts A70825 */
return 0;
for (i = 0; i < c.page->data[3]; i++) { for (i = 0; i < c.page->data[3]; i++) {
session = burn_session_create(); session = burn_session_create();
if (session == NULL) /* ts A70825 */
return 0;
burn_disc_add_session(d->disc, session, BURN_POS_END); burn_disc_add_session(d->disc, session, BURN_POS_END);
burn_session_free(session); burn_session_free(session);
} }

View File

@ -34,6 +34,12 @@ struct burn_source *burn_source_new(void)
struct burn_source *out; struct burn_source *out;
out = calloc(1, sizeof(struct burn_source)); out = calloc(1, sizeof(struct burn_source));
/* ts A70825 */
if (out == NULL)
return NULL;
memset((char *) out, 0, sizeof(struct burn_source));
out->refcount = 1; out->refcount = 1;
return out; return out;
} }

View File

@ -40,6 +40,8 @@ struct burn_disc *burn_disc_create(void)
{ {
struct burn_disc *d; struct burn_disc *d;
d = calloc(1, sizeof(struct burn_disc)); d = calloc(1, sizeof(struct burn_disc));
if (d == NULL) /* ts A70825 */
return NULL;
d->refcnt = 1; d->refcnt = 1;
d->sessions = 0; d->sessions = 0;
d->session = NULL; d->session = NULL;
@ -64,6 +66,8 @@ struct burn_session *burn_session_create(void)
{ {
struct burn_session *s; struct burn_session *s;
s = calloc(1, sizeof(struct burn_session)); s = calloc(1, sizeof(struct burn_session));
if (s == NULL) /* ts A70825 */
return NULL;
s->refcnt = 1; s->refcnt = 1;
s->tracks = 0; s->tracks = 0;
s->track = NULL; s->track = NULL;
@ -104,6 +108,8 @@ struct burn_track *burn_track_create(void)
{ {
struct burn_track *t; struct burn_track *t;
t = calloc(1, sizeof(struct burn_track)); t = calloc(1, sizeof(struct burn_track));
if (t == NULL) /* ts A70825 */
return NULL;
t->refcnt = 1; t->refcnt = 1;
t->indices = 0; t->indices = 0;
t->offset = 0; t->offset = 0;