From fee69285c3e530c80439adfb978de9da04e95760 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petr=20P=C3=ADsa=C5=99?= Date: Mon, 13 May 2024 09:55:01 +0200 Subject: [PATCH] Report unsupported compression in solv_xfopen() with errno If libsolv was built without Zstandard support and "primary.xml.zst" was passed solv_xfopen(), solv_xfopen() returned 0 without setting errno. A calling application could not distinguish an unsupported compression format from other I/O errors. This patch improves this situation by setting errno variable to an appropriate value. The value macros are documented in POSIX 2017. --- ext/solv_xfopen.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/ext/solv_xfopen.c b/ext/solv_xfopen.c index 369003b4..e23ea596 100644 --- a/ext/solv_xfopen.c +++ b/ext/solv_xfopen.c @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef _WIN32 #include "fmemopen.c" @@ -660,7 +661,10 @@ solv_xfopen(const char *fn, const char *mode) char *suf; if (!fn) - return 0; + { + errno = EINVAL; + return 0; + } if (!mode) mode = "r"; suf = strrchr(fn, '.'); @@ -669,7 +673,10 @@ solv_xfopen(const char *fn, const char *mode) return mygzfopen(fn, mode); #else if (suf && !strcmp(suf, ".gz")) - return 0; + { + errno = ENOTSUP; + return 0; + } #endif #ifdef ENABLE_LZMA_COMPRESSION if (suf && !strcmp(suf, ".xz")) @@ -678,30 +685,45 @@ solv_xfopen(const char *fn, const char *mode) return mylzfopen(fn, mode); #else if (suf && !strcmp(suf, ".xz")) - return 0; + { + errno = ENOTSUP; + return 0; + } if (suf && !strcmp(suf, ".lzma")) - return 0; + { + errno = ENOTSUP; + return 0; + } #endif #ifdef ENABLE_BZIP2_COMPRESSION if (suf && !strcmp(suf, ".bz2")) return mybzfopen(fn, mode); #else if (suf && !strcmp(suf, ".bz2")) - return 0; + { + errno = ENOTSUP; + return 0; + } #endif #ifdef ENABLE_ZSTD_COMPRESSION if (suf && !strcmp(suf, ".zst")) return myzstdfopen(fn, mode); #else if (suf && !strcmp(suf, ".zst")) - return 0; + { + errno = ENOTSUP; + return 0; + } #endif #ifdef ENABLE_ZCHUNK_COMPRESSION if (suf && !strcmp(suf, ".zck")) return myzchunkfopen(fn, mode); #else if (suf && !strcmp(suf, ".zck")) - return 0; + { + errno = ENOTSUP; + return 0; + } #endif return fopen(fn, mode); } -- 2.47.2