Closed
Description
Hello, segmentation fault occurred when I called bufferevent_write method. The version I am using is 2.1.11 stable.
My program has two sockets, each socket creates a bufferevent, and each bufferevent is placed in a different thread. When one of the sockets receives data, the data will be written to the other socket.
read callback:
void ServiceHandler::ReadCB(bufferevent *buffev, void *arg)
{
ServiceHandler *ac = (ServiceHandler*)arg;
ac->Handler(buffev);
}
RelayServiceHandler is a subclass of ServiceHandler,The following is the logic of the handler method:
void RelayServiceHandler::Handler(bufferevent * buffer_event) {
evbuffer *input = bufferevent_get_input(buffer_event);
size_t src_len = evbuffer_get_length(input);
char *buf = new char[src_len]();
evbuffer_remove(input, buf, src_len);
std::shared_ptr<RelayServiceHandler> peer = GetPeerHandler();
if (peer != nullptr)
{
peer->WriteBuffEvent(buf, src_len);
}
The following is the WriteBuffEvent method, which calls bufferevent_write:
int ServiceHandler::WriteBuffEvent(const void *data, size_t size)
{
int ret = -1;
if (bev_ == nullptr) {
svrcomm_log(__FILE__, __LINE__, FCODEC_LOG_WARNING,
"WriteBuffEvent error, this %p\n", this);
return ret;
}
bufferevent_lock(bev_);
ret = bufferevent_write(bev_, data, size);
bufferevent_unlock(bev_);
return ret;
}
trace:
#0 0x00005618a6b4afd0 in evbuffer_free_trailing_empty_chains (buf=<optimized out>) at buffer.c:295
295 buffer.c: No such file or directory.
[Current thread is 1 (Thread 0x7f8fdbfff640 (LWP 70962))]
(gdb)
(gdb) bt
#0 0x00005618a6b4afd0 in evbuffer_free_trailing_empty_chains (buf=<optimized out>) at buffer.c:295
#1 0x00005618a6b4b3ce in evbuffer_chain_insert (buf=buf@entry=0x7f8fc0040270,
chain=chain@entry=0x7f8fc401f660) at buffer.c:320
#2 0x00005618a6b4bb4e in evbuffer_add (buf=0x7f8fc0040270, data_in=0x7f8fc40088f0, datlen=64)
at buffer.c:1813
#3 0x00005618a6b4f3b0 in bufferevent_write (bufev=<optimized out>, data=<optimized out>,
size=<optimized out>) at bufferevent.c:454
#4 0x00005618a6a8553d in ServiceHandler::WriteBuffEvent (this=0x7f8fc0000c50, data=0x7f8fc40088f0,
size=4104) at ServiceHandler.cpp:101
#5 0x00005618a6a92c5c in RelayServiceHandler::Handler (this=0x7f8fc4000c50,
buffer_event=0x7f8fc4005f90) at RelayServiceHandler.cpp:398
#6 0x00005618a6a8558c in ServiceHandler::ReadCB (buffev=0x7f8fc4005f90, arg=0x7f8fc4000c50)
at ServiceHandler.cpp:124
#7 0x00005618a6b4fd64 in bufferevent_run_readcb_ (bufev=0x7f8fc4005f90, options=<optimized out>)
at bufferevent.c:251
#8 0x00005618a6b517aa in bufferevent_trigger_nolock_ (options=0, iotype=2, bufev=0x7f8fc4005f90)
at bufferevent-internal.h:411
#9 be_filter_read_nolock_ (me_=me_@entry=0x7f8fc4005f90, underlying=<optimized out>)
at bufferevent_filter.c:466
#10 0x00005618a6b518bf in be_filter_readcb (underlying=0x7f8fc4005af0, me_=0x7f8fc4005f90)
at bufferevent_filter.c:521
#11 0x00005618a6b4fd64 in bufferevent_run_readcb_ (bufev=0x7f8fc4005af0, options=<optimized out>)
at bufferevent.c:251
#12 0x00005618a6b4737c in bufferevent_trigger_nolock_ (options=0, iotype=2, bufev=0x7f8fc4005af0)
at bufferevent-internal.h:411
#13 consider_reading (bev_ssl=0x7f8fc4005af0) at bufferevent_openssl.c:842
#14 0x00005618a6b473c1 in be_openssl_readeventcb (fd=<optimized out>, what=<optimized out>,
ptr=0x7f8fc4005af0) at bufferevent_openssl.c:951
#15 0x00005618a6b59e24 in event_persist_closure (ev=<optimized out>, base=0x5618a862c910)
at event.c:1629
#16 event_process_active_single_queue (base=base@entry=0x5618a862c910, activeq=0x5618a8629320,
max_to_process=max_to_process@entry=2147483647, endtime=endtime@entry=0x0) at event.c:1688
#17 0x00005618a6b5a78f in event_process_active (base=0x5618a862c910) at event.c:1789
I have no idea what happended. If anyone would like to help I would be very grateful! Thanks!