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) {
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;
}
break;
}
- *name = strdup(tag_names[tag_idx]);
-
+ *name = para_strdup(tag_names[tag_idx]);
return 0;
}
{
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);
- }
+ 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);
}
- 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];
+ 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)
free(data);
}
- if (name)
- free(name);
+ free(name);
return 1;
}
+
static int32_t mp4ff_read_mdhd(mp4ff_t * f)
{
uint32_t version;
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;
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,
*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;
}
}
static void membuffer_free(membuffer * buf)
{
- if (buf->data)
- free(buf->data);
+ free(buf->data);
free(buf);
}
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;
}
}