[FFmpeg-devel] [PATCH v2 04/22] avformat/aviobuf: Don't use incompatible function pointer type for call

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Thu Sep 7 04:05:20 EEST 2023


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.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavformat/avio.c    | 15 +++++++++++----
 libavformat/aviobuf.c |  6 ++----
 libavformat/url.h     | 20 ++++++++++++++++----
 3 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/libavformat/avio.c b/libavformat/avio.c
index d53da5cb0c..fd40f9ce43 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -404,8 +404,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, NULL, size, 1,
@@ -420,8 +422,10 @@ int ffurl_read_complete(URLContext *h, unsigned char *buf, int size)
                                   h->prot->url_read, NULL, 1);
 }
 
-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 */
@@ -432,8 +436,9 @@ int ffurl_write(URLContext *h, const unsigned char *buf, int size)
                                   NULL, h->prot->url_write, 0);
 }
 
-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)
@@ -654,8 +659,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);
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 029a9e966b..ad5827f216 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -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;
 }
diff --git a/libavformat/url.h b/libavformat/url.h
index 3cfe3ecc5c..bba1a9a1df 100644
--- a/libavformat/url.h
+++ b/libavformat/url.h
@@ -170,6 +170,7 @@ int ffurl_accept(URLContext *s, URLContext **c);
  */
 int ffurl_handshake(URLContext *c);
 
+int ffurl_read2(void *urlcontext, unsigned char *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.
-- 
2.34.1



More information about the ffmpeg-devel mailing list