0

I am using C++ for a program retrieving informations about files. Among them, I want to find out the MIME type of a given file.

To do so I use libmagic as follow:

#include <iostream>
#include <string>
#include <magic.h>

void foo (std::string path)
{
     magic_t magic;
     magic = magic_open (MAGIC_MIME_TYPE);
     magic_load(magic, NULL);
     magic_compile(magic, NULL);
     std::string filetype (magic_file(magic, path.c_str()));
     magic_close(magic);

     std::cout << filetype << std::endl;
}

int main(int argc, char *argv[])
{
    std::string str = "test.cxx";

    foo (str);

    return 0;
}

Trying on a computer running on Debian Jessie with gcc 4.9.2 and glibc 2.19, it works just fine.

However, on another computer on arch linux with gcc 5.1.0 and glibc 2.21, I have the following at runtime:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid

gdb gives me additional information:

Program received signal SIGABRT, Aborted.
0x00007ffff6fb1528 in raise () from /usr/lib/libc.so.6

#0  0x00007ffff6fb1528 in raise () from /usr/lib/libc.so.6
#1  0x00007ffff6fb293a in abort () from /usr/lib/libc.so.6
#2  0x00007ffff78c9b3d in __gnu_cxx::__verbose_terminate_handler ()
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x00007ffff78c7996 in __cxxabiv1::__terminate (handler=<optimized out>)
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/eh_terminate.cc:47
#4  0x00007ffff78c79e1 in std::terminate ()
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/eh_terminate.cc:57
#5  0x00007ffff78c7bf8 in __cxxabiv1::__cxa_throw (obj=0x613fb0, 
    tinfo=0x7ffff7baea78 <typeinfo for std::logic_error>, 
    dest=0x7ffff78dd040 <std::logic_error::~logic_error()>)
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/eh_throw.cc:87
#6  0x00007ffff78f08bf in std::__throw_logic_error (
    __s=__s@entry=0x7ffff7976100 "basic_string::_S_construct null not valid")
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/src/c++11/functexcept.cc:74
#7  0x00007ffff790acef in std::string::_S_construct<char const*> (__beg=<optimized out>, 
    __end=<optimized out>, __a=...)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:577
#8  0x00007ffff790b0e6 in _S_construct_aux<char const*> (__a=..., __end=<optimized out>, 
    __beg=0x0)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:4136
#9  _S_construct<char const*> (__a=..., __end=<optimized out>, __beg=0x0)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string---Type <return> to continue, or q <return> to quit---
.h:4157
#10 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (
    this=0x7fffffffe980, __s=0x0, __a=...)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:659
#11 0x0000000000400df3 in foo (path="test.cxx") at test.cxx:11
#12 0x0000000000400ece in main (argc=1, argv=0x7fffffffeae8) at test.cxx:21

So I'm not quite sure if I can solve my problem, or is there a possible bug coming from glibc or libmagic?

user
  • 100
  • 11
  • 1
    looks like `magic_file` is returning NULL and you are not checking it's result for errors. – Diego Jun 28 '15 at 15:17
  • @Diego, indeed `magic_file` returns NULL. But I don't understand why... – user Jun 28 '15 at 15:34
  • 1
    maybe call `magic_error`, it will give you an error message. it's all in the man pages :) – Diego Jun 28 '15 at 15:35
  • Ah.. I had not seen that function. `could not find any valid magic files!` So it makes sense it doesn't work... Thank your for your help. – user Jun 28 '15 at 15:38

0 Answers0