avformat/aviobuf: Don't use incompatible function pointer type for call

It is undefined behaviour even in cases where it works
(it works because both are pointers). Instead change
the functions involved to use the type expected by the AVIO-API
and add inline wrappers for our internal callers.

Reviewed-by: Tomas Härdin <git@haerdin.se>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2023-09-06 16:04:20 +02:00
parent e26506cb3b
commit e8704a8f60
3 changed files with 29 additions and 12 deletions

View File

@ -392,8 +392,10 @@ static inline int retry_transfer_wrapper(URLContext *h, uint8_t *buf,
return len;
}
int ffurl_read(URLContext *h, unsigned char *buf, int size)
int ffurl_read2(void *urlcontext, uint8_t *buf, int size)
{
URLContext *h = urlcontext;
if (!(h->flags & AVIO_FLAG_READ))
return AVERROR(EIO);
return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read);
@ -406,8 +408,10 @@ int ffurl_read_complete(URLContext *h, unsigned char *buf, int size)
return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read);
}
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
int ffurl_write2(void *urlcontext, uint8_t *buf, int size)
{
URLContext *h = urlcontext;
if (!(h->flags & AVIO_FLAG_WRITE))
return AVERROR(EIO);
/* avoid sending too big packets */
@ -419,8 +423,9 @@ int ffurl_write(URLContext *h, const unsigned char *buf, int size)
h->prot->url_write);
}
int64_t ffurl_seek(URLContext *h, int64_t pos, int whence)
int64_t ffurl_seek2(void *urlcontext, int64_t pos, int whence)
{
URLContext *h = urlcontext;
int64_t ret;
if (!h->prot->url_seek)
@ -641,8 +646,10 @@ int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
return h->prot->url_get_multi_file_handle(h, handles, numhandles);
}
int ffurl_get_short_seek(URLContext *h)
int ffurl_get_short_seek(void *urlcontext)
{
URLContext *h = urlcontext;
if (!h || !h->prot || !h->prot->url_get_short_seek)
return AVERROR(ENOSYS);
return h->prot->url_get_short_seek(h);

View File

@ -976,9 +976,7 @@ int ffio_fdopen(AVIOContext **s, URLContext *h)
return AVERROR(ENOMEM);
*s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h,
(int (*)(void *, uint8_t *, int)) ffurl_read,
(int (*)(void *, uint8_t *, int)) ffurl_write,
(int64_t (*)(void *, int64_t, int))ffurl_seek);
ffurl_read2, ffurl_write2, ffurl_seek2);
if (!*s) {
av_freep(&buffer);
return AVERROR(ENOMEM);
@ -1006,7 +1004,7 @@ int ffio_fdopen(AVIOContext **s, URLContext *h)
if (h->prot->url_read_seek)
(*s)->seekable |= AVIO_SEEKABLE_TIME;
}
((FFIOContext*)(*s))->short_seek_get = (int (*)(void *))ffurl_get_short_seek;
((FFIOContext*)(*s))->short_seek_get = ffurl_get_short_seek;
(*s)->av_class = &ff_avio_class;
return 0;
}

View File

@ -170,6 +170,7 @@ int ffurl_accept(URLContext *s, URLContext **c);
*/
int ffurl_handshake(URLContext *c);
int ffurl_read2(void *urlcontext, uint8_t *buf, int size);
/**
* Read up to size bytes from the resource accessed by h, and store
* the read bytes in buf.
@ -179,7 +180,10 @@ int ffurl_handshake(URLContext *c);
* indicates that it is not possible to read more from the accessed
* resource (except if the value of the size argument is also zero).
*/
int ffurl_read(URLContext *h, unsigned char *buf, int size);
static inline int ffurl_read(URLContext *h, uint8_t *buf, int size)
{
return ffurl_read2(h, buf, size);
}
/**
* Read as many bytes as possible (up to size), calling the
@ -190,14 +194,19 @@ int ffurl_read(URLContext *h, unsigned char *buf, int size);
*/
int ffurl_read_complete(URLContext *h, unsigned char *buf, int size);
int ffurl_write2(void *urlcontext, uint8_t *buf, int size);
/**
* Write size bytes from buf to the resource accessed by h.
*
* @return the number of bytes actually written, or a negative value
* corresponding to an AVERROR code in case of failure
*/
int ffurl_write(URLContext *h, const unsigned char *buf, int size);
static inline int ffurl_write(URLContext *h, const uint8_t *buf, int size)
{
return ffurl_write2(h, (uint8_t*)buf, size);
}
int64_t ffurl_seek2(void *urlcontext, int64_t pos, int whence);
/**
* Change the position that will be used by the next read/write
* operation on the resource accessed by h.
@ -212,7 +221,10 @@ int ffurl_write(URLContext *h, const unsigned char *buf, int size);
* the beginning of the file. You can use this feature together with
* SEEK_CUR to read the current file position.
*/
int64_t ffurl_seek(URLContext *h, int64_t pos, int whence);
static inline int64_t ffurl_seek(URLContext *h, int64_t pos, int whence)
{
return ffurl_seek2(h, pos, whence);
}
/**
* Close the resource accessed by the URLContext h, and free the
@ -251,7 +263,7 @@ int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
*
* @return threshold (>0) on success or <=0 on error.
*/
int ffurl_get_short_seek(URLContext *h);
int ffurl_get_short_seek(void *urlcontext);
/**
* Signal the URLContext that we are done reading or writing the stream.