Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] improve error messages when strerror_r is not available (PR #20680)
@ 2025-10-09  6:55 timblechmann via ffmpeg-devel
  0 siblings, 0 replies; only message in thread
From: timblechmann via ffmpeg-devel @ 2025-10-09  6:55 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: timblechmann

PR #20680 opened by timblechmann
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20680
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20680.patch

* add more fallbacks with different error codes
* add strerror_s codepath for windows/msvc


>From 6ea5baadd63ae9ab37855fb3ede56415ff671663 Mon Sep 17 00:00:00 2001
From: Tim Blechmann <tim@klingt.org>
Date: Thu, 9 Oct 2025 14:44:21 +0800
Subject: [PATCH 1/2] avutil: add missing error codes

av_strerror does not implement fallbacks for many posix error codes when
strerror_r is not available. Adding the missing entries.
---
 libavutil/error.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 123 insertions(+)

diff --git a/libavutil/error.c b/libavutil/error.c
index 90bab7b9d3..e7867cad71 100644
--- a/libavutil/error.c
+++ b/libavutil/error.c
@@ -103,6 +103,129 @@ static const struct error_entry error_entries[] = {
     { EERROR_TAG(ESPIPE),            "Illegal seek" },
     { EERROR_TAG(ESRCH),             "No such process" },
     { EERROR_TAG(EXDEV),             "Cross-device link" },
+#ifdef EADDRINUSE
+    { EERROR_TAG(EADDRINUSE),        "Address in use" },
+#endif
+#ifdef EADDRNOTAVAIL
+    { EERROR_TAG(EADDRNOTAVAIL),     "Address not available" },
+#endif
+#ifdef EAFNOSUPPORT
+    { EERROR_TAG(EAFNOSUPPORT),      "Address family not supported" },
+#endif
+#ifdef EALREADY
+    { EERROR_TAG(EALREADY),          "Connection already in progress" },
+#endif
+#ifdef EBADMSG
+    { EERROR_TAG(EBADMSG),           "Bad message" },
+#endif
+#ifdef ECANCELED
+    { EERROR_TAG(ECANCELED),         "Operation canceled" },
+#endif
+#ifdef ECONNABORTED
+    { EERROR_TAG(ECONNABORTED),      "Connection aborted" },
+#endif
+#ifdef ECONNREFUSED
+    { EERROR_TAG(ECONNREFUSED),      "Connection refused" },
+#endif
+#ifdef ECONNRESET
+    { EERROR_TAG(ECONNRESET),        "Connection reset" },
+#endif
+#ifdef EDESTADDRREQ
+    { EERROR_TAG(EDESTADDRREQ),      "Destination address required" },
+#endif
+#ifdef EHOSTUNREACH
+    { EERROR_TAG(EHOSTUNREACH),      "Host unreachable" },
+#endif
+#ifdef EIDRM
+    { EERROR_TAG(EIDRM),             "Identifier removed" },
+#endif
+#ifdef EINPROGRESS
+    { EERROR_TAG(EINPROGRESS),       "Operation in progress" },
+#endif
+#ifdef EISCONN
+    { EERROR_TAG(EISCONN),           "Already connected" },
+#endif
+#ifdef ELOOP
+    { EERROR_TAG(ELOOP),             "Too many symbolic link levels" },
+#endif
+#ifdef EMSGSIZE
+    { EERROR_TAG(EMSGSIZE),          "Message size" },
+#endif
+#ifdef ENETDOWN
+    { EERROR_TAG(ENETDOWN),          "Network down" },
+#endif
+#ifdef ENETRESET
+    { EERROR_TAG(ENETRESET),         "Network reset" },
+#endif
+#ifdef ENETUNREACH
+    { EERROR_TAG(ENETUNREACH),       "Network unreachable" },
+#endif
+#ifdef ENOBUFS
+    { EERROR_TAG(ENOBUFS),           "No buffer space" },
+#endif
+#ifdef ENODATA
+    { EERROR_TAG(ENODATA),           "No message available" },
+#endif
+#ifdef ENOLINK
+    { EERROR_TAG(ENOLINK),           "No link" },
+#endif
+#ifdef ENOMSG
+    { EERROR_TAG(ENOMSG),            "No message" },
+#endif
+#ifdef ENOPROTOOPT
+    { EERROR_TAG(ENOPROTOOPT),       "No protocol option" },
+#endif
+#ifdef ENOSR
+    { EERROR_TAG(ENOSR),             "No stream resources" },
+#endif
+#ifdef ENOSTR
+    { EERROR_TAG(ENOSTR),            "Not a stream" },
+#endif
+#ifdef ENOTCONN
+    { EERROR_TAG(ENOTCONN),          "Not connected" },
+#endif
+#ifdef ENOTRECOVERABLE
+    { EERROR_TAG(ENOTRECOVERABLE),   "State not recoverable" },
+#endif
+#ifdef ENOTSOCK
+    { EERROR_TAG(ENOTSOCK),          "Not a socket" },
+#endif
+#ifdef ENOTSUP
+    { EERROR_TAG(ENOTSUP),           "Not supported" },
+#endif
+#ifdef EOPNOTSUPP
+    { EERROR_TAG(EOPNOTSUPP),        "Operation not supported" },
+#endif
+#ifdef EOTHER
+    { EERROR_TAG(EOTHER),            "Other" },
+#endif
+#ifdef EOVERFLOW
+    { EERROR_TAG(EOVERFLOW),         "Value too large" },
+#endif
+#ifdef EOWNERDEAD
+    { EERROR_TAG(EOWNERDEAD),        "Owner dead" },
+#endif
+#ifdef EPROTO
+    { EERROR_TAG(EPROTO),            "Protocol error" },
+#endif
+#ifdef EPROTONOSUPPORT
+    { EERROR_TAG(EPROTONOSUPPORT),   "Protocol not supported" },
+#endif
+#ifdef EPROTOTYPE
+    { EERROR_TAG(EPROTOTYPE),        "Wrong protocol type" },
+#endif
+#ifdef ETIME
+    { EERROR_TAG(ETIME),             "Stream timeout" },
+#endif
+#ifdef ETIMEDOUT
+    { EERROR_TAG(ETIMEDOUT),         "Timed out" },
+#endif
+#ifdef ETXTBSY
+    { EERROR_TAG(ETXTBSY),           "Text file busy" },
+#endif
+#ifdef EWOULDBLOCK
+    { EERROR_TAG(EWOULDBLOCK),       "Operation would block" },
+#endif
 #endif
 };
 
-- 
2.49.1


>From c09b672527fa32dd0950cfd998fe5aefaffb9550 Mon Sep 17 00:00:00 2001
From: Tim Blechmann <tim@klingt.org>
Date: Thu, 9 Oct 2025 14:53:22 +0800
Subject: [PATCH 2/2] avutil: av_strerror - add implementation via strerror_s

win32 does not have strerror_r, but strerror_s. adding a codepath to
av_strerror, that makes use of it.
---
 libavutil/error.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libavutil/error.c b/libavutil/error.c
index e7867cad71..088dcf7483 100644
--- a/libavutil/error.c
+++ b/libavutil/error.c
@@ -25,6 +25,10 @@
 #include "error.h"
 #include "macros.h"
 
+#if defined(_WIN32) && defined(_MSC_VER)
+#define HAVE_STRERROR_S
+#endif
+
 struct error_entry {
     int num;
     const char *tag;
@@ -64,7 +68,7 @@ static const struct error_entry error_entries[] = {
     { ERROR_TAG(HTTP_TOO_MANY_REQUESTS), "Server returned 429 Too Many Requests"      },
     { ERROR_TAG(HTTP_OTHER_4XX),     "Server returned 4XX Client Error, but not one of 40{0,1,3,4}" },
     { ERROR_TAG(HTTP_SERVER_ERROR),  "Server returned 5XX Server Error reply" },
-#if !HAVE_STRERROR_R
+#if !HAVE_STRERROR_R && !defined(HAVE_STRERROR_S)
     { EERROR_TAG(E2BIG),             "Argument list too long" },
     { EERROR_TAG(EACCES),            "Permission denied" },
     { EERROR_TAG(EAGAIN),            "Resource temporarily unavailable" },
@@ -226,7 +230,7 @@ static const struct error_entry error_entries[] = {
 #ifdef EWOULDBLOCK
     { EERROR_TAG(EWOULDBLOCK),       "Operation would block" },
 #endif
-#endif
+#endif // !HAVE_STRERROR_R && !defined(HAVE_STRERROR_S)
 };
 
 int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
@@ -245,6 +249,8 @@ int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
     } else {
 #if HAVE_STRERROR_R
         ret = AVERROR(strerror_r(AVUNERROR(errnum), errbuf, errbuf_size));
+#elif defined(HAVE_STRERROR_S)
+        ret = AVERROR(strerror_s(errbuf, errbuf_size, AVUNERROR(errnum)));
 #else
         ret = -1;
 #endif
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2025-10-09  6:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-09  6:55 [FFmpeg-devel] [PATCH] improve error messages when strerror_r is not available (PR #20680) timblechmann via ffmpeg-devel

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ http://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git