It avoids leaving dangling pointers behind in memory.
Also remove redundant checks for whether the URLContext to be closed is
already NULL.
Reviewed-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
cond_wakeup_main_fail:
pthread_mutex_destroy(&c->mutex);
mutex_fail:
- ffurl_close(c->inner);
+ ffurl_closep(&c->inner);
url_fail:
ring_destroy(&c->ring);
fifo_fail:
pthread_cond_destroy(&c->cond_wakeup_background);
pthread_cond_destroy(&c->cond_wakeup_main);
pthread_mutex_destroy(&c->mutex);
- ffurl_close(c->inner);
+ ffurl_closep(&c->inner);
ring_destroy(&c->ring);
return 0;
av_log(h, AV_LOG_ERROR, "Could not delete %s.\n", c->filename);
av_freep(&c->filename);
}
- ffurl_close(c->inner);
+ ffurl_closep(&c->inner);
av_tree_enumerate(c->root, NULL, NULL, enu_free);
av_tree_destroy(c->root);
struct concat_nodes *nodes = data->nodes;
for (i = 0; i != data->length; i++)
- err |= ffurl_close(nodes[i].uc);
+ err |= ffurl_closep(&nodes[i].uc);
av_freep(&data->nodes);
ret = ffurl_write(c->hd, out_buf, BLOCKSIZE);
}
- if (c->hd)
- ffurl_close(c->hd);
+ ffurl_closep(&c->hd);
av_freep(&c->aes_decrypt);
av_freep(&c->aes_encrypt);
av_freep(&c->write_buf);
static int gopher_close(URLContext *h)
{
GopherContext *s = h->priv_data;
- if (s->hd) {
- ffurl_close(s->hd);
- s->hd = NULL;
- }
+ ffurl_closep(&s->hd);
return 0;
}
free_segment_list(s);
free_variant_list(s);
- ffurl_close(s->seg_hd);
+ ffurl_closep(&s->seg_hd);
return 0;
}
return ret;
}
if (s->seg_hd) {
- ffurl_close(s->seg_hd);
- s->seg_hd = NULL;
+ ffurl_closep(&s->seg_hd);
s->cur_seq_no++;
}
reload_interval = s->n_segments > 0 ?
static int icecast_close(URLContext *h)
{
IcecastContext *s = h->priv_data;
- if (s->hd)
- ffurl_close(s->hd);
+ ffurl_closep(&s->hd);
return 0;
}
{
MMSHContext *mmsh = (MMSHContext *)h->priv_data;
MMSContext *mms = &mmsh->mms;
- if (mms->mms_hd)
- ffurl_closep(&mms->mms_hd);
+ ffurl_closep(&mms->mms_hd);
av_freep(&mms->streams);
av_freep(&mms->asf_header);
return 0;
}
// close the socket and then reopen it for sending the second play request.
- ffurl_close(mms->mms_hd);
+ ffurl_closep(&mms->mms_hd);
memset(headers, 0, sizeof(headers));
if ((err = ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ,
&h->interrupt_callback)) < 0) {
MMSContext *mms = &mmst->mms;
if(mms->mms_hd) {
send_close_packet(mmst);
- ffurl_close(mms->mms_hd);
+ ffurl_closep(&mms->mms_hd);
}
/* free all separately allocated pointers in mms */
RTMPEContext *rt = h->priv_data;
ff_dh_free(rt->dh);
- ffurl_close(rt->stream);
+ ffurl_closep(&rt->stream);
return 0;
}
}
av_freep(&rt->out_data);
- ffurl_close(rt->stream);
+ ffurl_closep(&rt->stream);
return ret;
}
free_tracked_methods(rt);
av_freep(&rt->flv_data);
- ffurl_close(rt->stream);
+ ffurl_closep(&rt->stream);
return ret;
}
if (rt->do_reconnect) {
int i;
- ffurl_close(rt->stream);
- rt->stream = NULL;
+ ffurl_closep(&rt->stream);
rt->do_reconnect = 0;
rt->nb_invokes = 0;
for (i = 0; i < 2; i++)
return 0;
fail:
- if (s->rtp_hd)
- ffurl_close(s->rtp_hd);
- if (s->rtcp_hd)
- ffurl_close(s->rtcp_hd);
+ ffurl_closep(&s->rtp_hd);
+ ffurl_closep(&s->rtcp_hd);
ffurl_closep(&s->fec_hd);
av_free(fec_protocol);
av_dict_free(&fec_opts);
ff_ip_reset_filters(&s->filters);
- ffurl_close(s->rtp_hd);
- ffurl_close(s->rtcp_hd);
+ ffurl_closep(&s->rtp_hd);
+ ffurl_closep(&s->rtcp_hd);
ffurl_closep(&s->fec_hd);
return 0;
}
ff_rtp_parse_close(rtsp_st->transport_priv);
}
rtsp_st->transport_priv = NULL;
- if (rtsp_st->rtp_handle)
- ffurl_close(rtsp_st->rtp_handle);
- rtsp_st->rtp_handle = NULL;
+ ffurl_closep(&rtsp_st->rtp_handle);
}
}
void ff_rtsp_close_connections(AVFormatContext *s)
{
RTSPState *rt = s->priv_data;
- if (rt->rtsp_hd_out != rt->rtsp_hd) ffurl_close(rt->rtsp_hd_out);
- ffurl_close(rt->rtsp_hd);
- rt->rtsp_hd = rt->rtsp_hd_out = NULL;
+ if (rt->rtsp_hd_out != rt->rtsp_hd)
+ ffurl_closep(&rt->rtsp_hd_out);
+ rt->rtsp_hd_out = NULL;
+ ffurl_closep(&rt->rtsp_hd);
}
int ff_rtsp_connect(AVFormatContext *s)
break;
}
getsockname(ffurl_get_file_handle(in), (struct sockaddr*) &addr, &addrlen);
- ffurl_close(in);
- in = NULL;
+ ffurl_closep(&in);
par = avcodec_parameters_alloc();
if (!par) {
av_bprint_finalize(&sdp, NULL);
fail:
avcodec_parameters_free(&par);
- if (in)
- ffurl_close(in);
+ ffurl_closep(&in);
ff_network_close();
return ret;
}
struct SAPState *sap = s->priv_data;
if (sap->sdp_ctx)
avformat_close_input(&sap->sdp_ctx);
- if (sap->ann_fd)
- ffurl_close(sap->ann_fd);
+ ffurl_closep(&sap->ann_fd);
av_freep(&sap->sdp);
ff_network_close();
return 0;
}
av_freep(&sap->ann);
- if (sap->ann_fd)
- ffurl_close(sap->ann_fd);
+ ffurl_closep(&sap->ann_fd);
ff_network_close();
return 0;
}
if (whence != SEEK_SET)
return AVERROR(ENOSYS);
if (os->tail_out) {
- if (os->out) {
- ffurl_close(os->out);
- }
- if (os->out2) {
- ffurl_close(os->out2);
- }
+ ffurl_closep(&os->out);
+ ffurl_closep(&os->out2);
os->out = os->tail_out;
- os->out2 = NULL;
os->tail_out = NULL;
}
if (offset >= os->cur_start_pos) {
return;
for (i = 0; i < s->nb_streams; i++) {
OutputStream *os = &c->streams[i];
- ffurl_close(os->out);
- ffurl_close(os->out2);
- ffurl_close(os->tail_out);
- os->out = os->out2 = os->tail_out = NULL;
+ ffurl_closep(&os->out);
+ ffurl_closep(&os->out2);
+ ffurl_closep(&os->tail_out);
if (os->ctx && os->ctx_inited)
av_write_trailer(os->ctx);
if (os->ctx && os->ctx->pb)
if (!os->out || os->tail_out)
return AVERROR(EIO);
- ffurl_close(os->out);
- os->out = NULL;
+ ffurl_closep(&os->out);
size = os->tail_pos - os->cur_start_pos;
if ((ret = parse_fragment(s, filename, &start_ts, &duration, &moof_size, size)) < 0)
break;
SRTPProtoContext *s = h->priv_data;
ff_srtp_free(&s->srtp_out);
ff_srtp_free(&s->srtp_in);
- ffurl_close(s->rtp_hd);
- s->rtp_hd = NULL;
+ ffurl_closep(&s->rtp_hd);
return 0;
}
return ret;
c->pos = c->start;
if ((ret = slave_seek(h)) < 0) {
- ffurl_close(c->h);
+ ffurl_closep(&c->h);
return ret;
}
return 0;
static int subfile_close(URLContext *h)
{
SubfileContext *c = h->priv_data;
- return ffurl_close(c->h);
+ return ffurl_closep(&c->h);
}
static int subfile_read(URLContext *h, unsigned char *buf, int size)
gnutls_deinit(c->session);
if (c->cred)
gnutls_certificate_free_credentials(c->cred);
- if (c->tls_shared.tcp)
- ffurl_close(c->tls_shared.tcp);
+ ffurl_closep(&c->tls_shared.tcp);
ff_gnutls_deinit();
return 0;
}
tls_close(p->ctx);
tls_free(p->ctx);
}
- if (p->tls_shared.tcp)
- ffurl_close(p->tls_shared.tcp);
+ ffurl_closep(&p->tls_shared.tcp);
return 0;
}
}
if (c->ctx)
SSL_CTX_free(c->ctx);
- if (c->tls_shared.tcp)
- ffurl_close(c->tls_shared.tcp);
+ ffurl_closep(&c->tls_shared.tcp);
#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
if (c->url_bio_method)
BIO_meth_free(c->url_bio_method);
av_freep(&c->dec_buf);
c->dec_buf_size = c->dec_buf_offset = 0;
- if (c->tls_shared.tcp)
- ffurl_close(c->tls_shared.tcp);
+ ffurl_closep(&c->tls_shared.tcp);
return 0;
}
}
if (c->ca_array)
CFRelease(c->ca_array);
- if (c->tls_shared.tcp)
- ffurl_close(c->tls_shared.tcp);
+ ffurl_closep(&c->tls_shared.tcp);
return 0;
}