diff --git a/file-boo1201350.patch b/file-boo1201350.patch new file mode 100644 index 0000000..28ff6cb --- /dev/null +++ b/file-boo1201350.patch @@ -0,0 +1,186 @@ +From c80065fe6900be5e794941e29b32440e9969b1c3 Mon Sep 17 00:00:00 2001 +From: Christos Zoulas +Date: Mon, 4 Jul 2022 19:44:35 +0000 +Subject: [PATCH 1/5] PR/362: ro-ee: fix wide char printing + +--- + src/file.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++------------- + src/file.h | 4 +- + src/funcs.c | 4 +- + 3 files changed, 81 insertions(+), 24 deletions(-) + +--- src/file.c ++++ src/file.c 2022-07-21 13:56:33.280169243 +0000 +@@ -60,6 +60,12 @@ FILE_RCSID("@(#)$File: file.c,v 1.195 20 + #ifdef HAVE_WCTYPE_H + #include + #endif ++#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) && \ ++ defined(HAVE_WCTYPE_H) ++#define FILE_WIDE_SUPPORT ++#else ++#include ++#endif + + #if defined(HAVE_GETOPT_H) && defined(HAVE_STRUCT_OPTION) + # include +@@ -544,6 +550,58 @@ unwrap(struct magic_set *ms, const char + return e; + } + ++private void ++file_octal(unsigned char c) ++{ ++ putc('\\', stdout); ++ putc(((c >> 6) & 7) + '0', stdout); ++ putc(((c >> 3) & 7) + '0', stdout); ++ putc(((c >> 0) & 7) + '0', stdout); ++} ++ ++private void ++fname_print(const char *inname) ++{ ++ size_t n = strlen(inname); ++#ifdef FILE_WIDE_SUPPORT ++ mbstate_t state; ++ wchar_t nextchar; ++ size_t bytesconsumed; ++ ++ ++ (void)memset(&state, 0, sizeof(state)); ++ while (n > 0) { ++ bytesconsumed = mbrtowc(&nextchar, inname, n, &state); ++ if (bytesconsumed == CAST(size_t, -1) || ++ bytesconsumed == CAST(size_t, -2)) { ++ nextchar = *inname++; ++ n--; ++ (void)memset(&state, 0, sizeof(state)); ++ file_octal(CAST(unsigned char, nextchar)); ++ continue; ++ } ++ inname += bytesconsumed; ++ n -= bytesconsumed; ++ if (iswprint(nextchar)) { ++ printf("%lc", nextchar); ++ continue; ++ } ++ /* XXX: What if it is > 255? */ ++ file_octal(CAST(unsigned char, nextchar)); ++ } ++#else ++ size_t i; ++ for (i = 0; i < n; i++) { ++ unsigned char c = CAST(unsigned char, inname[i]); ++ if (isprint(c)) { ++ putc(c); ++ continue; ++ } ++ file_octal(c); ++ } ++#endif ++} ++ + /* + * Called for each input file on the command line (or in a list of files) + */ +@@ -553,15 +611,13 @@ process(struct magic_set *ms, const char + const char *type, c = nulsep > 1 ? '\0' : '\n'; + int std_in = strcmp(inname, "-") == 0; + int haderror = 0; +- size_t plen = 4 * wid + 1; +- char *pbuf, *pname; +- +- if ((pbuf = CAST(char *, malloc(plen))) == NULL) +- file_err(EXIT_FAILURE, "Can't allocate %zu bytes", plen); + + if (wid > 0 && !bflag) { +- pname = file_printable(ms, pbuf, plen, inname, wid); +- (void)printf("%s", std_in ? "/dev/stdin" : pname); ++ const char *pname = std_in ? "/dev/stdin" : inname; ++ if ((ms->flags & MAGIC_RAW) == 0) ++ fname_print(pname); ++ else ++ (void)printf("%s", pname); + if (nulsep) + (void)putc('\0', stdout); + if (nulsep < 2) { +@@ -580,7 +636,6 @@ process(struct magic_set *ms, const char + } + if (nobuffer) + haderror |= fflush(stdout) != 0; +- free(pbuf); + return haderror || type == NULL; + } + +@@ -588,35 +643,37 @@ protected size_t + file_mbswidth(struct magic_set *ms, const char *s) + { + size_t width = 0; +-#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) && \ +- defined(HAVE_WCTYPE_H) +- size_t bytesconsumed, old_n, n; ++#ifdef FILE_WIDE_SUPPORT ++ size_t bytesconsumed, n; + mbstate_t state; + wchar_t nextchar; +- (void)memset(&state, 0, sizeof(mbstate_t)); +- old_n = n = strlen(s); ++ ++ (void)memset(&state, 0, sizeof(state)); ++ n = strlen(s); + + while (n > 0) { + bytesconsumed = mbrtowc(&nextchar, s, n, &state); + if (bytesconsumed == CAST(size_t, -1) || + bytesconsumed == CAST(size_t, -2)) { +- /* Something went wrong, return something reasonable */ +- return old_n; ++ nextchar = *s; ++ bytesconsumed = 1; ++ (void)memset(&state, 0, sizeof(state)); ++ width += 4; ++ } else { ++ int w = wcwidth(nextchar); ++ width += ((ms->flags & MAGIC_RAW) != 0 ++ || iswprint(nextchar)) ? (w > 0 ? w : 1) : 4; + } +- width += ((ms->flags & MAGIC_RAW) != 0 +- || iswprint(nextchar)) ? wcwidth(nextchar) : 4; + + s += bytesconsumed, n -= bytesconsumed; + } +- return width; + #else + while (*s) { + width += (ms->flags & MAGIC_RAW) != 0 + || isprint(CAST(unsigned char, *s)) ? 1 : 4; + } +- +- return strlen(s); + #endif ++ return width; + } + + private void +--- src/file.h ++++ src/file.h 2022-07-21 13:56:33.280169243 +0000 +@@ -575,7 +575,7 @@ protected size_t file_pstring_length_siz + const struct magic *); + protected size_t file_pstring_get_length(struct magic_set *, + const struct magic *, const char *); +-public char * file_printable(struct magic_set *, char *, size_t, ++protected char * file_printable(struct magic_set *, char *, size_t, + const char *, size_t); + #ifdef __EMX__ + protected int file_os2_apptype(struct magic_set *, const char *, const void *, +--- src/funcs.c ++++ src/funcs.c 2022-07-21 13:56:33.280169243 +0000 +@@ -763,7 +763,7 @@ file_pop_buffer(struct magic_set *ms, fi + /* + * convert string to ascii printable format. + */ +-public char * ++protected char * + file_printable(struct magic_set *ms, char *buf, size_t bufsiz, + const char *str, size_t slen) + { diff --git a/file.changes b/file.changes index 33d8ee5..69d8144 100644 --- a/file.changes +++ b/file.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Wed Jul 13 11:01:16 UTC 2022 - Dr. Werner Fink + +- Add upstream patch to fix boo#1201350 + * file-boo1201350.patch which combines the commits + c80065fe6900be5e794941e29b32440e9969b1c3 + 7e59d34206d7c962e093d4239e5367a2cd8b7623 + f042050f59bfc037677871c4d1037c33273f5213 + d471022b2772071877895759f209f2c346757a4c + 441ac2b15508909e82ad467960df4ac0adf9644c + ------------------------------------------------------------------- Mon Jun 13 08:45:48 UTC 2022 - Dr. Werner Fink diff --git a/file.spec b/file.spec index 7de5f8b..c2066a0 100644 --- a/file.spec +++ b/file.spec @@ -62,7 +62,8 @@ Patch31: file-5.19-biorad.dif Patch32: file-5.19-clicfs.dif Patch37: file-secure_getenv.patch Patch39: file-5.28-btrfs-image.dif -# Upstream commits as patches +# Upstream commits as patch +Patch42: file-boo1201350.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %global _sysconfdir /etc %global _miscdir %{_datadir}/misc @@ -106,6 +107,7 @@ to develop applications that require the magic "file" interface. %prep %setup -q -n file-%{version} +%patch42 -p0 %patch1 -p0 -b .misc %patch4 -p0 -b .conf %patch5 -p0 -b .tex @@ -124,6 +126,7 @@ to develop applications that require the magic "file" interface. %patch32 -p0 -b .clicfs %patch37 -p1 -b .getenv %patch39 -p1 -b .btrfs + %patch -b .0 test -s src/magic.h.in || cp -p src/magic.h src/magic.h.in rm -fv src/magic.h