46: 正则表达式错误 17 '(dryad-bibo/v)[0-9]。[0-9]', (比赛失败)



我正在尝试使用libmagic和以下代码位来确定几种类型的文件的mime类型:

auto handle = ::magic_open(MAGIC_MIME_TYPE);
::magic_load(handle, NULL);
// Both of these fail with the same error
// file_path being a const char* with the path to the file.
auto type2 = ::magic_file(handle, file_path);
// svg_content being an std::vector<char> with the contents of the file.
//auto type2 = ::magic_buffer(handle, svg_content.data(), svg_content.size()); 
if(!type2)
{
std::cout << magic_error(handle) << std::endl;
}

::magic_close(handle);

但是对于任何文件或缓冲区,我尝试我收到正则表达式错误,要么是或类似于:

46: regex error 17 for ' (dryad-bibo/v)[0-9]。[0-9]',(匹配失败)

例如这个。svg文件:

<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-no" viewBox="0 0 640 480">
<path fill="#ed2939" d="M0 0h640v480H0z"/>
<path fill="#fff" d="M180 0h120v480H180z"/>
<path fill="#fff" d="M0 180h640v120H0z"/>
<path fill="#002664" d="M210 0h60v480h-60z"/>
<path fill="#002664" d="M0 210h640v60H0z"/>
</svg>

我已经试过了:

  • libmagic 5.35
  • libmagic 5.39
  • libmagic 5.40
  • libmagic from opensource.apple
  • 将LC_TYPE和LANG设置为"C">

我链接的libmagic版本是在本地构建的,可能有什么我错过了,而建设?是有哪个电话打错了,还是我遗漏了什么?

当尝试运行本地编译的相关文件二进制文件时,我得到类似的错误。然而,当我使用默认情况下可用的文件命令时,我确实得到image/svg+xml作为输出。

编辑

为了构建libmagic(适用于macOS和Ubuntu),我遵循以下步骤:
  • 从Github下载相关版本
  • autoreconf——安装
  • ./configure
  • 使
  • make install

更新

看起来这个文件底部的正则表达式引起了问题(至少对于svg):

https://github.com/file/file/blob/b56b58d499dbe58f2bed28e6b3c297fe7add992e/magic/Magdir/dataone

更新2

奇怪的事情发生了;在我让它工作的系统上,magic_version()报告540,正如预期的那样。但是在出现此错误的系统上,magic_version()报告538

这对我来说没有什么意义,因为我在系统本身的任何地方都找不到那个版本,当我在构建库中运行./file --version时,它报告file-5.40

非常不满意的答案,但是它链接到GoogleTest导致这个错误,甚至没有运行任何测试,只是链接到它。

我改用Catch2,问题解决了。

在Ubuntu 20.04上测试:

克隆repo

git clone git@github.com:file/file.git
cd file/

在repo的新克隆中试试:

autoreconf -f -i
./configure --disable-silent-rules
make -j4
make -C tests check

查看是否有错误报告。在使用make install安装之后,获取一些名为"test.xml"并将其与main.c:

一起放到某个文件夹中
#include <stdio.h>
#include <magic.h>
int main(void)
{
char *actual_file = "test.xml";
const char *magic_full;
magic_t magic_cookie;
/* MAGIC_MIME tells magic to return a mime of the file,
but you can specify different things */
magic_cookie = magic_open(MAGIC_MIME);
if (magic_cookie == NULL) {
printf("unable to initialize magic libraryn");
return 1;
}
printf("Loading default magic databasen");
if (magic_load(magic_cookie, NULL) != 0) {
printf("cannot load magic database - %sn", magic_error(magic_cookie));
magic_close(magic_cookie);
return 1;
}
magic_full = magic_file(magic_cookie, actual_file);
printf("%sn", magic_full);
magic_close(magic_cookie);
return 0;
}

(由vivithemage提供)

编译并尝试:

$ gcc main.c -lmagic
$ ./a.out 
Loading default magic database
text/xml; charset=us-ascii

如果它不能在您的系统上工作,请在项目的bug跟踪器上报告您的操作系统和体系结构的规范。您可以尝试通过从您在更新中找到的文件中删除违规记录来修复问题。

最新更新