From e9767f5ce1f96756ff17e4d57dad235bf7c8f740 Mon Sep 17 00:00:00 2001 From: VIFEX Date: Thu, 18 Dec 2025 20:57:04 +0800 Subject: [PATCH] test(menu): fix double free and add full-feature coverage test (#9432) Signed-off-by: pengyiqiang --- src/widgets/menu/lv_menu.c | 14 +- tests/ref_imgs/widgets/menu_basic.png | Bin 0 -> 2718 bytes tests/ref_imgs/widgets/menu_bottom_header.png | Bin 0 -> 2442 bytes tests/ref_imgs/widgets/menu_section.png | Bin 0 -> 3139 bytes tests/ref_imgs/widgets/menu_sidebar.png | Bin 0 -> 3263 bytes tests/ref_imgs_vg_lite/widgets/menu_basic.png | Bin 0 -> 2666 bytes .../widgets/menu_bottom_header.png | Bin 0 -> 2402 bytes .../ref_imgs_vg_lite/widgets/menu_section.png | Bin 0 -> 2833 bytes .../ref_imgs_vg_lite/widgets/menu_sidebar.png | Bin 0 -> 3210 bytes tests/src/test_cases/widgets/test_menu.c | 713 ++++++++++++++++++ 10 files changed, 726 insertions(+), 1 deletion(-) create mode 100644 tests/ref_imgs/widgets/menu_basic.png create mode 100644 tests/ref_imgs/widgets/menu_bottom_header.png create mode 100644 tests/ref_imgs/widgets/menu_section.png create mode 100644 tests/ref_imgs/widgets/menu_sidebar.png create mode 100644 tests/ref_imgs_vg_lite/widgets/menu_basic.png create mode 100644 tests/ref_imgs_vg_lite/widgets/menu_bottom_header.png create mode 100644 tests/ref_imgs_vg_lite/widgets/menu_section.png create mode 100644 tests/ref_imgs_vg_lite/widgets/menu_sidebar.png create mode 100644 tests/src/test_cases/widgets/test_menu.c diff --git a/src/widgets/menu/lv_menu.c b/src/widgets/menu/lv_menu.c index 17cfa770be..27dc22fcd1 100644 --- a/src/widgets/menu/lv_menu.c +++ b/src/widgets/menu/lv_menu.c @@ -390,8 +390,20 @@ void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * pag for(i = 0; i < event_cnt; i++) { lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(obj, i); if(lv_event_dsc_get_cb(event_dsc) == lv_menu_load_page_event_cb) { - lv_obj_send_event(obj, LV_EVENT_DELETE, NULL); + /* Free the old event data */ + lv_menu_load_page_event_data_t * old_event_data = lv_event_dsc_get_user_data(event_dsc); lv_obj_remove_event(obj, i); + /* Also remove the corresponding DELETE event callback */ + event_cnt = lv_obj_get_event_count(obj); + for(uint32_t j = 0; j < event_cnt; j++) { + lv_event_dsc_t * del_dsc = lv_obj_get_event_dsc(obj, j); + if(lv_event_dsc_get_cb(del_dsc) == lv_menu_obj_delete_event_cb && + lv_event_dsc_get_user_data(del_dsc) == old_event_data) { + lv_obj_remove_event(obj, j); + break; + } + } + lv_free(old_event_data); break; } } diff --git a/tests/ref_imgs/widgets/menu_basic.png b/tests/ref_imgs/widgets/menu_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..3262e3e99969fe60d54869047d16c35a56a135f6 GIT binary patch literal 2718 zcmdUwYc$mR8pr=Lrp!)a*Ot2(ax1oph&^P+Evhl75EDa4YTIBTCMf0=f(H8*0Y}H`Fwxt$#BNn zOYczH0RVvXF$dd|03ZPe0MJ{gSODTf-1Y;&j(}sfR;S}Zi$itTJ6F|8NQ_M#1*BE$9#$!Wt&XTuQ-O;C5D%U zTv$%se8ZZ4LiVbsh3li_u)Vy%aD*Ip(Xq=Ye=&^r+o3|kmD9xP!r+l1a#Iv(=XxeO z=@-q`!=rgW2|v*X_2al%$!2pfcFo7N^Q`G$ZV6qSw>W>j{CXrwcKs^4^IWrt zR^1UcZZLMUjYKJM7;_ptJH9Py{6{;Z-29qe951NE82G4FPd{87~7C*U%-(WnC zZF8226|5zxWOAR;N&0!o<^rwBP3Q+08S``8>K;z44?op9p6y&4gfS+X<{qq;_VX+m zn!A;yw_QVN^^C@3AQY3YV!@UPLjg?Op?3hP8axjD~Wk*;*4clvOhnif^1s6=O2+3VzI zATsIRH0**@oIv>Kp;jlSPd)v?W)iAjQ@j1v45;0INfru+%c9Y6KX3JfrO`)Ct1q3^ z^TrM_ek?r-|A%iPaegCO_`E*)^>TTR8X03OEb$`|d2&%@=;F0D;{M51!e-^>1pbO;W#Jbh!?MCx@$ zizDSy_sVE9j+f8bIUP8%4Bl&Zal(=|Z*rntH)$MsfQG$x+=Cm7EGG1JN9vT=UoT0U zpgpcUGfO7Or);;2ui4vXf=(P2E>?Xx1~~_~V&1wq5`+}OZe;1oh&^exZN0b3rBx4N z)bMyjskrbsOUi(qwq9Rt&Tr#&@#(+!I3}}oIX44XQfJ^??U~%gvT)uH6WNWDZT!Q# z-o>>@vYU_i{lI^Dg3_v&bb`#_fnI}zNVG)wL7s&_LJX!Te6)53B~#-kXQ-n%6Z{Gw|9uKJy{(ZDFZ zk4oqnL|nx;QC?C{i8N~47Gf+{?&eKkk7jGyOLpPoTkFejGW+(?(c+! z$`HAsD*xoi$W%oqcFyL)?kV-SV=>`ULB#b?!nRJLF(buvGJ9^DLcQ2vPc-&@`Cb1t zQAkKlF)AO0SM4jx7%ywdx8EF@zYg^Pevw8A0xp9T zpaxSiP0rw)Nkbeg_o6rTG0TeY?b* OfMa%8+Zt=1)IR_uqubB` literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/menu_bottom_header.png b/tests/ref_imgs/widgets/menu_bottom_header.png new file mode 100644 index 0000000000000000000000000000000000000000..ea07797d6cc1ef2ba853df080740d8c2bb67ae01 GIT binary patch literal 2442 zcmds3`!^c~6pl!VcXTYMHrZLNWA$h~;!%$jRZ6@cMHALiEiLtoAcRxxFsxc_yrRR= zgJ42R5z%Z7_3ElAX^55DhDd6WM39*M0X=8Gt=&2IeD|FDIQRbY-TQs#hw{)+HBbcr z02-cW-2wmrMK}PU@EdqP0Kg`M7y|$*{+@2gAgls!`h)@<4x!UO-%DrvyM*9-1Ivx} zR-)BoNd`m~hsc!t9k^SmRF z-~xw$K_8t<=tkGq_LHGouuKk)5IgWMmgL%Dv3v3g1fmo#->e+!OQXM;jT@vFVX^jx zm25ut1x`C;%psspJ|uM~MBe!WPO3JutgTez^~79AP9u<;f%In1OZ;9|@Yrqh;pO z?K%5Xy=+Y#1lNV5SikM+hD0y+Zqr?Us1PmSo~)5>tf3txJ2T2{)`ZBka3#@BTxwU& zujA=<0-5Dj7alsc#!`s)fuD3+_eWZ;8^HMZj+!3Z?Sw%(_=WXjV!% z=5{>wdH3|nUDR5zG%*ut##_hRv`vj{U@fw7;!)oF{xJrb5gOBsFf>h{6q6(!T1P3b zLCFt=oZ(9WM+`+{zVoAxc9xdL7{k1k-~F34H4!k;0<4=WTiB`2v8P5u0C{?k8pq|W zg;g5f%z{(|;ZVxD5Ca|GeXU@g+@=^yTLWNE{vQbDVli?JC0-4CeC^B9rL7@kv!)Iv zPn%BEwweK*YF4T#DfLgX1{pP2&gxGC@0{t6>sCcJuoM!?E;J7MNr6<1i_VKlM`DW` zdsC~{yGe>Kq+pqWdZ#glG&c}%pJJcBCC?l^h2!NW8?nGNyN}z$5|~-bC#B8 z){}M+lzF+2p4qeIMj1Bsl{#lSCBx1{T8Xl(fw?x!ce3lu+NT$bcJfgvL84+h@YvZO zRxe(E^VpQq@b)cbqrWZfC5-gyIP88!EJNT+S%R`T%_OhV>h$fvB%=DF*3?4m{0xko zvqClcMOSiQ7#Sq0rUMB&-oY@6^hC5W?Sh7H`f)LijGHismG;(H37x891YAMH+(4YJ zr0R0${dQtu+Qp1A*1?S0L<*~@-^aR$=?*`DzsqghP%P%sHI~qwq&KBIn=ObdIw5Km z{F0xVrP#o^c!pXAM@@2Hp6paJZ{}T5P!V2rJVcl^C7%yy-L{Te_GD>wo_F%7EO~dB=$_7(qr)}; z#-suBF0}>8gztJiA4(;MwBQxPm?~YUnlC=1ut^NpR>5E&-i8l*0!!PQqwaEUSR1n> zI0|`yy9YpY}dBn8gg0(8riLMn(h#||Y@E%8el zyV;Sbt9&X=VnQ9hVLrP?l)YS;{BgRmGynU)CNROy$QW8y6m6novu>yrpZ6RBmKSs& z%8vy*13E{+Ac*`iVV8kET(SSdk&uK%%=J~<+10ly<6rm2+CA7m?Lfi@A&IKY>*FYH zk*HA3;bTZR7>I;`^IagId^iL|fP+CFVMxhP WJ6yyynR5R}WO=%y+}ck^<^K)ZSWQs? literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/menu_section.png b/tests/ref_imgs/widgets/menu_section.png new file mode 100644 index 0000000000000000000000000000000000000000..85f9d5ea5b4f91619c4bb21f47adad338c9761fd GIT binary patch literal 3139 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 Solp5b0j5VznG_p2hW`Wd47mCL literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/menu_sidebar.png b/tests/ref_imgs/widgets/menu_sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc1e5e47ba04f4ef7945835fa2cfb4e87c0fde8 GIT binary patch literal 3263 zcmdUydoE?c8UO z%V3bOiQ30)#857^1=&VoRKC=dwz7Pc#Z;zC{2K_Jmo8yxnhI504z3vNdt+S~W@W5yjZE=i3} zSt@)UsbIqtbofUY&~PFd%C@Z@&VANAWWb!*YH|e?7Nt_4F6(CdemeTh@oc1piY_{nXpX!m%k?tG z@jl}A3Q@8^`w*4_4j33516EW9{aI+=A0vn#@8-NImje{!9gSFG6v|W3vQSMwCMLVU9(0G;_eFf5rFyjb1tD*&-tH2Xc;X!QSI_%S@2-0@ZE^Cj@ zQ?SH7bxrWrv~;s90JWs2u`wAdKAJJkwIi;5(yvFlctN!7D}xcS9-FqNQohxIK*j|R zrcgxx$YKuFUiz;xE%D86@YC3m2_CdfD(pi~7*2h-2GCQ6Wk=1&4B#2B2^kVg| z-MeCisLL!jUhuxZJ*x5*0ee^Sf?ie816T+D3ITW+*SN}~``2y=E%|za&npR?@d*XLY`Po*qp)PJ0sd$(dB>JS*Da{YhFOy;(!n-!P)$nMTr4f{}fR z|Lj4=)vQqF+)ATPHZ^uFM3{U1u)a@ImForZ)lyaXMD*5!&bT&BNRK)s5z^%)X4I$G_k#!6&4(|2%P=cO& zvs-+>1usWdS>KZ-)@3vPRP~3UN$KN||Ls`Yu>}QmXf7F=Y^IHfZxy~&S{h{%gCQ+p*o#q=OT4V{oD`yjeI5>wODs;Hw|FL1*Ii(EH#--<;|J~=d>+qeDX$wH@J(eIsQCM zd>A*tGzI%dOfSceH4XCU!xl;0{Jr5>^(EiTJNN6n$6>8Ia&l`>pA*<0yp#9N`Y%+= zHWbJ6q3#+FPf4XQ32|csdBZ8f}3G<`07Lof9EtEs*mmbQ48?roI)$XJbIi9H)$etbI^&EF=Bo8 zXd$x+XeS)0>kBt9v`S?cxgodzzO1h_VbugtOSJMN{YJ|{fW0=$MS?{S?0~d1wp`bZ37?Bjn}=|q zLZ6myZm)FjjOq1+-DyG6L~rmM@#UV+RB8f3DWXzY_;#xsaCL-S%&X2YT_mr^TyDl# zA{Bfu3Z#(a2Ap-jU5Vp z@IjaV(umOJ-Lf;G3yrK#qM>^h65K2j(OwBAvdb2p35hj@=f$4SzF?f}U)b6zfA?;w zsbT)%Ij;E@^jPHVtJ%A&3B;rXE@!^gQ+ja~@LS*HMMiJ^lT*D~chFwC*s#{f2 z&U84FozI;S{@63Q2k6y>((MH}H+|uA+mn0R6(wPi6b#~fK7axH&4q`%>mh{fz#lba zF^yh>&5;l?3IRz$!5~-^OaP03kuiwxN$L#E@~svR29b74DCKSBjdhgRZ~Itv+!^Tj zKjuY=O4cU5F#BKJbU{JG>fEbZ5bNF{bOh-^Re)YKWr;0B>6Ppuu JxGGB@@*gSP`zZhb literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/menu_basic.png b/tests/ref_imgs_vg_lite/widgets/menu_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..a63bbf8aef50793da2cc9d887cd6cd683c65c266 GIT binary patch literal 2666 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 f2N)C_`(F&m69VbN_aQkSvX5 z$e?T$SwqEG!i>hCvCMqa)pgGGb-wHTIR8$6o*(yhJ%1CD4yKygU*Up}aJdsnf%MV#_=ac7Gim6`%2h=rZP&8n0ys)b~pS`+>eRIG%Y z15sU7DffY>>zZ8Ybh=eud(gXadwce<2GcBcO)07I`o^4W_1H7NzH4+R2NO}K>1kUe zLV9xwbiz;9H@ks>wkPdi444!1V)(Xri^4Uf+##6j(2xlK>;@k0*DEB+mb zwi+N)aabvy$EJ&=?;ApAbex)cM(!_;?xx)}co~G0Zw@b2FcsW0yJC7184*2#dOOCrXwkn@r(11ngC-!EG(@mk>!k7izs&HSv`UiH)>+kKP zIV^)k+r6GmH2S=#-SS^0ZlRyM3g{%!x|*9VA)HsEz|h8iH2)Kd*+I@-6yvQs+iM!7 z?M~&P-$DoCOO1miW23oSGDB01Mp6sw0P$C8`ZjJwPLc0HXpqIvQ-XG^bGZC2~Tw=<@%`T4&Y;q>D z1ntE2BksKclqvC_y3tFQV6px=ZuIR*z@Zx_|3!spZ)Aj881L-1?Q!^j?vOSkNQ}9-KsGbl=X32_ z<=sgc=1ChFfVn=>9B$0b$5O@N7RetHRe z=i*AKoRej}(yIvpY8FY(2ff;R5t%zcvdf!FE{07&NBg{&q#8*K?1f&Qvg|9>MUj{o ze2R-{%i7BMr`pppiq({^c;^SRS>aokE9^3T>TRx`B=a5iOPnEfHv=1f`{TyggeE&N zMaLt1v^m|y4jtRU^f4O;wTZ{o;I$5A__NZ==5{$`tA8j8N*h^T#^H^Qf;-%LEwVa)2RO*)`lkw!h?QZ1VoOn9hafd` z#e2O1o2**VgdBx+^baAlqIJKN-x0J!B{$4y&yf2pr#vA-2dr$~% z^|NlfAKvnnREeHXeqQJfT*w z^3jyAW{Qo|J;#cKnNdCU`iMGs9D_0DytsVKWqQZzN$y`O>8*{nZJ-d$NUm_Iaf*8|#ErI$t~+ zI&C-&4pAfdkY70Yhjv{FF^G)%q|gj=*E<!PfXHCIgf-w`4VMmRrdNoI3*Hne{i8hQ2Qo z#&f(BQl|M|JUu?c)(~!VfC!{Fmr3BmWOoBoFiDg0Wk%*e;lOn$k++!J9C&b-1Xb~jkwM%@FpZiE$X|(uEHD`+>m$X8}uu@G*bdGB$ zOe&Q%YA%CQ4}Sy;8meK&Re?mK%^AspxIW*wk;8E@Nt23Y2J#B0BGycBsG0|^Ij<6` zyajH$NhJ~@Wv7$xiO9v68rThok>DTO7^=5UOw?Y{g-EliSNLxJo=Xra3I9VUTf z(>4*Ks>AKq*w!wkFckzs6%9KDOoAP{WT7&J zidRVpP%SJZdYKQ5Uc%n2HO#Cu+*+k9(%0THzEQgB z2Vd3e)DMW!@=Y!nsraQ+c1HRcQS&My2r(GI{@( y?#yDEHWrbbcRDTx-?}a+