bea
bea

Reputation: 1

Request is pending and exiting with a segmentation fault (C++ and Libcamera)

I'm working on software for a camera using C++ with libcamera library. All the camera configuration parts seem correct, but the continuous frame capturing function is not running and ends with a segmentation fault.

Apparently, there's something wrong with the frame buffer allocation and the request to camera capture the frames.

struct CameraInfo{
    shared_ptr<Camera> camera;
    string camera_id;
    shared_ptr<StreamConfiguration> streamConfig;
    shared_ptr<CameraConfiguration> config;
    Stream *stream;
};

struct PacketInfo{
    shared_ptr<vector<unsigned char>> image_data;
    shared_ptr<FrameBufferAllocator> allocator;
};

CameraInfo camera_info;
PacketInfo packet_info; 
volatile sig_atomic_t running = 1;

void SignalHandler(int signum){
    running = 0;
}

int InitializeAllocator(PacketInfo &packet_info){
    if(!packet_info.allocator){
        packet_info.allocator = make_shared<FrameBufferAllocator>(camera_info.camera);
        if(!packet_info.allocator){
            cerr << "Failed to initialize FrameBufferAllocator" << endl;
            return -ENOMEM;
        }
    }
    return 0;
}

void RequestComplete(Request *request){
    if(request->status() == Request::RequestCancelled){
        return;
    }

    const map<const Stream*, FrameBuffer *> &buffers = request->buffers();
    for(auto bufferPair : buffers){
        FrameBuffer *buffer = bufferPair.second;

        if(!buffer){
            cerr << "Error: buffer is null" << endl;
            continue;
        }

        const FrameMetadata &metadata = buffer->metadata();
        unsigned int nplane = 0;
        for(const FrameMetadata::Plane &plane : metadata.planes()){
            cout << plane.bytesused;
            if(++nplane < metadata.planes().size()) cout << "/";
        }
        cout << endl;
    }
}


bool AllocateImageData(PacketInfo &packet_info){
    size_t y_size = 640 * 480;
    size_t uv_size = (640 / 2) * (480 / 2);
    size_t image_size = y_size + 2 * uv_size;

    packet_info.image_data = make_shared<vector<uint8_t>>(image_size);

    if(!packet_info.image_data || packet_info.image_data->empty()){
        cerr << "Failed to allocate the image buffer" << endl;
        return false;
    }
    return true;
}


int main(){
    shared_ptr<CameraManager> cm = make_shared<CameraManager>();
    cm->start();

    auto cameras = cm->cameras();
    if(cameras.empty()){
        cerr << "No cameras were detected on the system." << endl;
        cm->stop();
        return EXIT_FAILURE;
    }

    camera_info.camera_id = cameras[0]->id();
    camera_info.camera = cm->get(camera_info.camera_id);
    if(!camera_info.camera){
        cerr << "Camera is not initialized" << endl;
        return EXIT_FAILURE;
    }
    if(camera_info.camera->acquire() < 0){
        cerr << "Failed to acquire the camera" << endl;
        return EXIT_FAILURE;
    }  


    camera_info.config = camera_info.camera->generateConfiguration({ StreamRole::Viewfinder }); 
    if(!camera_info.config){
        cerr << "Configuration is null" << endl;
        return EXIT_FAILURE;
    }
    if(camera_info.config->size() == 0){
        cerr << "Invalid camera configuration" << endl;
        return EXIT_FAILURE;
    }

    camera_info.streamConfig = make_shared<StreamConfiguration>(camera_info.config->at(0));
    camera_info.streamConfig->pixelFormat = formats::YUV420;
    camera_info.streamConfig->size.width = 640;
    camera_info.streamConfig->size.height = 480;

    camera_info.config->at(0) = *camera_info.streamConfig;

    CameraConfiguration::Status validation = camera_info.config->validate();
    if(validation != CameraConfiguration::Valid){
        cerr << "Camera configuration validation failed:" 
            << (validation == CameraConfiguration::Invalid ? "Invalid" : "Unknown")
            << "(" << static_cast<int>(validation) << ")"
        << endl;
        return EXIT_FAILURE;
    }

    if(camera_info.camera->configure(camera_info.config.get()) < 0){  
        cerr << "Failed to configure camera" << endl;
        return EXIT_FAILURE;
    }

    camera_info.stream = camera_info.config->at(0).stream();
    if(!camera_info.stream){
        cerr << "Failed to acquire stream" << endl;
        cerr << "Error acquiring stream: " << camera_info.streamConfig->toString() << endl;
        return EXIT_FAILURE;
    }

    cout << "Stream configured successfully" << endl;


    InitializeAllocator(packet_info);

    for (StreamConfiguration &streamConfig : *camera_info.config){
        packet_info.allocator->allocate(streamConfig.stream());
    }

    const auto &buffers = packet_info.allocator->buffers(camera_info.stream);
    camera_info.camera->requestCompleted.connect(RequestComplete);
    camera_info.camera->start();

    vector<unique_ptr<Request>> requests;

    AllocateImageData(packet_info);

    while(running){
        if(buffers.size() == 0){
            cerr << "No buffers available, skipping iteration..." << endl;
            continue;
        }

        requests.clear();
        for (unsigned int i=0; i<buffers.size(); i++){
            unique_ptr<Request> request = camera_info.camera->createRequest();
            
            FrameBuffer *frameBuffer = buffers[i].get();

            request->addBuffer(camera_info.stream, frameBuffer);
            requests.push_back(move(request));
        }

        if(requests.size() != buffers.size()){
            cerr << "Mismatch between requests and buffers sizes: requests = "
                << requests.size() << ", buffers = " << buffers.size() 
            << endl;
            continue;
        }

        for (auto &request : requests){
            int check = camera_info.camera->queueRequest(request.get());
            if(check < 0){
                cerr << "Failed to queue request at index: " << &request << endl;
                continue;
            }

            switch (request->status()){
                case Request::RequestComplete:
                    if(packet_info.image_data && !packet_info.image_data->empty()){
                        request->reuse(Request::ReuseBuffers);
                        cout << "Request completed" << endl;
                    } else{
                        cerr << "Error: Image data is invalid or empty" << endl;
                        camera_info.camera->stop();
                        return -1;
                    }
                    break;

                case Request::RequestCancelled:
                    cerr << "Request was cancelled, skipping processing" << endl;
                    return 0;

                case Request::RequestPending:
                    cout << "Request is pending, waiting for completion" << endl;
                    this_thread::sleep_for(chrono::milliseconds(5));
                    continue;
                
                default:
                    cerr << "Unknown request status: " << request->status() << endl;
                    this_thread::sleep_for(chrono::milliseconds(5));
                    return -1;
            }
        }
        this_thread::sleep_for(chrono::milliseconds(20));
    }

    packet_info.allocator.reset();
    camera_info.camera->stop();
    cm->stop();
    requests.clear();
    return 0;
}
    

LIBCAMERA_LOG_LEVELS=DEBUG

`\[0:48:24.434505088\] \[1234\] DEBUG Request request.cpp:369 Created request - cookie: 0 Request created successfully at index: 3 Buffer set for request at index: 3 Failed to create the request at index: 3 Request queued with status: 0 Request is pending, waiting for completion \[0:48:24.434638682\] \[1237\] DEBUG RPI pipeline_base.cpp:751 queueRequestDevice: New request sequence: 4 \[0:48:24.434734150\] \[1237\] DEBUG Event event_dispatcher_poll.cpp:215 next timer 0x7f9c01bd48 expires in 0.967509584 Request queued with status: 0 Request is pending, waiting for completion \[0:48:24.439747848\] \[1237\] DEBUG RPI pipeline_base.cpp:751 queueRequestDevice: New request sequence: 5 \[0:48:24.439855140\] \[1237\] DEBUG Event event_dispatcher_poll.cpp:215 next timer 0x7f9c01bd48 expires in 0.962389219 Request queued with status: 0 Request is pending, waiting for completion \[0:48:24.444869619\] \[1237\] DEBUG RPI pipeline_base.cpp:751 queueRequestDevice: New request sequence: 6 \[0:48:24.444970348\] \[1237\] DEBUG Event event_dispatcher_poll.cpp:215 next timer 0x7f9c01bd48 expires in 0.957273073 \[0:48:24.447029255\] \[1237\] DEBUG RPI pipeline_base.cpp:1384 Frame start 1 \[0:48:24.447113057\] \[1237\] DEBUG RPiDelayedControls delayed_controls.cpp:240 frame 1 started \[0:48:24.447191025\] \[1237\] DEBUG RPiDelayedControls delayed_controls.cpp:283 Queue is empty, auto queue no-op. \[0:48:24.447276025\] \[1237\] DEBUG Event event_dispatcher_poll.cpp:215 next timer 0x7f9c01bd48 expires in 0.954967292 Request queued with status: 0 Request is pending, waiting for completion \[0:48:24.449998005\] \[1237\] DEBUG RPI pipeline_base.cpp:751 queueRequestDevice: New request sequence: 7 \[0:48:24.450115661\] \[1237\] DEBUG Event event_dispatcher_poll.cpp:215 next timer 0x7f9c01bd48 expires in 0.952127865 \[0:48:24.462350296\] \[1237\] DEBUG V4L2 v4l2_videodevice.cpp:1676 /dev/video0\[13:cap\]: Dequeuing buffer 1 \[0:48:24.462451807\] \[1237\] DEBUG Timer timer.cpp:93 Starting timer 0x7f9c01bd48: deadline 0:48:25.462445140 \[0:48:24.462541859\] \[1237\] DEBUG RPI vc4.cpp:825 Stream Unicam Image buffer dequeue, buffer id 2, timestamp: 2904446973000 \[0:48:24.462627432\] \[1237\] DEBUG RPiDelayedControls delayed_controls.cpp:220 Reading Analogue Gain to 16 at index 0 \[0:48:24.462718994\] \[1237\] DEBUG RPiDelayedControls delayed_controls.cpp:220 Reading Exposure to 29 at index 0 \[0:48:24.462791859\] \[1237\] DEBUG RPiDelayedControls delayed_controls.cpp:220 Reading Horizontal Blanking to 1212 at index 0 \[0:48:24.462864775\] \[1237\] DEBUG RPiDelayedControls delayed_controls.cpp:220 Reading Vertical Blanking to 509 at index 0 Segmentation fault`

(Note: According to what I found, It seems to envolve improper memory access)

#0  0x0000007ff7e88204 in std::_Hashtable<unsigned int, std::pair<unsigned int const, libcamera::ControlValue>,
std::allocator<std::pair<unsigned int const, libcamera::ControlValue>, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing,
std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy,
std::__detail::_Hashtable_traits<false, false, true> >::find(unsigned
int const&) const () from /lib/aarch64-linux-gnu/libcamera.so.0.3
#1  0x0000007ff7f01a48 in libcamera::RPi::CameraData::applyScalerCrop(libcamera::ControlList
const&) () from /lib/aarch64-linux-gnu/libcamera.so.0.3
#2  0x0000007ff7f1c2c8 in libcamera::Vc4CameraData::tryRunPipeline() () from /lib/aarch64-linux-gnu/libcamera.so.0.3
#3  0x0000007ff7ed7690 in libcamera::V4L2VideoDevice::bufferAvailable() () from
/lib/aarch64-linux-gnu/libcamera.so.0.3
#4  0x0000007ff7d73b4c in libcamera::EventDispatcherPoll::processNotifiers(std::vector<pollfd,
std::allocator<pollfd> > const&) () from
/lib/aarch64-linux-gnu/libcamera-base.so.0.3
#5  0x0000007ff7d74068 in libcamera::EventDispatcherPoll::processEvents() () from
/lib/aarch64-linux-gnu/libcamera-base.so.0.3
#6  0x0000007ff7d7b8d8 in libcamera::Thread::exec() () from /lib/aarch64-linux-gnu/libcamera-base.so.0.3
#7  0x0000007ff7e805d0 in libcamera::CameraManager::Private::run() () from /lib/aarch64-linux-gnu/libcamera.so.0.3
#8  0x0000007ff7c0e9dc in ?? () from /lib/aarch64-linux-gnu/libstdc++.so.6
#9  0x0000007ff79cee90 in start_thread (arg=0x7fffffedf7) at ./nptl/pthread_create.c:442
#10 0x0000007ff7a37b1c in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:79

Thread 4 "client-cam" received signal SIGSEGV, Segmentation fault.

[0:24:46.802283963] [771]  INFO Camera camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
[0:24:47.043131410] [774]  WARN RPiSdn sdn.cpp:40 Using legacy SDN tuning - please consider moving SDN inside rpi.denoise
[0:24:47.058103077] [774]  INFO RPI vc4.cpp:447 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media2 and ISP device /dev/media0
Validating configuration with width: 640 height: 480 format: YUV420
[0:24:47.062414015] [771]  INFO Camera camera.cpp:1197 configuring streams: (0) 640x480-YUV420
[0:24:47.063658598] [774]  INFO RPI vc4.cpp:622 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 640x480-SGBRG10_1X10 - Selected unicam format: 640x480-pGAA
Stream configured successfully
Image data allocated: 460800bytes
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
=================================================================
==771==ERROR: AddressSanitizer: heap-use-after-free on address 0x007faaec8c40 at pc 0x007faedd85f8 bp 0x007fa71fc9a0 sp 0x007fa71fc9e8
WRITE of size 104 at 0x007faaec8c40 thread T3
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
    #0 0x7faedd85f4 in __interceptor_memset ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:799
    #1 0x7faecec308 in libcamera::Vc4CameraData::tryRunPipeline() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0x16c308)
    #2 0x7faeca768c in libcamera::V4L2VideoDevice::bufferAvailable() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0x12768c)
    #3 0x7faeb43b48 in libcamera::EventDispatcherPoll::processNotifiers(std::vector<pollfd, std::allocator<pollfd> > const&) (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x13b48)
    #4 0x7faeb44064 in libcamera::EventDispatcherPoll::processEvents() (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x14064)
    #5 0x7faeb4b8d4 in libcamera::Thread::exec() (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x1b8d4)
    #6 0x7faec505cc in libcamera::CameraManager::Private::run() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd05cc)
    #7 0x7fae9de9d8  (/lib/aarch64-linux-gnu/libstdc++.so.6+0xce9d8)
    #8 0x7fae06ee8c in start_thread nptl/pthread_create.c:442
    #9 0x7fae0d7b18 in thread_start ../sysdeps/unix/sysv/linux/aarch64/clone.S:79

0x007faaec8c40 is located 0 bytes inside of 104-byte region [0x007faaec8c40,0x007faaec8ca8)
freed by thread T0 here:
Request is pending, waiting for completion
Request is pending, waiting for completion
Request is pending, waiting for completion
    #0 0x7faee3cec0 in operator delete(void*, unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:164
    #1 0x7faec5c818 in libcamera::Request::~Request() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xdc818)
    #2 0x5563d8a00c in std::default_delete<libcamera::Request>::operator()(libcamera::Request*) const /usr/include/c++/12/bits/unique_ptr.h:95
    #3 0x5563d83cfc in std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >::~unique_ptr() /usr/include/c++/12/bits/unique_ptr.h:396
    #4 0x5563d98108 in void std::_Destroy<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> > >(std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*) /usr/include/c++/12/bits/stl_construct.h:151
    #5 0x5563d93044 in void std::_Destroy_aux<false>::__destroy<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*>(std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*, std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*) /usr/include/c++/12/bits/stl_construct.h:163
    #6 0x5563d8e7b0 in void std::_Destroy<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*>(std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*, std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*) /usr/include/c++/12/bits/stl_construct.h:196
    #7 0x5563d89c04 in void std::_Destroy<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*, std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> > >(std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*, std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*, std::allocator<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> > >&) /usr/include/c++/12/bits/alloc_traits.h:850
    #8 0x5563d89da0 in std::vector<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >, std::allocator<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> > > >::_M_erase_at_end(std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >*) /usr/include/c++/12/bits/stl_vector.h:1932
    #9 0x5563d83b40 in std::vector<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> >, std::allocator<std::unique_ptr<libcamera::Request, std::default_delete<libcamera::Request> > > >::clear() /usr/include/c++/12/bits/stl_vector.h:1601
    #10 0x5563d79b4c in main /home/pi2w/Camera/cpp-test/main.cpp:181
    #11 0x7fae01773c in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #12 0x7fae017814 in __libc_start_main_impl ../csu/libc-start.c:360
    #13 0x5563d750ac in _start (/home/pi2w/Camera/cpp-test/main+0x550ac)

previously allocated by thread T3 here:
Request is pending, waiting for completion
    #0 0x7faee3c170 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:95
    #1 0x7faec582bc in std::_Hashtable<unsigned int, std::pair<unsigned int const, libcamera::ControlValue>, std::allocator<std::pair<unsigned int const, libcamera::ControlValue> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_M_rehash(unsigned long, unsigned long const&) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd82bc)
    #2 0x7faec5851c in std::__detail::_Map_base<unsigned int, std::pair<unsigned int const, libcamera::ControlValue>, std::allocator<std::pair<unsigned int const, libcamera::ControlValue> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true>, true>::operator[](unsigned int const&) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd851c)
    #3 0x7faec571e8 in libcamera::ControlList::find(unsigned int) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd71e8)
    #4 0x7faecd1674 in libcamera::RPi::CameraData::fillRequestMetadata(libcamera::ControlList const&, libcamera::Request*) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0x151674)
    #5 0x7faecec31c in libcamera::Vc4CameraData::tryRunPipeline() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0x16c31c)
    #6 0x7faeccfa9c in libcamera::RPi::PipelineHandlerBase::queueRequestDevice(libcamera::Camera*, libcamera::Request*) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0x14fa9c)
    #7 0x7faec7dd50 in libcamera::PipelineHandler::doQueueRequest(libcamera::Request*) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xfdd50)
    #8 0x7faec7de44 in libcamera::PipelineHandler::doQueueRequests() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xfde44)
    #9 0x7faeb3f24c in libcamera::BoundMethodBase::activatePack(std::shared_ptr<libcamera::BoundMethodPackBase>, bool) (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0xf24c)
    #10 0x7faec80380 in libcamera::BoundMethodMember<libcamera::PipelineHandler, void>::activate(bool) (/lib/aarch64-linux-gnu/libcamera.so.0.3+0x100380)
    #11 0x7faec5d900 in libcamera::Request::Private::emitPrepareCompleted() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xdd900)
    #12 0x5563da77c0 in std::enable_if<std::is_void<void>::value, void>::type libcamera::BoundMethodArgs<void, libcamera::Request*>::invokePack<0ul, void>(libcamera::BoundMethodPackBase*, std::integer_sequence<unsigned long, 0ul>) /usr/include/libcamera/libcamera/base/bound_method.h:115
    #13 0x5563da6d84 in libcamera::BoundMethodArgs<void, libcamera::Request*>::invokePack(libcamera::BoundMethodPackBase*) /usr/include/libcamera/libcamera/base/bound_method.h:124
    #14 0x7faeb3fbfc in libcamera::Object::message(libcamera::Message*) (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0xfbfc)
    #15 0x7faeb4bf34 in libcamera::Thread::dispatchMessages(libcamera::Message::Type) (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x1bf34)
    #16 0x7faeb43ed4 in libcamera::EventDispatcherPoll::processEvents() (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x13ed4)
    #17 0x7faeb4b8d4 in libcamera::Thread::exec() (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x1b8d4)
    #18 0x7faec505cc in libcamera::CameraManager::Private::run() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd05cc)
    #19 0x7fae9de9d8  (/lib/aarch64-linux-gnu/libstdc++.so.6+0xce9d8)
    #20 0x7fae06ee8c in start_thread nptl/pthread_create.c:442
    #21 0x7fae0d7b18 in thread_start ../sysdeps/unix/sysv/linux/aarch64/clone.S:79

Thread T3 created by T0 here:
    #0 0x7faedda234 in __interceptor_pthread_create ../../../../src/libsanitizer/asan/asan_interceptors.cpp:207
    #1 0x7fae9deb00 in std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) (/lib/aarch64-linux-gnu/libstdc++.so.6+0xceb00)
    #2 0x7faeb4c138 in libcamera::Thread::start() (/lib/aarch64-linux-gnu/libcamera-base.so.0.3+0x1c138)
    #3 0x7faec506a8 in libcamera::CameraManager::Private::start() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd06a8)
    #4 0x7faec50814 in libcamera::CameraManager::start() (/lib/aarch64-linux-gnu/libcamera.so.0.3+0xd0814)
    #5 0x5563d76b3c in main /home/pi2w/Camera/cpp-test/main.cpp:92
    #6 0x7fae01773c in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #7 0x7fae017814 in __libc_start_main_impl ../csu/libc-start.c:360
    #8 0x5563d750ac in _start (/home/pi2w/Camera/cpp-test/main+0x550ac)

SUMMARY: AddressSanitizer: heap-use-after-free ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:799 in __interceptor_memset
Shadow bytes around the buggy address:
  0x001ff55d9130: 00 00 00 00 00 00 00 00 00 00 00 00 00 fa fa fa
  0x001ff55d9140: fa fa fa fa fa fa fd fd fd fd fd fd fd fd fd fd
  0x001ff55d9150: fd fd fd fa fa fa fa fa fa fa fa fa fd fd fd fd
  0x001ff55d9160: fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa fa
  0x001ff55d9170: fa fa fd fd fd fd fd fd fd fd fd fd fd fd fd fa
=>0x001ff55d9180: fa fa fa fa fa fa fa fa[fd]fd fd fd fd fd fd fd
  0x001ff55d9190: fd fd fd fd fd fa fa fa fa fa fa fa fa fa fd fd
  0x001ff55d91a0: fd fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa
  0x001ff55d91b0: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fd
  0x001ff55d91c0: fd fa fa fa fa fa fa fa fa fa fd fd fd fd fd fd
  0x001ff55d91d0: fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
Request is pending, waiting for completion
==771==ABORTING

Upvotes: 0

Views: 111

Answers (0)

Related Questions