diff --git a/lib/airplay_video.c b/lib/airplay_video.c index 2656666..1b1c761 100644 --- a/lib/airplay_video.c +++ b/lib/airplay_video.c @@ -511,9 +511,11 @@ char *adjust_master_playlist (char *fcup_response_data, int fcup_response_datale size_t len = uri_local_prefix_len - uri_prefix_len; len *= counter; - len += fcup_response_datalen; - char *new_master = (char *) malloc(len + 1); - *(new_master + len) = '\0'; + len += fcup_response_datalen; + int byte_count = 0; + int new_len = (int) len; + char *new_master = (char *) malloc(new_len + 1); + new_master[new_len] = '\0'; char *first = fcup_response_data; char *new = new_master; char *last = strstr(first, uri_prefix); @@ -522,17 +524,21 @@ char *adjust_master_playlist (char *fcup_response_data, int fcup_response_datale counter++; len = last - first; memcpy(new, first, len); - first = last + uri_prefix_len; + byte_count += len; + first = last + uri_prefix_len; new += len; memcpy(new, uri_local_prefix, uri_local_prefix_len); + byte_count += uri_local_prefix_len; new += uri_local_prefix_len; last = strstr(last + uri_prefix_len, uri_prefix); - if (last == NULL) { + if (last == NULL) { len = fcup_response_data + fcup_response_datalen - first; memcpy(new, first, len); + byte_count += len; break; - } + } } + assert(byte_count == new_len); return new_master; } @@ -623,10 +629,12 @@ char *adjust_yt_condensed_playlist(const char *media_playlist) { } size_t old_size = strlen(media_playlist); - size_t new_size = old_size; - new_size += count * (base_uri_len + params_len); - - char * new_playlist = (char *) calloc( new_size + 100, sizeof(char)); + size_t new_len = old_size; + new_len += count * (base_uri_len + params_len); + + int byte_count = 0; + char * new_playlist = (char *) malloc(new_len + 1); + new_playlist[new_len] = '\0'; const char *old_pos = media_playlist; char *new_pos = new_playlist; ptr = old_pos; @@ -634,6 +642,7 @@ char *adjust_yt_condensed_playlist(const char *media_playlist) { size_t len = ptr - old_pos; /* copy header section before chunks */ memcpy(new_pos, old_pos, len); + byte_count += len; old_pos += len; new_pos += len; while (ptr) { @@ -643,11 +652,13 @@ char *adjust_yt_condensed_playlist(const char *media_playlist) { len = start - ptr; /* copy first line of chunk entry */ memcpy(new_pos, old_pos, len); + byte_count += len; old_pos += len; new_pos += len; /* copy base uri to replace prefix*/ memcpy(new_pos, base_uri, base_uri_len); + byte_count += base_uri_len; new_pos += base_uri_len; old_pos += prefix_len; ptr = strstr(old_pos, "#EXTINF:"); @@ -664,16 +675,20 @@ char *adjust_yt_condensed_playlist(const char *media_playlist) { end = strstr(end, "#EXT"); } *new_pos = '/'; + byte_count++; new_pos++; memcpy(new_pos, params_start[i], params_size[i]); + byte_count += params_size[i]; new_pos += params_size[i]; *new_pos = '/'; + byte_count++; new_pos++; len = end - old_pos; end++; memcpy (new_pos, old_pos, len); + byte_count += len; new_pos += len; old_pos += len; if (i != last) { @@ -685,10 +700,11 @@ char *adjust_yt_condensed_playlist(const char *media_playlist) { len = media_playlist + strlen(media_playlist) - old_pos; memcpy(new_pos, old_pos, len); + byte_count += len; new_pos += len; old_pos += len; - new_playlist[new_size] = '\0'; + assert(byte_count == new_len); free (prefix); free (base_uri);