[Mesa-dev] [PATCH 2/2] st/clover: Use std::string for target IR string parameter

Michel Dänzer michel at daenzer.net
Tue Jan 27 00:24:45 PST 2015


On 22.01.2015 19:10, Francisco Jerez wrote:
> Michel Dänzer <michel at daenzer.net> writes:
> 
>> From: Michel Dänzer <michel.daenzer at amd.com>
>>
>> That's what device::ir_target() returns. Fixes reading beyond allocated
>> memory:
>>
>> ==1936== Invalid read of size 1
>> ==1936==    at 0x4C2C1B4: strlen (vg_replace_strmem.c:412)
>> ==1936==    by 0x9E00C30: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20)
>> ==1936==    by 0x5B44FAE: clover::compile_program_llvm(clover::compat::string const&, clover::compat::vector<clover::compat::pair<clover::compat::string, clover::compat::string> > const&, pipe_shader_ir, clover::compat::string const&, clover::compat::string const&, clover::compat::string&) (invocation.cpp:698)
>> ==1936==    by 0x5B39A20: clover::program::build(clover::ref_vector<clover::device> const&, char const*, clover::compat::vector<clover::compat::pair<clover::compat::string, clover::compat::string> > const&) (program.cpp:63)
>> ==1936==    by 0x5B20152: clBuildProgram (program.cpp:182)
>> ==1936==    by 0x400F41: main (hello_world.c:109)
>> ==1936==  Address 0x56fee1f is 0 bytes after a block of size 15 alloc'd
>> ==1936==    at 0x4C28C20: malloc (vg_replace_malloc.c:296)
>> ==1936==    by 0x5B398F0: alloc (compat.hpp:59)
>> ==1936==    by 0x5B398F0: vector<std::basic_string<char> > (compat.hpp:98)
>> ==1936==    by 0x5B398F0: string<std::basic_string<char> > (compat.hpp:327)
>> ==1936==    by 0x5B398F0: clover::program::build(clover::ref_vector<clover::device> const&, char const*, clover::compat::vector<clover::compat::pair<clover::compat::string, clover::compat::string> > const&) (program.cpp:63)
>> ==1936==    by 0x5B20152: clBuildProgram (program.cpp:182)
>> ==1936==    by 0x400F41: main (hello_world.c:109)
>>
>> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> 
> Hi Michel, apparently the problem is this line:
> 
> | size_t processor_str_len = std::string(target.begin()).find_first_of("-");
> 
> That assumes that compat::string::begin() is null-terminated, which is
> not necessarily the case.
> 
> Unfortunately I don't think we make that argument an std::string if we
> still want to support building with LLVM < 3.5, since it may lead to ABI
> issues.  Can you change the line to use the conversion operator instead
> for the time being, like:
> 
> | size_t processor_str_len = std::string(target).find_first_of("-");

Thanks for the suggestion, implemented in v2.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 173 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150127/ba3c01f3/attachment.sig>


More information about the mesa-dev mailing list