diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2019-08-30 06:03:09 -0400 | 
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2019-08-30 16:48:07 -0400 | 
| commit | 4173cc8e23c19d9b901750413c790a1292b3f5fc (patch) | |
| tree | 5ae4c0d3200ce407d038d25f3c3a12188bfd22c3 /ospfd/ospf_ism.h | |
| parent | da436095d8fb3b8f1e920bdc0a5a3808104bb894 (diff) | |
ospfd: Do not turn on write thread unless we have something in it
I am rarely seeing this crash:
r2: ospfd crashed. Core file found - Backtrace follows:
[New LWP 32748]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
Core was generated by `/usr/lib/frr/ospfd'.
Program terminated with signal SIGABRT, Aborted.
2019-08-29 15:59:36,149 ERROR: assert failed at "test_ospf_sr_topo1/test_memory_leak":
Which translates to this code:
	node = listhead(ospf->oi_write_q);
	assert(node);
	oi = listgetdata(node);
	assert(oi);
So if we get into ospf_write without anything on the oi_write_q
we are stopping the program.
This is happening because in ospf_ls_upd_queue_send we are calling
ospf_write.  Imagine that we have a interface already on the on_write_q
and then ospf_write handles the packet send for all functions.  We
are not clearing the t_write thread and we are popping and causing
a crash.
Additionally modify OSPF_ISM_WRITE_ON(O) to not just blindly
turn on the t_write thread.  Only do so if we have data.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
ospfd: Remove redundant asserts
assert(oi) is impossible all listgetdata(node) directly proceeding
it already asserts here, besides a node cannot be created
with a null pointer!
If list_isempty is called directly before the listhead call
it is impossilbe that we do not have a valid pointer here.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'ospfd/ospf_ism.h')
| -rw-r--r-- | ospfd/ospf_ism.h | 5 | 
1 files changed, 3 insertions, 2 deletions
diff --git a/ospfd/ospf_ism.h b/ospfd/ospf_ism.h index 5ae99ab320..8d21403695 100644 --- a/ospfd/ospf_ism.h +++ b/ospfd/ospf_ism.h @@ -53,8 +53,9 @@  			listnode_add((O)->oi_write_q, oi);                     \  			oi->on_write_q = 1;                                    \  		}                                                              \ -		thread_add_write(master, ospf_write, (O), (O)->fd,             \ -				 &(O)->t_write);                               \ +		if (!list_isempty((O)->oi_write_q))                            \ +			thread_add_write(master, ospf_write, (O), (O)->fd,     \ +					 &(O)->t_write);                       \  	} while (0)  /* Macro for OSPF ISM timer turn on. */  | 
