X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=mp4.c;h=fc74327138d8f9a3b4beb2adde0d1232fa9e3958;hb=3a4eba0d52abd4eaf9b0aa81f49ab78b7b6b34e2;hp=576f15741e251b12f9858745ea2333443b31b825;hpb=6371cda6965da1f42b1b634dd930fbec233916ad;p=paraslash.git diff --git a/mp4.c b/mp4.c index 576f1574..fc743271 100644 --- a/mp4.c +++ b/mp4.c @@ -644,8 +644,7 @@ static int32_t mp4ff_read_esds(mp4ff_t * f) f->track[f->total_tracks - 1]->decoderConfigLen = mp4ff_read_mp4_descr_length(f); - if (f->track[f->total_tracks - 1]->decoderConfig) - free(f->track[f->total_tracks - 1]->decoderConfig); + free(f->track[f->total_tracks - 1]->decoderConfig); f->track[f->total_tracks - 1]->decoderConfig = para_malloc(f->track[f->total_tracks - 1]->decoderConfigLen); if (f->track[f->total_tracks - 1]->decoderConfig) { @@ -771,31 +770,18 @@ static int32_t mp4ff_tag_add_field(mp4ff_metadata_t * tags, const char *item, tags->tags = (mp4ff_tag_t *) realloc(tags->tags, (tags->count + 1) * sizeof (mp4ff_tag_t)); if (!tags->tags) { - if (backup) - free(backup); + free(backup); return 0; } else { - tags->tags[tags->count].item = strdup(item); + tags->tags[tags->count].item = para_strdup(item); tags->tags[tags->count].len = len; if (len >= 0) { tags->tags[tags->count].value = para_malloc(len + 1); memcpy(tags->tags[tags->count].value, value, len); tags->tags[tags->count].value[len] = 0; } else { - tags->tags[tags->count].value = strdup(value); + tags->tags[tags->count].value = para_strdup(value); } - - if (!tags->tags[tags->count].item || !tags->tags[tags->count].value) { - if (!tags->tags[tags->count].item) - free(tags->tags[tags->count].item); - if (!tags->tags[tags->count].value) - free(tags->tags[tags->count].value); - tags->tags[tags->count].item = NULL; - tags->tags[tags->count].value = NULL; - tags->tags[tags->count].len = 0; - return 0; - } - tags->count++; return 1; } @@ -962,8 +948,7 @@ static int32_t mp4ff_set_metadata_name(const uint8_t atom_type, char **name) break; } - *name = strdup(tag_names[tag_idx]); - + *name = para_strdup(tag_names[tag_idx]); return 0; } @@ -972,88 +957,82 @@ static int32_t mp4ff_parse_tag(mp4ff_t * f, const uint8_t parent_atom_type, { uint8_t atom_type; uint8_t header_size = 0; - uint64_t subsize, sumsize = 0; + uint64_t subsize, sumsize; char *name = NULL; char *data = NULL; uint32_t done = 0; uint32_t len = 0; + uint64_t destpos; - while (sumsize < size && !f->stream->read_error) { /* CVE-2017-9222 */ - uint64_t destpos; + for ( + sumsize = 0; + sumsize < size && !f->stream->read_error; /* CVE-2017-9222 */ + mp4ff_set_position(f, destpos), sumsize += subsize + ) { subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); destpos = mp4ff_position(f) + subsize - header_size; if (done) continue; - if (atom_type == ATOM_DATA) { + if (atom_type == ATOM_NAME) { mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ - mp4ff_read_int32(f); /* reserved */ - - /* some need special attention */ - if (parent_atom_type == ATOM_GENRE2 || parent_atom_type == ATOM_TEMPO) { - if (subsize - header_size >= 8 + 2) { - uint16_t val = mp4ff_read_int16(f); - - if (parent_atom_type == ATOM_TEMPO) { - char temp[16]; - sprintf(temp, - "%.5u BPM", - val); - mp4ff_tag_add_field(&(f-> tags), "tempo", temp, -1); - } else { - const char *temp = mp4ff_meta_index_to_genre(val); - if (temp) { - mp4ff_tag_add_field (&(f->tags), "genre", temp, -1); - } - } - done = 1; + free(name); + name = mp4ff_read_string(f, (uint32_t) (subsize - (header_size + 4))); + continue; + } + if (atom_type != ATOM_DATA) + continue; + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + mp4ff_read_int32(f); /* reserved */ + + /* some need special attention */ + if (parent_atom_type == ATOM_GENRE2 || parent_atom_type == ATOM_TEMPO) { + if (subsize - header_size >= 8 + 2) { + uint16_t val = mp4ff_read_int16(f); + + if (parent_atom_type == ATOM_TEMPO) { + char temp[16]; + sprintf(temp, "%.5u BPM", val); + mp4ff_tag_add_field(&(f-> tags), "tempo", temp, -1); + } else { + const char *temp = mp4ff_meta_index_to_genre(val); + if (temp) + mp4ff_tag_add_field (&(f->tags), "genre", temp, -1); } - } else if (parent_atom_type == ATOM_TRACK || parent_atom_type == ATOM_DISC) { - if (!done && (subsize - header_size) >= (sizeof (char) + sizeof (uint8_t) * 3 + sizeof (uint32_t) + /* version + flags + reserved */ - +(parent_atom_type == ATOM_TRACK ? sizeof (uint16_t) : 0) /* leading uint16_t if ATOM_TRACK */ - +sizeof (uint16_t) /* track / disc */ - +sizeof (uint16_t)) /* totaltracks / totaldiscs */) { - uint16_t index, total; - char temp[32]; + done = 1; + } + } else if (parent_atom_type == ATOM_TRACK || parent_atom_type == ATOM_DISC) { + if (!done && (subsize - header_size) >= (sizeof (char) + sizeof (uint8_t) * 3 + sizeof (uint32_t) + /* version + flags + reserved */ + +(parent_atom_type == ATOM_TRACK ? sizeof (uint16_t) : 0) /* leading uint16_t if ATOM_TRACK */ + +sizeof (uint16_t) /* track / disc */ + +sizeof (uint16_t)) /* totaltracks / totaldiscs */) { + uint16_t index, total; + char temp[32]; + mp4ff_read_int16(f); + index = mp4ff_read_int16(f); + total = mp4ff_read_int16(f); + if (parent_atom_type == ATOM_TRACK) mp4ff_read_int16(f); - index = mp4ff_read_int16(f); - total = mp4ff_read_int16(f); - if (parent_atom_type == ATOM_TRACK) - mp4ff_read_int16(f); - - sprintf(temp, "%d", index); - mp4ff_tag_add_field(&(f->tags), parent_atom_type == ATOM_TRACK ? - "track" : "disc", temp, -1); - if (total > 0) { - sprintf(temp, "%d", - total); - mp4ff_tag_add_field(& (f-> tags), - parent_atom_type == ATOM_TRACK? - "totaltracks" : "totaldiscs", temp, -1); - } - done = 1; - } - } else { - if (data) { - free(data); - data = NULL; + + sprintf(temp, "%d", index); + mp4ff_tag_add_field(&(f->tags), parent_atom_type == ATOM_TRACK ? + "track" : "disc", temp, -1); + if (total > 0) { + sprintf(temp, "%d", + total); + mp4ff_tag_add_field(& (f-> tags), + parent_atom_type == ATOM_TRACK? + "totaltracks" : "totaldiscs", temp, -1); } - data = mp4ff_read_string(f, (uint32_t) (subsize - (header_size + 8))); - len = (uint32_t) (subsize - (header_size + 8)); - } - } else if (atom_type == ATOM_NAME) { - if (!done) { - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - if (name) - free(name); - name = mp4ff_read_string(f, (uint32_t) (subsize - (header_size + 4))); + done = 1; } + } else { + free(data); + data = mp4ff_read_string(f, (uint32_t) (subsize - (header_size + 8))); + len = (uint32_t) (subsize - (header_size + 8)); } - mp4ff_set_position(f, destpos); - sumsize += subsize; } - if (data) { if (!done) { if (name == NULL) @@ -1064,10 +1043,10 @@ static int32_t mp4ff_parse_tag(mp4ff_t * f, const uint8_t parent_atom_type, free(data); } - if (name) - free(name); + free(name); return 1; } + static int32_t mp4ff_read_mdhd(mp4ff_t * f) { uint32_t version; @@ -1288,15 +1267,10 @@ static int32_t mp4ff_tag_delete(mp4ff_metadata_t * tags) uint32_t i; for (i = 0; i < tags->count; i++) { - if (tags->tags[i].item) - free(tags->tags[i].item); - if (tags->tags[i].value) - free(tags->tags[i].value); + free(tags->tags[i].item); + free(tags->tags[i].value); } - - if (tags->tags) - free(tags->tags); - + free(tags->tags); tags->tags = NULL; tags->count = 0; @@ -1309,34 +1283,22 @@ void mp4ff_close(mp4ff_t * ff) for (i = 0; i < ff->total_tracks; i++) { if (ff->track[i]) { - if (ff->track[i]->stsz_table) - free(ff->track[i]->stsz_table); - if (ff->track[i]->stts_sample_count) - free(ff->track[i]->stts_sample_count); - if (ff->track[i]->stts_sample_delta) - free(ff->track[i]->stts_sample_delta); - if (ff->track[i]->stsc_first_chunk) - free(ff->track[i]->stsc_first_chunk); - if (ff->track[i]->stsc_samples_per_chunk) - free(ff->track[i]->stsc_samples_per_chunk); - if (ff->track[i]->stsc_sample_desc_index) - free(ff->track[i]->stsc_sample_desc_index); - if (ff->track[i]->stco_chunk_offset) - free(ff->track[i]->stco_chunk_offset); - if (ff->track[i]->decoderConfig) - free(ff->track[i]->decoderConfig); - if (ff->track[i]->ctts_sample_count) - free(ff->track[i]->ctts_sample_count); - if (ff->track[i]->ctts_sample_offset) - free(ff->track[i]->ctts_sample_offset); + free(ff->track[i]->stsz_table); + free(ff->track[i]->stts_sample_count); + free(ff->track[i]->stts_sample_delta); + free(ff->track[i]->stsc_first_chunk); + free(ff->track[i]->stsc_samples_per_chunk); + free(ff->track[i]->stsc_sample_desc_index); + free(ff->track[i]->stco_chunk_offset); + free(ff->track[i]->decoderConfig); + free(ff->track[i]->ctts_sample_count); + free(ff->track[i]->ctts_sample_offset); free(ff->track[i]); } } mp4ff_tag_delete(&(ff->tags)); - - if (ff) - free(ff); + free(ff); } static int32_t mp4ff_chunk_of_sample(const mp4ff_t * f, const int32_t track, @@ -1500,8 +1462,8 @@ int32_t mp4ff_meta_get_by_index(const mp4ff_t * f, uint32_t index, *value = NULL; return 0; } else { - *item = strdup(f->tags.tags[index].item); - *value = strdup(f->tags.tags[index].value); + *item = para_strdup(f->tags.tags[index].item); + *value = para_strdup(f->tags.tags[index].value); return 1; } } @@ -1773,8 +1735,7 @@ static unsigned membuffer_error(const membuffer * buf) static void membuffer_free(membuffer * buf) { - if (buf->data) - free(buf->data); + free(buf->data); free(buf); } @@ -2191,7 +2152,7 @@ static int32_t mp4ff_meta_find_by_name(const mp4ff_t * f, const char *item, for (i = 0; i < f->tags.count; i++) { if (!stricmp(f->tags.tags[i].item, item)) { - *value = strdup(f->tags.tags[i].value); + *value = para_strdup(f->tags.tags[i].value); return 1; } }