From d44bc76eb0bef223f03d039912d4724797078422 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Wed, 13 Nov 2019 14:35:39 +0900 Subject: [PATCH 01/16] Add secure option to vc_getengine Change-Id: Ie876da315ef1e32715bb15baaf983a77502fd3a1 Signed-off-by: sooyeon.kim (cherry picked from commit b9190b43567d57ba7085ea403a81d4e5ebe5a793) --- bin/aarch64/vc_getengine | Bin 12464 -> 14632 bytes bin/armv7l/vc_getengine | Bin 8776 -> 9884 bytes bin/i586/vc_getengine | Bin 13852 -> 13856 bytes bin/x86_64/vc_getengine | Bin 14672 -> 14680 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/aarch64/vc_getengine b/bin/aarch64/vc_getengine index 126ccd9184615bc3e1151e8c3dee309863fab7be..476a546d897af5cb3d6940ad640b26b9676a5999 100755 GIT binary patch literal 14632 zcmeHOeRNdEb)Vgpg!mFG5Fa+!ycJ-u9IZeg47M9qD}joQ9W0C3jpM9VtCh57*%iAh zEKpi6AH{BxCcJ}eD2?qEq%KlVQn{9EIBkQBb8>L(6BFXtPW@3K$1UeHN%0{uY;1Y^ zyYuFXVbNmFY5!^&o!LA0&b@c;z3}Fb{Qw-6CYe*@}-LTS$<`%T*FLSv?Ge z^v3!nTOTO5`X4B_G%`Fw2BDl#kmblcl51CT?MjZJq3mbK{*iA~8&rQbtVJIchQv!{ z{fCKWY9F32(aYc+7FjT4xqBf;c3y39D#m&>Uaq(tR`xUG>rfF6HC2S0%fq2aM`yX; z9}BcCU*?WS-AgRLNk8${-LpZCL}48#TUI}%7tyGH)q`ErUw8d-Xyw|)-bwG3nW<$v zV++uC8|os|TT!Wy&Rb;5`neu}@?$b8h0Bdfg;JIDuRxuLx(wBYx)PPjatp}oL%CF} z@G1oFWLD`Ez!fl8&q0$2UZsl5R(^~8b&BhRGmE|l^s)4> zhwNDN?cnD)YU)Kihn_I#V}wSGfKK)pS@ygm>9a1gbA66D%$4yh5)FoKjS!#a&|d=j zSbp{7ppVNzUz3Br0QNY?h`%cbe@hO(w&kF=z|AaIrQ@$a|5$OZ%rR~Uq{fOvCG0Q8 ztZGw(aDG0P!=5=g^goq@|7$t;tL1f^EKbtoL;1P|gj2@z@;tdk@$>yzv5R{ZeLXD> zC|}2TR0?zGc|M1o!;l+mzWhMiKUwUdMF{1Dx(RQ~;nzO!j1}i&ImZ1#4*r)xH&C<7 z{mS1)wLy3nda1mHI@Y+a&UOqV0)LG~x?HBZ**V!sl;p_HFWqBEDcG5eo(5!nd~JZeMdS7Hkd06Tw)+ z-8JE8B-r3@3I{KjZixkh!slz<1dZ{8KbG+ME@z4d6TY@!xE(`~mgdVj+WoQk7}_Jj zM}+UrExvkXOHJ4xkHf@PUmzUx$9%z9EE>C98;uugjYMNXUq@tPB>G51Ijx)<(=|k? zsiQLyjZ|9u4h!*x{ab@EA8G6eHH*uLiLLEHrUqg`e4Z?ruaL13H1(NoB8i7u~uO$@mheO*4?QCzwkTH4Xd@&HnN|id4hGOhp zpl)YthdZcPcYIf+X@2kn1Of)85ROgnpnr$FQL_p`OpzZ zrYif07pw^p@WDU)O24g(DeBg(_15?*-Aj09iAgGpP1pn`GAjKMM!Q&|F@<`mI6$#> zxE4QgS$`}c*%Xh}CLNZH#q&H++S3}S`^+b?4ReSf)&(l0YXrknKNYLrKHAUEEe>^~ zTCdjSMz!x^y4*BEet(7KBhz^wb|Q<;_o0(nbYAxh)xL%GFrHHUHrPY^NiK&qI`3<# zuV16n{+-Jajn2=0)HkTnX^+e0ZH-QQSuR5wy^4th7h7?#!%n`(6S+{Mt6Lk9g;S&J z`}bKIUEil08eR8ykw&LIJeS29ov$_ZtcK zbp2VOQKQpy1(!CBPS0Ij+BLd6wemkVdCx z9WG}yIzPWs-&u{$s~OQRXmolG<}%WCtarpA%e4#_ z1HYpe z;`j{x{jQUB>1xOsV(yzH$GJ$5<)MF6*7a%4Ue~A9-$dQ}66AJ3hxcqu^w>m|wD*m=G~j^Ly~~rn7k<2fYKUZgqc?Bmxrv_iNY`;W zhu9`5m#Q*t!jtw3@xt5iRoU6^`gL7;dnPl$bI=g0-lRGBI(URCBVB*fyQVl;3(M_TDdJ-1Nr0UaY_U8$Pj{pTzTfu}1eVd)Z-P?d^}hY%|XX9K9bp zruF^GF}-itQPS75RKSj8eJU!BdH~yD|B)KI$vko#k!Kc^B1t*)z{>{^L^H(Vk}@AIM)hd?Q_FPkP8D1_W~TR@nL} z@)ZYX19sr2VgFA*LmUt<%bz)Y6ToxYF|%yQF{h9CkKK-OpSPJGfcM}|n@RK=B#)3h zJsZW*SD>S3qvz=MnPM5mu>~;<3{D)4Eyr`nF{5lMWK-Yq9K|6+RVwN^IyX;j{=QQ* z%$+1Q|7MzK=z*`&zo7!N)RsJT$0SesG{zjn7#AF(tkEf|{sZ{4Gn4gv?O4COhC}0E zZj}bU*M586pGE|Q$$0G;{5vhn@b8k=~Y5({{6UTu1^$+ zfg#8YfcIm>&X_I+&P@@^PCKT-{~3KdKtJu6F57$2?m#RXkdsT1i_gljry~bTkb~1? zPDvXF$D5Q}uY-Thb!6WdJjqFt=f~jLor}jaS@Qe~c%B6h>1JI4Q3PMDF=;HaU;2tT zPc9S<--EAnonrHL#J6!O;$I>*?{Iq3sbaKeiOoApa2?RzH4FIzKfB=9M4RaT3Vd4$ z-#&EAhF{miuj~4xPss`9?(38F6xVaOPBi8|j7hT30X|wFmNeQ#1M%*jO+H)l0b?TU zyl!;9eFMCB94J`3T=5HKdDjVU3mx0b`uJ z#xF^EW+ZQoQa0-^-dUrJ5~bFkjkn8+gbUS{umTK&dc~WB$7gyD5_S<~`^qyFNh9!H;^f z&FdL&l5H0pHXM6<(k^8W<>y6v#*f-Vwk!fqDr=l!9w(J=E<-=XZYy{wp48r=+7w&D zW58jfEc*TBoWtHXSco+UaoPchx%LsBL8Lz-Rb)EE_5<6+6w`nmKN-pFi%${*jdrXR z$k*gJ(a>wRahYq%KLP6s=@}|A>7GP$nC?py`@mq48E_^KSn(*9 zYb)t@C8wCrjo{vdHDCz3Pmpe`NiP+Mh5+_+#80{?-lWUhIK?EH?~x4dpJVbQou(`0 zl=dHBKG=4dt|90W7T+GlC+$NF{t2Cjdg0g z7&zpx$@z`>))zo-U`;Ngz7+N+UjmM6w`2&{@YuIS`rokT;8jb*!FjZX&BQ*fqz`LA z{X=vQ0HwwXpr<^knhENSCKqUwhz>Nj`3a4Cc_$BlB#gJ!#!T z^Fd3(FN#0iC%uhR<$R<0NAqnp`f2T;xIB#Z3y^)uo~%bs9VHz@n3uSR^qu=u?GG_m zXF!f@t_1%Fh}AQ8YmV${bec2{t@FD?_W^IJ7}uEA${FO_)H3kDim{-356wfDsKWiw z(YFY6iWSAD5&KDs+4sS>26XagVAP+IzMm;OEPqP+yvC*e6hr18lt0VS&gIXsEPwW; zGcU-w2p?Wk@;9mRNrx5B>3z>ZZaaJ=|6Pd1t%${0&@6jIAK&9H`aZMo*XaLC==?FD zKpE-!=h2+&hOX`%RVL*b@~QuYrYf`BKK)h7!;i5R(Z1q5^051}n!Vc~pRkF6X^0(N zuS4777lsjA$~U?n#S4Vli2dp__G$m=%48b!92x2Q(dZtSa)tM|`tzlAt|o*$F@&A+ z{MhG@wZ_S6yjyLHZVFcTn>s?_=89PRCadAyuy$Q-#g=F&5Ts+gV5Bt^36?Lx(fHzu zcq~v6kO$%JfDjAfw;2oKixxEBY<$sp5a+Cwfkc>O9x`hDVH{z*TrL_XOV^d;nu0Aj zkTx#06o>FFq1N)25YE=AG>2lrKthO61jn-Bu%MGvDs*~IunaD4A*dSGS-ydDazmb| z^4XE1%fYN3@@Im$KNgL&8c@=)3CH~)sM6eIg@w-=uHgS8QpLvL)wUp$C*qDaQ}r&W)>Fy!+?tc7k!e+bP^8O4@jlN0>ZYf zUgUM&Xq!C=cWIPb)H$e+L#KSFSzXlccxw66Rkf3E@a|pKz4VF7Czp8t%6*`G^WNqa1kHRWY?ALHtBZ`M@}727Prjjg zul=hK_&NC2PP|jKYA3E%t<_pc!CrE-kYB$;Z3kVx z3$89YSy=PbH*8P;g-zP@xUKs!n|I$X+y0%l+9!6~p8RuLXu^B%Yc5G$%kX;##WD>& zM5!+FJXQGgIH{wcJHO_MyeA#C`|SH|4e!4`-wOUIo&R)^xDt02waQ6wFq2` zz_kecAB_ONkLUOA?55g|;O)Lu7~Y~9jGxWI>01CQ+)v*QP~msU{2eC0OK&h_H@-Bq z3V$!a?`ZkkQ+}7r-wn`Shzj@fy?ehJFW>4Gd(_Kte%Eg(M&1avjFINO13p~bKIv7M1P`>k~SuL1t9oWIYwTE+a`27jk7U%z0$Z_KDShmRT zg{*@HcXP0*1J6*g11~-x-16fkcPwhbcpJWnO8A>V--@rmLIL59L=!=GYox<1&o0Vw z5a15B`C4N1jhNM0?Oj`*@V5$gn?K$r-11u{lEBA%7zm%zZ=*XiG2_r_Z+B zv0&Iw0|__2D+|WjFX_fdS?-4e_~FrfZOy>I4ikkNUt5tFK83Q>w1?4ZjV9dO5N`Uc z&@u-nGBN*Fi(j=lLjN=P7{qBx^1RCR{~kOFuXBv!Ok1u2ET8@V6b3UY$m4w6?Ll{HF=xRO?zoN?rWl8s=m89rV*$$vCf<3_VJo>?ad0wv>@_L;eKlcAeO5Up!^7_wE1`T~APxlBOpXGlD8pVXyZN6VJ^kfNe{46dZ4xypTXa9fF9n7d;mO4?DC4XkV#mMkmq+Bc6WPVL67>t;>)8pUo0W zitS__EXO##pd=c{&$+}J(0P^ee*)Po6QydF=XoxP_{q*c{n|4R!9{BPKj=iXv&Z^x D=!@JP literal 12464 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 KC!(D@*8c*lbA@sM diff --git a/bin/armv7l/vc_getengine b/bin/armv7l/vc_getengine index 570f0cdce3dde6d7291e933066c130cabbb9f13c..7250e29d93426f360c7978d39804f9c76c6802e0 100755 GIT binary patch delta 4434 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 delta 4016 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 VmXdKqPM3^}vrD?*b=EM_@jpdvvAqBQ delta 5006 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 iR$k_@DkW~ds<7o{6()Sd*- Date: Mon, 25 Nov 2019 10:38:27 +0900 Subject: [PATCH 02/16] Fix memory leak issue using g_slist Change-Id: Ib37e5f748ef821eafb53b08e1a4093928ed39311 (cherry picked from commit f75ef72ecd870c338c8e6a1dce2deab589bd55dc) --- server/vcd_server.c | 89 +++++++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/server/vcd_server.c b/server/vcd_server.c index b1d5717..d632034 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -303,6 +303,21 @@ static bool __vcd_is_package_installed(const char* appid) return true; } +void __vc_free_deactivated_app(void* data) +{ + vc_deactivated_app_s* d_app = (vc_deactivated_app_s*)data; + + if (NULL != d_app) { + if (NULL != d_app->appid) { + free(d_app->appid); + d_app->appid = NULL; + } + + free(d_app); + d_app = NULL; + } +} + static bool __vcd_launch_app(const char* result) { if (NULL == result) { @@ -325,54 +340,43 @@ static bool __vcd_launch_app(const char* result) while (NULL != iter) { temp_app = iter->data; - if (NULL != temp_app) { - if (NULL != temp_app->appid) { - int ret = -1; - bool running = false; - ret = app_manager_is_running(temp_app->appid, &running); - if (APP_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to check running with appid(%s)", temp_app->appid); - free(temp_app->appid); - temp_app->appid = NULL; - free(temp_app); - temp_app = NULL; - return VCD_ERROR_OPERATION_FAILED; - } - if (false == running) { - int tmp_ret = __vcd_is_package_installed(temp_app->appid); - if (false == tmp_ret) { - SLOG(LOG_WARN, TAG_VCD, "[WARNING] app is not installed, appid(%s)", temp_app->appid); - } else { - ret = __vcd_activate_app_by_appcontrol(temp_app->appid); - if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to activate app"); - free(temp_app->appid); - temp_app->appid = NULL; - free(temp_app); - temp_app = NULL; - return ret; - } - SLOG(LOG_ERROR, TAG_VCD, "Launch app: appid(%s) result(%s)", temp_app->appid, result); - } + if (NULL != temp_app && NULL != temp_app->appid) { + int ret = -1; + bool running = false; + ret = app_manager_is_running(temp_app->appid, &running); + if (APP_MANAGER_ERROR_NONE != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to check running with appid(%s)", temp_app->appid); + g_slist_free_full(iter, __vc_free_deactivated_app); + return VCD_ERROR_OPERATION_FAILED; + } + if (false == running) { + int tmp_ret = __vcd_is_package_installed(temp_app->appid); + if (false == tmp_ret) { + SLOG(LOG_WARN, TAG_VCD, "[WARNING] app is not installed, appid(%s)", temp_app->appid); } else { - ret = __vcd_resume_app(temp_app->appid); + ret = __vcd_activate_app_by_appcontrol(temp_app->appid); if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to resume app"); - free(temp_app->appid); - temp_app->appid = NULL; - free(temp_app); - temp_app = NULL; + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to activate app"); + g_slist_free_full(iter, __vc_free_deactivated_app); return ret; } - SLOG(LOG_ERROR, TAG_VCD, "Resume app: appid(%s) result(%s)", temp_app->appid, result); + SLOG(LOG_ERROR, TAG_VCD, "Launch app: appid(%s) result(%s)", temp_app->appid, result); } - free(temp_app->appid); - temp_app->appid = NULL; + } else { + ret = __vcd_resume_app(temp_app->appid); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to resume app"); + g_slist_free_full(iter, __vc_free_deactivated_app); + return ret; + } + SLOG(LOG_ERROR, TAG_VCD, "Resume app: appid(%s) result(%s)", temp_app->appid, result); } - free(temp_app); + __vc_free_deactivated_app((void*)temp_app); temp_app = NULL; } - iter = g_slist_next(iter); + app_list = g_slist_remove_link(app_list, iter); + g_slist_free(iter); + iter = g_slist_nth(app_list, 0); } app_list = NULL; } @@ -409,6 +413,8 @@ static Eina_Bool __vcd_send_selected_result(void *data) ret = vcdc_send_result(temp_cmd->pid, vcd_client_manager_get_pid(), temp_cmd->type); if (0 != ret) { SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send result, ret(%d)", ret); + g_slist_free_full(pid_list, free); + pid_list = NULL; break; } else { SLOG(LOG_ERROR, TAG_VCD, "[Server] Send result : pid(%d) type(%d)", temp_cmd->pid, temp_cmd->type); @@ -420,6 +426,7 @@ static Eina_Bool __vcd_send_selected_result(void *data) temp_cmd = NULL; } pid_list = g_slist_remove_link(pid_list, iter); + g_slist_free(iter); iter = g_slist_nth(pid_list, 0); } } @@ -3268,4 +3275,4 @@ int vcd_set_tts_audio_format_request_cb(vce_tts_audio_format_request_cb callback } return ret; -} +} \ No newline at end of file -- 2.7.4 From c9e5a54f9aefa689372df3a452189d5a6d1087bc Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Wed, 12 Feb 2020 18:51:22 +0900 Subject: [PATCH 03/16] Fixed cynara log Change-Id: I5bae4742308bcfd1039bd28a5e87efaf3dc17d14 Signed-off-by: sungrae jo --- client/vc.c | 6 +++++- client/vc_mgr.c | 5 +++-- common/vc_command.c | 6 +++++- server/vce.c | 6 +++++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/vc.c b/client/vc.c index 3b21cb0..7ee1667 100644 --- a/client/vc.c +++ b/client/vc.c @@ -136,7 +136,11 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) - cynara_finish(p_cynara); + { + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cynara finish %d", ret); + } p_cynara = NULL; } diff --git a/client/vc_mgr.c b/client/vc_mgr.c index 7a18e56..b20079e 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -202,8 +202,9 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) { - SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] cynara finish"); - cynara_finish(p_cynara); + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cynara finish %d", ret); } p_cynara = NULL; } diff --git a/common/vc_command.c b/common/vc_command.c index 6319427..c0dc496 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -125,7 +125,11 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) - cynara_finish(p_cynara); + { + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] cynara finish %d", ret); + } p_cynara = NULL; } diff --git a/server/vce.c b/server/vce.c index 7825c9a..e9302f3 100644 --- a/server/vce.c +++ b/server/vce.c @@ -101,7 +101,11 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) - cynara_finish(p_cynara); + { + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] cynara finish %d", ret); + } p_cynara = NULL; } -- 2.7.4 From 1f9bf314ed63e112028ab0694964faf02225047d Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Mon, 17 Feb 2020 11:03:27 +0900 Subject: [PATCH 04/16] Fix unreachable code Change-Id: I0e4f801860cde9c53ad060ef7d4f168e3a2805c0 Signed-off-by: Suyeon Hwang --- common/vc_cmd_db.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index c32971a..4450794 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -2161,7 +2161,7 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ vc_cmd_s* tmp_cmd = __vc_db_command_copy(cmd); int ret = __vc_db_generate_command(tmp_cmd, &fixed_cmd, &cmd_list); - if (0 != ret) { + if (VC_DB_ERROR_NONE != ret) { SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to generate command, %d", ret); if (NULL != tmp_cmd) { @@ -2191,11 +2191,6 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd); if (ret != VC_DB_ERROR_NONE) { - if (NULL != fixed_cmd) { - free(fixed_cmd); - fixed_cmd = NULL; - } - __vc_db_command_destroy((vc_cmd_h)tmp_cmd); break; } @@ -2209,11 +2204,6 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd); if (ret != VC_DB_ERROR_NONE) { - if (NULL != fixed_cmd) { - free(fixed_cmd); - fixed_cmd = NULL; - } - __vc_db_command_destroy((vc_cmd_h)tmp_cmd); break; } } @@ -2239,14 +2229,8 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ g_slist_free(cmd_list); SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command, %d", ret); - - if (NULL != fixed_cmd) { - free(fixed_cmd); - fixed_cmd = NULL; - } - - return ret; } + cmd_list = NULL; } @@ -2256,10 +2240,12 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ } if (NULL != tmp_cmd) { - SLOG(LOG_DEBUG, vc_db_tag(), "[DEBUG] command destroy"); __vc_db_command_destroy((vc_cmd_h)tmp_cmd); + tmp_cmd = NULL; + SLOG(LOG_DEBUG, vc_db_tag(), "[DEBUG] command destroy"); } - return VC_DB_ERROR_NONE; + + return ret; } int vc_db_insert_command(int pid, vc_cmd_type_e type, vc_cmd_s* cmd, bool skip_invocation) -- 2.7.4 From 025ecd988e36bac6e3be88ab2771e645cfd9fdd2 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 17 Feb 2020 21:01:31 +0900 Subject: [PATCH 05/16] Clean up vc_command file. Change-Id: If52823d88ae98b95a6ded59e67621d313a6815ab Signed-off-by: sungrae jo --- common/vc_command.c | 467 ++++++++++++++++++---------------------------------- 1 file changed, 158 insertions(+), 309 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index c0dc496..2446284 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -165,74 +165,6 @@ static int __vc_cmd_check_privilege() return VC_ERROR_NONE; } -static bool __vc_cmd_is_valid(vc_cmd_h vc_command) -{ - if (NULL == g_cmd_list) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid"); - return false; - } - - if (g_list_length(g_cmd_list) == 0) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid"); - return false; - } - - bool flag = false; - vc_cmd_s *command = NULL; - command = (vc_cmd_s *)vc_command; - - GList *iter = NULL; - iter = g_list_first(g_cmd_list); - while (NULL != iter) { - vc_cmd_s *data = NULL; - data = iter->data; - if (NULL != data && command == data) { - flag = true; - break; - } - iter = g_list_next(iter); - } - - if (false == flag) - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] command(%p) is not valid", command); - - return flag; -} - -static bool __vc_cmd_list_is_valid(vc_cmd_list_h vc_cmd_list) -{ - if (NULL == g_cmdlist_list) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid"); - return false; - } - - if (g_list_length(g_cmdlist_list) == 0) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid"); - return false; - } - - bool flag = false; - vc_cmd_list_s *list = NULL; - list = (vc_cmd_list_s *)vc_cmd_list; - - GList *iter = NULL; - iter = g_list_first(g_cmdlist_list); - while (NULL != iter) { - vc_cmd_list_s *data = NULL; - data = iter->data; - if (NULL != data && list == data) { - flag = true; - break; - } - iter = g_list_next(iter); - } - - if (false == flag) - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] list(%p) is not valid", list); - - return flag; -} - int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) { if (0 != __vc_cmd_get_feature_enabled()) { @@ -280,11 +212,6 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) return VC_ERROR_INVALID_PARAMETER; } - if (false == __vc_cmd_list_is_valid(vc_cmd_list)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); - return VC_ERROR_INVALID_PARAMETER; - } - vc_cmd_list_remove_all(vc_cmd_list, release_command); vc_cmd_list_s* list = NULL; @@ -293,34 +220,19 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list); GList *iter = NULL; - vc_cmd_list_s *data = NULL; - - /* if list have item */ - if (g_list_length(g_cmdlist_list) > 0) { - /* Get a first item */ - iter = g_list_first(g_cmdlist_list); - - while (NULL != iter) { - data = iter->data; - if (NULL != data && list == data) { - g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); - - free(data); - data = NULL; - - SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); - g_list_free(iter); - iter = NULL; - - return VC_ERROR_NONE; - } - /* Next item */ - iter = g_list_next(iter); - } + iter = g_list_find(g_cmdlist_list, list); + if (NULL == iter) { + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); + return VC_ERROR_INVALID_PARAMETER; } - SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); - return VC_ERROR_INVALID_PARAMETER; + g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); + if (iter->data) + free(iter->data); + iter->data = NULL; + iter = NULL; + SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); + return VC_ERROR_NONE; } int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count) @@ -400,41 +312,52 @@ int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd); - vc_cmd_s* temp_cmd = NULL; GSList *iter = NULL; - - iter = g_slist_nth(list->list, 0); - - while (NULL != iter) { - temp_cmd = iter->data; - - if (NULL != temp_cmd && cmd == temp_cmd) { - list->list = g_slist_remove(list->list, temp_cmd); - /* - if (true == release_command) { - SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data"); - if (NULL != temp_cmd->command) free(temp_cmd->command); - if (NULL != temp_cmd->parameter) free(temp_cmd->parameter); - free(temp_cmd); - temp_cmd = NULL; - } - */ - } - - iter = g_slist_next(iter); + iter = g_slist_find(list->list, cmd); + if (NULL == iter) { + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid"); + return VC_ERROR_INVALID_PARAMETER; } - int count = g_slist_length(list->list); + list->list = g_slist_remove_link(list->list, iter); + SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command"); - if (0 == count) { + int len = g_slist_length(list->list); + if (0 == len) list->index = -1; - } else if (list->index == count) { - list->index = count - 1; - } + else if (list->index == len) + list->index = len - 1; return VC_ERROR_NONE; } +static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data) +{ + vc_cmd_s *temp = NULL; + temp = data; + if (temp) { + SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp); + if (temp->command) + free(temp->command); + temp->command = NULL; + if (temp->parameter) + free(temp->parameter); + temp->parameter = NULL; + if (temp->appid) + free(temp->appid); + temp->appid = NULL; + if (temp->invocation_name) + free(temp->invocation_name); + temp->invocation_name = NULL; + if (temp->fixed) + free(temp->fixed); + temp->fixed = NULL; + free(temp); + } + temp = NULL; + return; +} + int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command) { if (0 != __vc_cmd_get_feature_enabled()) { @@ -457,25 +380,9 @@ int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)" , list, release_command ? "true" : "false"); - int count = g_slist_length(list->list); - for (int i = 0; i < count ; i++) { - vc_cmd_s *temp_cmd = g_slist_nth_data(list->list, 0); - - if (NULL != temp_cmd) { - list->list = g_slist_remove(list->list, temp_cmd); - - if (true == release_command) { - SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd); - if (NULL != temp_cmd->command) free(temp_cmd->command); - if (NULL != temp_cmd->parameter) free(temp_cmd->parameter); - if (NULL != temp_cmd->appid) free(temp_cmd->appid); - if (NULL != temp_cmd->invocation_name) free(temp_cmd->invocation_name); - if (NULL != temp_cmd->fixed) free(temp_cmd->fixed); - free(temp_cmd); - temp_cmd = NULL; - } - } - } + if (true == release_command) + g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL); + g_slist_free(list->list); list->list = NULL; list->index = -1; @@ -501,28 +408,18 @@ int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callb vc_cmd_list_s* list = NULL; list = (vc_cmd_list_s*)vc_cmd_list; - int count = g_slist_length(list->list); - int i ; - GSList *iter = NULL; - vc_cmd_s *temp_cmd; - iter = g_slist_nth(list->list, 0); - - for (i = 0; i < count; i++) { - if (NULL == iter) { + while (NULL != iter) { + vc_cmd_s *temp_cmd = NULL; + temp_cmd = iter->data; + if (NULL == temp_cmd) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list"); return VC_ERROR_OPERATION_FAILED; } + if (false == callback((vc_cmd_h)temp_cmd, user_data)) + break; - temp_cmd = iter->data; - - if (NULL != temp_cmd) { - if (false == callback((vc_cmd_h)temp_cmd, user_data)) { - break; - } - - } iter = g_slist_next(iter); } @@ -561,56 +458,45 @@ int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* return VC_ERROR_OPERATION_FAILED; } - int count = g_slist_length(list->list); - int i; - GSList *iter = NULL; - vc_cmd_s *iter_cmd; - iter = g_slist_nth(list->list, 0); - - for (i = 0; i < count; i++) { - if (NULL == iter) { + while (NULL != iter) { + vc_cmd_s *iter_cmd = NULL; + iter_cmd = iter->data; + if (NULL == iter_cmd) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list"); return VC_ERROR_OPERATION_FAILED; } - if (NULL != iter->data) { - iter_cmd = iter->data; - - if (NULL != iter_cmd) { - int iter_type; - if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type"); - continue; - } - if (iter_type == type) { - vc_cmd_h temp_cmd; - if (0 != vc_cmd_create(&temp_cmd)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd"); - continue; - } - - memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s)); - if (NULL != iter_cmd->command) { - ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command); - } - if (NULL != iter_cmd->parameter) { - ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter); - } - - if (0 != vc_cmd_list_add(temp_list, temp_cmd)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add"); - vc_cmd_destroy(temp_cmd); - continue; - } - } + int iter_type = 0; + if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type"); + continue; + } + + if (iter_type == type) { + vc_cmd_h temp_cmd; + if (0 != vc_cmd_create(&temp_cmd)) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd"); + continue; + } + + memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s)); + if (NULL != iter_cmd->command) + ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command); + if (NULL != iter_cmd->parameter) + ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter); + + if (0 != vc_cmd_list_add(temp_list, temp_cmd)) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add"); + vc_cmd_destroy(temp_cmd); + continue; } } iter = g_slist_next(iter); } - count = 0; + int count = 0; if (0 != vc_cmd_list_get_count(temp_list, &count)) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count"); } else { @@ -835,67 +721,40 @@ int vc_cmd_destroy(vc_cmd_h vc_command) return VC_ERROR_INVALID_PARAMETER; } - if (false == __vc_cmd_is_valid(vc_command)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); - return VC_ERROR_INVALID_PARAMETER; - } - vc_cmd_s* command = NULL; command = (vc_cmd_s*)vc_command; SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command); - bool flag = false; GList *iter = NULL; - iter = g_list_first(g_cmd_list); - while (NULL != iter) { - vc_cmd_s *data = NULL; - data = iter->data; - if (NULL != data && command == data) { - g_cmd_list = g_list_remove_link(g_cmd_list, iter); - flag = true; - break; - } - iter = g_list_next(iter); - } - - if (false == flag) { - SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); + iter = g_list_find(g_cmd_list, command); + if (NULL == iter) { + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid"); return VC_ERROR_INVALID_PARAMETER; } - if (iter) - g_list_free(iter); - iter = NULL; + g_cmd_list = g_list_remove_link(g_cmd_list, iter); - if (NULL != command) { - if (NULL != command->command) { - free(command->command); - command->command = NULL; - } - if (NULL != command->parameter) { - free(command->parameter); - command->parameter = NULL; - } - if (NULL != command->invocation_name) { - free(command->invocation_name); - command->invocation_name = NULL; - } - if (NULL != command->appid) { - free(command->appid); - command->appid = NULL; - } - if (NULL != command->fixed) { - free(command->fixed); - command->fixed = NULL; - } - if (NULL != command->coordinates) { - free(command->coordinates); - command->coordinates = NULL; - } - free(command); - command = NULL; - } + if (command->command) + free(command->command); + command->command = NULL; + if (command->parameter) + free(command->parameter); + command->parameter = NULL; + if (command->invocation_name) + free(command->invocation_name); + command->invocation_name = NULL; + if (command->appid) + free(command->appid); + command->appid = NULL; + if (command->fixed) + free(command->fixed); + command->fixed = NULL; + if (command->coordinates) + free(command->coordinates); + command->coordinates = NULL; + free(command); + command = NULL; return VC_ERROR_NONE; } @@ -917,10 +776,8 @@ int vc_cmd_set_id(vc_cmd_h vc_command, int id) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd) { - cmd->id = id; - SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id); - } + cmd->id = id; + SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id); return 0; } @@ -942,10 +799,8 @@ int vc_cmd_get_id(vc_cmd_h vc_command, int* id) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd) { - *id = cmd->id; - SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id); - } + *id = cmd->id; + SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id); return 0; } @@ -969,11 +824,9 @@ int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->appid) { + if (cmd->appid) free(cmd->appid); - cmd->appid = NULL; - } - + cmd->appid = NULL; cmd->appid = strdup(appid); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid); @@ -994,11 +847,13 @@ int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->appid) { + if (cmd->appid) *appid = strdup(gettext(cmd->appid)); - } + else + *appid = NULL; SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid); + return 0; } @@ -1019,15 +874,10 @@ int vc_cmd_set_command(vc_cmd_h vc_command, const char* command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->command) { + if (cmd->command) free(cmd->command); - } - cmd->command = NULL; - - if (NULL != command) { - cmd->command = strdup(command); - } + cmd->command = strdup(command); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command); @@ -1051,9 +901,10 @@ int vc_cmd_get_command(vc_cmd_h vc_command, char** command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->command) { + if (cmd->command) *command = strdup(gettext(cmd->command)); - } + else + *command = NULL; SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command); @@ -1069,7 +920,7 @@ int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command) return VC_ERROR_PERMISSION_DENIED; } - if (NULL == vc_command) { + if (NULL == vc_command || NULL == command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter "); return VC_ERROR_INVALID_PARAMETER; } @@ -1077,16 +928,11 @@ int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->parameter) { + if (cmd->parameter) free(cmd->parameter); - } - cmd->parameter = NULL; - - if (NULL != command) { - cmd->parameter = strdup(command); - SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter); - } + cmd->parameter = strdup(command); + SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter); return 0; } @@ -1105,10 +951,12 @@ int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->parameter) { + if (cmd->parameter) *command = strdup(gettext(cmd->parameter)); - SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command); - } + else + *command = NULL; + + SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command); return 0; } @@ -1132,11 +980,9 @@ int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->fixed) { + if (cmd->fixed) free(cmd->fixed); - cmd->fixed = NULL; - } - + cmd->fixed = NULL; cmd->fixed = strdup(fixed); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed); @@ -1157,10 +1003,12 @@ int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->fixed) { + if (cmd->fixed) *fixed = strdup(gettext(cmd->fixed)); - SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed); - } + else + *fixed = NULL; + + SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed); return 0; } @@ -1184,11 +1032,9 @@ int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->invocation_name) { + if (cmd->invocation_name) free(cmd->invocation_name); - cmd->invocation_name = NULL; - } - + cmd->invocation_name = NULL; cmd->invocation_name = strdup(invocation_name); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name); @@ -1209,9 +1055,10 @@ int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->invocation_name) { + if (cmd->invocation_name) *invocation_name = strdup(gettext(cmd->invocation_name)); - } + else + *invocation_name = NULL; SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name); return 0; @@ -1483,18 +1330,20 @@ int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list) SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @"); SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list); - int count = g_slist_length(list->list); - - int i; - vc_cmd_s *cmd = NULL; - - for (i = 0; i < count ; i++) { - cmd = g_slist_nth_data(list->list, i); - - if (NULL != cmd) { - SLOG(LOG_DEBUG, TAG_VCCMD, " [%d][%p] PID(%d) ID(%d) Type(%d) Format(%d) Command(%s) Param(%s) Appid(%s) Invocation(%s) Fixed(%s)", - i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed); + int i = 0; + GSList *iter = NULL; + iter = g_slist_nth(list->list, 0); + while (NULL != iter) { + vc_cmd_s *cmd = NULL; + cmd = iter->data; + if (NULL == cmd) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list"); + return VC_ERROR_OPERATION_FAILED; } + SLOG(LOG_DEBUG, TAG_VCCMD, " [%d][%p] PID(%d) ID(%d) Type(%d) Format(%d) Command(%s) Param(%s) Appid(%s) Invocation(%s) Fixed(%s)", + i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed); + + iter = g_slist_next(iter); } SLOG(LOG_DEBUG, TAG_VCCMD, "@@@"); -- 2.7.4 From e6032ff63ee71c9eb76a0cd639a271563d1319d2 Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Tue, 18 Feb 2020 10:32:32 +0900 Subject: [PATCH 06/16] Fix double locking issue Change-Id: I8d825919a361e0f42c172ae0d9e3f618de081256 Signed-off-by: Suyeon Hwang --- common/vc_config_mgr.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/common/vc_config_mgr.c b/common/vc_config_mgr.c index 76a3bca..2a34402 100644 --- a/common/vc_config_mgr.c +++ b/common/vc_config_mgr.c @@ -73,6 +73,7 @@ static pthread_mutex_t vc_config_engine_mutex = PTHREAD_MUTEX_INITIALIZER; static int __vc_config_mgr_register_engine_config_updated_event(const char* path); static int __vc_config_mgr_unregister_engine_config_updated_event(); +static int __vc_config_mgr_set_default_language(const char* language); int __vc_config_mgr_print_engine_info(); int __vc_config_mgr_print_client_info(); @@ -464,7 +465,7 @@ static Eina_Bool __vc_config_mgr_engine_config_inotify_event_callback(void* data SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to get language"); } - ret = vc_config_mgr_set_default_language(temp_lang); + ret = __vc_config_mgr_set_default_language(temp_lang); if (0 != ret) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to set language"); } else { @@ -1705,17 +1706,14 @@ int vc_config_mgr_get_default_language(char** language) return 0; } -int vc_config_mgr_set_default_language(const char* language) +static int __vc_config_mgr_set_default_language(const char* language) { - pthread_mutex_lock(&vc_config_mgr_mutex); if (0 >= g_slist_length(g_config_client_list)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Not initialized"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } if (NULL == language) { - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } @@ -1723,21 +1721,27 @@ int vc_config_mgr_set_default_language(const char* language) if (NULL != g_config_info->language) { if (0 != vc_parser_set_language(language)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to save engine id"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } free(g_config_info->language); g_config_info->language = strdup(language); } else { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] language is NULL"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } - pthread_mutex_unlock(&vc_config_mgr_mutex); return 0; } +int vc_config_mgr_set_default_language(const char* language) +{ + pthread_mutex_lock(&vc_config_mgr_mutex); + int ret = __vc_config_mgr_set_default_language(language); + pthread_mutex_unlock(&vc_config_mgr_mutex); + + return ret; +} + int vc_config_mgr_get_enabled(bool* value) { pthread_mutex_lock(&vc_config_mgr_mutex); -- 2.7.4 From f38527d857a2ae505ea6988d9a94642b0188d358 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Tue, 18 Feb 2020 13:37:05 +0900 Subject: [PATCH 07/16] Added no-repeat code for privilege Change-Id: Id53d6203e1c3b25d94b35c19061b25a689675a90 Signed-off-by: sungrae jo --- client/vc.c | 39 +++++++++++++++++++++++---------------- client/vc_mgr.c | 3 +++ common/vc_command.c | 5 ++++- server/vce.c | 40 ++++++++++++++++++++++++---------------- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/client/vc.c b/client/vc.c index 7ee1667..cd57765 100644 --- a/client/vc.c +++ b/client/vc.c @@ -54,6 +54,7 @@ static vc_h g_vc = NULL; static int g_daemon_pid = 0; static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; static bool g_backup = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -146,27 +147,33 @@ static void __check_privilege_deinitialize() static int __vc_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied"); + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VC_ERROR_NONE; } diff --git a/client/vc_mgr.c b/client/vc_mgr.c index b20079e..eb6c3b8 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -211,6 +211,9 @@ static void __check_privilege_deinitialize() static int __vc_mgr_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); if (false == g_privilege_allowed) { diff --git a/common/vc_command.c b/common/vc_command.c index 2446284..0d22bc5 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -34,7 +34,7 @@ #include "voice_control_key_defines.h" static int g_feature_enabled = -1; -static bool g_privilege_allowed = false; +static bool g_privilege_allowed = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -135,6 +135,9 @@ static void __check_privilege_deinitialize() static int __vc_cmd_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); if (false == g_privilege_allowed) { diff --git a/server/vce.c b/server/vce.c index e9302f3..970f521 100644 --- a/server/vce.c +++ b/server/vce.c @@ -26,6 +26,8 @@ #include "vce.h" static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; + static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -111,27 +113,33 @@ static void __check_privilege_deinitialize() static int __vce_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] privilege initialize is failed"); - pthread_mutex_unlock(&g_cynara_mutex); - return VCE_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] privilege initialize is failed"); + pthread_mutex_unlock(&g_cynara_mutex); + return VCE_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VCE_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Permission is denied"); + pthread_mutex_unlock(&g_cynara_mutex); + return VCE_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VCE_ERROR_NONE; } -- 2.7.4 From 375b93bf6a29ff6572cc948b0877d814c8019fc9 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Tue, 18 Feb 2020 14:33:36 +0900 Subject: [PATCH 08/16] Add a null checker Change-Id: If9508e574b0466d0f46217a9a3cc26d552dbde0d Signed-off-by: sooyeon.kim --- common/vc_json_parser.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/vc_json_parser.c b/common/vc_json_parser.c index 65957db..d6be245 100644 --- a/common/vc_json_parser.c +++ b/common/vc_json_parser.c @@ -184,7 +184,9 @@ static int __vc_json_set_commands(JsonObject *root_obj, int type, char* invocati cmd->domain = temp; temp_text = json_object_get_string_member(object, "cmd"); - cmd->command = strdup(temp_text); + if (NULL != temp_text) + cmd->command = strdup(temp_text); + if (NULL == cmd->command) { SLOG(LOG_ERROR, vc_json_tag(), "[ERROR] Fail to allocate memory"); free(temp_type); -- 2.7.4 From 2ce48a5f8010ed55dcd963c95f00b97ed0f57ebe Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Wed, 19 Feb 2020 13:28:54 +0900 Subject: [PATCH 09/16] Using vc_cmd_destory in remove_all_foreach function. Change-Id: I51780aadfd55a5ef36626f0ac56ab2f6ccc8e93d Signed-off-by: sungrae jo --- common/vc_command.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index 0d22bc5..8ff7138 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -340,24 +340,9 @@ static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data) temp = data; if (temp) { SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp); - if (temp->command) - free(temp->command); - temp->command = NULL; - if (temp->parameter) - free(temp->parameter); - temp->parameter = NULL; - if (temp->appid) - free(temp->appid); - temp->appid = NULL; - if (temp->invocation_name) - free(temp->invocation_name); - temp->invocation_name = NULL; - if (temp->fixed) - free(temp->fixed); - temp->fixed = NULL; - free(temp); - } - temp = NULL; + vc_cmd_destroy((vc_cmd_h)temp); + temp = NULL; + } return; } -- 2.7.4 From c76b16ebf05b886983371bfbaf41918aaccb4959 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Thu, 20 Feb 2020 11:07:46 +0900 Subject: [PATCH 10/16] Fixed vce option callback in vce_main Change-Id: Ica044b049d524c4e5ee1597428040e1acc81a58f Signed-off-by: sungrae jo --- include/vce.h | 2 +- server/vcd_engine_agent.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/vce.h b/include/vce.h index b73fabd..31747a0 100644 --- a/include/vce.h +++ b/include/vce.h @@ -627,7 +627,7 @@ typedef int (*vce_tts_audio_format_request_cb)(int* rate, int* channel, int* aud * @brief A structure for the VC engine functions. * @details This structure contains essential callback functions for operating VC engine. * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif - * @remarks These functions ar mandatory for operating VC engine. Therefore, all functions MUST be implemented. + * @remarks You must register all callbacks except optional callbacks for operating VC engine. */ typedef struct { int version; /**< Version */ diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 345959f..4750284 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -231,10 +231,11 @@ static int __internal_get_engine_info(vce_request_callback_s* callback) g_dynamic_engine.callbacks->process_list_event = callback->process_list_event; g_dynamic_engine.callbacks->process_haptic_event = callback->process_haptic_event; - g_dynamic_engine.callbacks->private_data_set = NULL; - g_dynamic_engine.callbacks->private_data_request = NULL; - g_dynamic_engine.callbacks->nlu_base_info_request = NULL; - g_dynamic_engine.callbacks->specific_engine_request = NULL; + g_dynamic_engine.callbacks->private_data_set = callback->private_data_set; + g_dynamic_engine.callbacks->private_data_request = callback->private_data_request; + g_dynamic_engine.callbacks->nlu_base_info_request = callback->nlu_base_info_request; + g_dynamic_engine.callbacks->specific_engine_request = callback->specific_engine_request; + g_dynamic_engine.internal_callbacks->request_tts = NULL; g_dynamic_engine.internal_callbacks->request_tts_user_data = NULL; g_dynamic_engine.internal_callbacks->cancel_tts = NULL; -- 2.7.4 From b1148e7cbafd24ae125ec6abdd39523f3463fc13 Mon Sep 17 00:00:00 2001 From: kismo Date: Tue, 28 Jan 2020 15:03:01 +0900 Subject: [PATCH 11/16] service state changed callback - before : VC_SERVICE_STATE_NONE >> VC_SERVICE_STATE_READY changed callback is not called in main thread. - after : all the time, service state changed callback is called in main thread. Change-Id: I3dffe70e463b1991ffedfff572d29d6afb876ce0 (cherry picked from commit fad6d24fdd7f6cf400fc0ade63ec349811fd830b) --- client/vc_mgr.c | 20 +------------------- server/vcd_server.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 19 deletions(-) mode change 100644 => 100755 client/vc_mgr.c mode change 100644 => 100755 server/vcd_server.c diff --git a/client/vc_mgr.c b/client/vc_mgr.c old mode 100644 new mode 100755 index eb6c3b8..ed9bd15 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -457,25 +457,6 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data) /* Success to connect */ } - /* Set service state */ - vc_service_state_e previous_service_state; - vc_mgr_client_get_service_state(g_vc_m, &previous_service_state); - - vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state); - - vc_service_state_changed_cb service_changed_callback = NULL; - void* user_data = NULL; - vc_mgr_client_get_service_state_changed_cb(g_vc_m, &service_changed_callback, &user_data); - - if (NULL != service_changed_callback) { - vc_mgr_client_use_callback(g_vc_m); - service_changed_callback(previous_service_state, service_state, user_data); - vc_mgr_client_not_use_callback(g_vc_m); - SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called"); - } else { - SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null"); - } - /* Set foreground */ vc_mgr_client_set_foreground(g_vc_m, foreground, true); @@ -485,6 +466,7 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data) vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY); vc_state_changed_cb changed_callback = NULL; + void* user_data = NULL; vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data); vc_state_e current_state; diff --git a/server/vcd_server.c b/server/vcd_server.c old mode 100644 new mode 100755 index d632034..98768a1 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -1613,6 +1613,15 @@ int vcd_server_get_foreground() return pid; } +static Eina_Bool __vcd_send_service_state(void *data) +{ + vcd_config_set_service_state(VCD_STATE_READY); + vcdc_send_service_state(VCD_STATE_READY); + + SLOG(LOG_INFO, TAG_VCD, "[Server Success] success to send service status for READY"); + + return EINA_FALSE; +} /* * API for manager @@ -1636,6 +1645,8 @@ int vcd_server_mgr_initialize(int pid) if (0 != vcdc_send_manager_pid(pid)) SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send manager pid"); + ecore_timer_add(0.05, __vcd_send_service_state, NULL); + SLOG(LOG_ERROR, TAG_VCD, "[Server Success] Manager initialize : pid(%d)", pid); return VCD_ERROR_NONE; -- 2.7.4 From 5ff971a140b3283390871cf200b29e1b4baa2bea Mon Sep 17 00:00:00 2001 From: kismo Date: Tue, 28 Jan 2020 15:17:56 +0900 Subject: [PATCH 12/16] encoding and decoding data for engine specific request Change-Id: I6e58316b36dbc3bd778e85a739c262283cbd81bb (cherry picked from commit 66512bfbecab942362a3756d01b235c7e0b0e1e5) --- client/vc_mgr_dbus.c | 17 +++++++++++++++-- server/vcd_dbus.c | 12 +++++++++++- server/vcd_dbus_server.c | 10 ++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) mode change 100644 => 100755 client/vc_mgr_dbus.c mode change 100644 => 100755 server/vcd_dbus.c mode change 100644 => 100755 server/vcd_dbus_server.c diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c old mode 100644 new mode 100755 index be34e3f..eb6d62e --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -215,7 +215,14 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); if (NULL != result) { - __vc_mgr_cb_specific_engine_result(engine_app_id, event, result); + gsize decodingSize=0; + gchar *gDecodedResult = (gchar *)g_base64_decode((const gchar *)result, &decodingSize); + if (gDecodedResult) + { + SLOG(LOG_WARN, TAG_VCM, "@@@ Get specific engine result --> %s", gDecodedResult); + __vc_mgr_cb_specific_engine_result(engine_app_id, event, gDecodedResult); + g_free(gDecodedResult); + } } SLOG(LOG_DEBUG, TAG_VCM, "@@@"); @@ -2233,11 +2240,13 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, SLOG(LOG_INFO, TAG_VCM, "@@ vc send specific engine : pid(%d), engine_app_id(%s), event(%s), request(%s)", pid, engine_app_id, event, request); } + gchar *gEncodedRequest = g_base64_encode((const guchar*)request, strlen(request)); + dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, - DBUS_TYPE_STRING, &request, + DBUS_TYPE_STRING, &gEncodedRequest, DBUS_TYPE_INVALID); dbus_message_set_no_reply(msg, TRUE); @@ -2245,6 +2254,8 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, /* send the message and flush the connection */ if (1 != dbus_connection_send(g_m_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to Send"); + if (gEncodedRequest) + g_free(gEncodedRequest); dbus_message_unref(msg); return VC_ERROR_OPERATION_FAILED; } else { @@ -2252,6 +2263,8 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, dbus_connection_flush(g_m_conn_sender); } + if (gEncodedRequest) + g_free(gEncodedRequest); dbus_message_unref(msg); return 0; } diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c old mode 100644 new mode 100755 index 1ca143e..e0cd0c2 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -426,18 +426,28 @@ int vcdc_send_specific_engine_result_to_manager(int manager_pid, const char* eng return VCD_ERROR_OUT_OF_MEMORY; } - dbus_message_append_args(msg, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); + gchar *gEncodedResult = g_base64_encode((const guchar*)result, strlen(result)); + + dbus_message_append_args(msg, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, DBUS_TYPE_STRING, &gEncodedResult, DBUS_TYPE_INVALID); dbus_message_set_no_reply(msg, TRUE); if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); + if (gEncodedResult) + g_free(gEncodedResult); + dbus_message_unref(msg); return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_INFO, TAG_VCD, "[Dbus] SUCCESS Send"); dbus_connection_flush(g_conn_sender); } + if (gEncodedResult) + g_free(gEncodedResult); + + dbus_message_unref(msg); + return 0; } diff --git a/server/vcd_dbus_server.c b/server/vcd_dbus_server.c old mode 100644 new mode 100755 index 46bacac..2adb89e --- a/server/vcd_dbus_server.c +++ b/server/vcd_dbus_server.c @@ -654,8 +654,14 @@ int vcd_dbus_server_mgr_send_specific_engine_request(DBusConnection* conn, DBusM dbus_error_free(&err); ret = VCD_ERROR_OPERATION_FAILED; } else { - ret = vcd_server_mgr_send_specific_engine_request(pid, engine_app_id, event, request); - SLOG(LOG_INFO, TAG_VCD, "[IN] vcd mgr specific engine request : pid(%d), engine_app_id(%s), event(%s), request(%s), ret(%d)", pid, engine_app_id, event, request, ret); + gsize decodingSize=0; + gchar *gDecodedRequest = (gchar *)g_base64_decode((const gchar *)request, &decodingSize); + if (gDecodedRequest) + { + ret = vcd_server_mgr_send_specific_engine_request(pid, engine_app_id, event, gDecodedRequest); + SLOG(LOG_INFO, TAG_VCD, "[IN] vcd mgr specific engine request : pid(%d), engine_app_id(%s), event(%s), request(%s), ret(%d)", pid, engine_app_id, event, gDecodedRequest, ret); + g_free(gDecodedRequest); + } } return 0; -- 2.7.4 From b846bfc33e9a058095865ae9722d5e2fdd2714d2 Mon Sep 17 00:00:00 2001 From: Dharanie Shankar Date: Mon, 17 Feb 2020 11:55:38 +0530 Subject: [PATCH 13/16] Memory leak fixes taken from MCD 4.0 Change refno: 3284633, 3316074, 3316388 [Model] [BinType] AP [Customer] OPEN [Issue#] [Request] PLM [Occurrence Version] [Problem] bug fix [Cause & Measure] [Checking Method] [Team] Bixby Client [Developer] Dharanie Shankar [Solution company] Samsung [Change Type] PLM Change-Id: Ia9d500d6e6030a2c2caeba8854ff96530aca4238 Signed-off-by: Dharanie Shankar (cherry picked from commit 8db9160f0cbfa62afbf8da366033f7ec41640d70) --- client/vc_mgr.c | 8 ++++++++ client/vc_mgr_data.cpp | 18 ++++++++---------- common/vc_config_parser.c | 2 ++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index eb6c3b8..855c6f9 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -4194,6 +4194,10 @@ static void __tts_feedback_thread(void* data, Ecore_Thread* thread) /* If no feedback data and EVENT_FINISH */ if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) { SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish feedback"); + if (feedback_data) { + free(feedback_data); + feedback_data = NULL; + } break; } } else { @@ -4220,6 +4224,10 @@ static void __tts_feedback_thread(void* data, Ecore_Thread* thread) /* If no feedback data and EVENT_FINISH */ if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) { SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish vc tts feedback"); + if (feedback_data) { + free(feedback_data); + feedback_data = NULL; + } break; } } diff --git a/client/vc_mgr_data.cpp b/client/vc_mgr_data.cpp index 53adae3..8301fcd 100644 --- a/client/vc_mgr_data.cpp +++ b/client/vc_mgr_data.cpp @@ -100,18 +100,16 @@ int vc_mgr_data_clear_feedback_data(vc_feedback_data_s** data) pthread_mutex_lock(&g_feedback_data_mutex); - if (!g_feedback_data.empty()) { - if (NULL != *data) { - SLOG(LOG_INFO, TAG_VCM, "[DEBUG] pid(%d), utt_id(%d), data(%p) size(%d) rate(%d)", (*data)->pid, (*data)->utt_id, (*data)->data, (*data)->data_size, (*data)->rate); - - if (NULL != (*data)->data) { - free((*data)->data); - (*data)->data = NULL; - } + if (NULL != *data) { + SLOG(LOG_INFO, TAG_VCM, "[DEBUG] pid(%d), utt_id(%d), data(%p) size(%d) rate(%d)", (*data)->pid, (*data)->utt_id, (*data)->data, (*data)->data_size, (*data)->rate); - free(*data); - *data = NULL; + if (NULL != (*data)->data) { + free((*data)->data); + (*data)->data = NULL; } + + free(*data); + *data = NULL; } pthread_mutex_unlock(&g_feedback_data_mutex); diff --git a/common/vc_config_parser.c b/common/vc_config_parser.c index e2be6d8..cf7e088 100644 --- a/common/vc_config_parser.c +++ b/common/vc_config_parser.c @@ -243,6 +243,8 @@ int vc_parser_free_engine_info(vc_engine_info_s* engine_info) if (NULL != engine_info->name) free(engine_info->name); if (NULL != engine_info->uuid) free(engine_info->uuid); + if (NULL != engine_info->default_lang) free(engine_info->default_lang); + if (NULL != engine_info->setting) free(engine_info->setting); int count = g_slist_length(engine_info->languages); -- 2.7.4 From f029a89d128d5c224129bf9b8e3417bb5c3e78fe Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Fri, 21 Feb 2020 15:09:02 +0900 Subject: [PATCH 14/16] Change public callbacks to internal callbacks for optional callbacks Change-Id: Iec3da4f0ef889d4ba48b155a1649e82fe974f717 Signed-off-by: sungrae jo --- include/vce.h | 14 +++++++++++++- include/vce_internal.h | 5 +++++ server/vcd_engine_agent.c | 32 ++++++++++++++++---------------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/include/vce.h b/include/vce.h index 31747a0..9f4d614 100644 --- a/include/vce.h +++ b/include/vce.h @@ -627,7 +627,19 @@ typedef int (*vce_tts_audio_format_request_cb)(int* rate, int* channel, int* aud * @brief A structure for the VC engine functions. * @details This structure contains essential callback functions for operating VC engine. * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif - * @remarks You must register all callbacks except optional callbacks for operating VC engine. + * @remarks You must register all callbacks except optional callbacks for operating VC engine.\n + * The following callbacks are optional callbacks : \n + * - vce_private_data_set_cb \n + * - vce_private_data_requested_cb \n + * - vce_nlu_base_info_requested_cb \n + * - vce_specific_engine_request_cb \n + * If you want to use the optional callbacks, you can set them using vce_set_private_data_set_cb(), vce_set_private_data_requested_cb(), vce_set_nlu_base_info_requested_cb(), and vce_set_specific_engine_request_cb() functions. + * + * @see vce_main() + * @see vce_set_private_data_set_cb() + * @see vce_set_private_data_requested_cb() + * @see vce_set_nlu_base_info_requested_cb() + * @see vce_set_specific_engine_request_cb() */ typedef struct { int version; /**< Version */ diff --git a/include/vce_internal.h b/include/vce_internal.h index 19c51f6..8c43a47 100644 --- a/include/vce_internal.h +++ b/include/vce_internal.h @@ -39,6 +39,11 @@ typedef struct { void* cancel_tts_user_data; vce_tts_audio_format_request_cb get_tts_audio_format; void* get_tts_audio_format_user_data; + + vce_private_data_set_cb private_data_set; + vce_private_data_requested_cb private_data_request; + vce_nlu_base_info_requested_cb nlu_base_info_request; + vce_specific_engine_request_cb specific_engine_request; } vce_internal_request_callback_s; /** diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 4750284..7fa8479 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -231,10 +231,10 @@ static int __internal_get_engine_info(vce_request_callback_s* callback) g_dynamic_engine.callbacks->process_list_event = callback->process_list_event; g_dynamic_engine.callbacks->process_haptic_event = callback->process_haptic_event; - g_dynamic_engine.callbacks->private_data_set = callback->private_data_set; - g_dynamic_engine.callbacks->private_data_request = callback->private_data_request; - g_dynamic_engine.callbacks->nlu_base_info_request = callback->nlu_base_info_request; - g_dynamic_engine.callbacks->specific_engine_request = callback->specific_engine_request; + g_dynamic_engine.internal_callbacks->private_data_set = NULL; + g_dynamic_engine.internal_callbacks->private_data_request = NULL; + g_dynamic_engine.internal_callbacks->nlu_base_info_request = NULL; + g_dynamic_engine.internal_callbacks->specific_engine_request = NULL; g_dynamic_engine.internal_callbacks->request_tts = NULL; g_dynamic_engine.internal_callbacks->request_tts_user_data = NULL; @@ -551,8 +551,8 @@ int vcd_engine_get_nlu_base_info(int pid, const char* key, char** value) } int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->nlu_base_info_request) { - ret = g_dynamic_engine.callbacks->nlu_base_info_request(key, value); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->nlu_base_info_request) { + ret = g_dynamic_engine.internal_callbacks->nlu_base_info_request(key, value); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get nlu base info (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -576,8 +576,8 @@ int vcd_engine_set_private_data(int pid, const char* key, const char* data) vcd_recorder_set_pcm_path(data); int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->private_data_set) { - ret = g_dynamic_engine.callbacks->private_data_set(key, data); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->private_data_set) { + ret = g_dynamic_engine.internal_callbacks->private_data_set(key, data); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set private data (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -603,8 +603,8 @@ int vcd_engine_get_private_data(int pid, const char* key, char** data) } int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->private_data_request) { - ret = g_dynamic_engine.callbacks->private_data_request(key, data); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->private_data_request) { + ret = g_dynamic_engine.internal_callbacks->private_data_request(key, data); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get private data (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -625,8 +625,8 @@ int vcd_engine_send_specific_engine_request(const char* engine_app_id, const cha } int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->specific_engine_request) { - ret = g_dynamic_engine.callbacks->specific_engine_request(engine_app_id, event, request); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->specific_engine_request) { + ret = g_dynamic_engine.internal_callbacks->specific_engine_request(engine_app_id, event, request); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set specific engine request (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -946,7 +946,7 @@ int vcd_engine_agent_set_private_data_set_cb(vce_private_data_set_cb callback_fu return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->private_data_set = callback_func; + g_dynamic_engine.internal_callbacks->private_data_set = callback_func; return VCD_ERROR_NONE; } @@ -963,7 +963,7 @@ int vcd_engine_agent_set_private_data_requested_cb(vce_private_data_requested_cb return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->private_data_request = callback_func; + g_dynamic_engine.internal_callbacks->private_data_request = callback_func; return VCD_ERROR_NONE; } @@ -980,7 +980,7 @@ int vcd_engine_agent_set_nlu_base_info_requested_cb(vce_nlu_base_info_requested_ return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->nlu_base_info_request = callback_func; + g_dynamic_engine.internal_callbacks->nlu_base_info_request = callback_func; return VCD_ERROR_NONE; } @@ -997,7 +997,7 @@ int vcd_engine_agent_set_specific_engine_request_cb(vce_specific_engine_request_ return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->specific_engine_request = callback_func; + g_dynamic_engine.internal_callbacks->specific_engine_request = callback_func; return VCD_ERROR_NONE; } -- 2.7.4 From 61844e83cabd54aee557e8b411233f5a6c8ce17b Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 16 Mar 2020 12:40:01 +0900 Subject: [PATCH 15/16] Added mutex code for command Change-Id: I51b58c5310a87b5987a28a6502f0b01890e3f36d Signed-off-by: sungrae jo --- common/vc_command.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/common/vc_command.c b/common/vc_command.c index 8ff7138..e271c0b 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -33,6 +33,10 @@ #include "voice_control_common.h" #include "voice_control_key_defines.h" +static pthread_mutex_t g_cmd_mutex = PTHREAD_MUTEX_INITIALIZER; +#define CMD_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_mutex) +#define CMD_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_mutex) + static int g_feature_enabled = -1; static bool g_privilege_allowed = false; @@ -658,8 +662,11 @@ int vc_cmd_create(vc_cmd_h* vc_command) return VC_ERROR_PERMISSION_DENIED; } + CMD_MUTEX_LOCK(); + if (NULL == vc_command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -667,6 +674,7 @@ int vc_cmd_create(vc_cmd_h* vc_command) if (NULL == command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_OUT_OF_MEMORY; } @@ -692,6 +700,7 @@ int vc_cmd_create(vc_cmd_h* vc_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command); + CMD_MUTEX_UNLOCK(); return VC_ERROR_NONE; } @@ -704,8 +713,11 @@ int vc_cmd_destroy(vc_cmd_h vc_command) return VC_ERROR_PERMISSION_DENIED; } + CMD_MUTEX_LOCK(); + if (NULL == vc_command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -718,6 +730,7 @@ int vc_cmd_destroy(vc_cmd_h vc_command) iter = g_list_find(g_cmd_list, command); if (NULL == iter) { SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -744,6 +757,7 @@ int vc_cmd_destroy(vc_cmd_h vc_command) free(command); command = NULL; + CMD_MUTEX_UNLOCK(); return VC_ERROR_NONE; } -- 2.7.4 From d62ca0713d22a450e8c44032d0468138dfba548f Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 16 Mar 2020 16:14:47 +0900 Subject: [PATCH 16/16] Added mutex code for command list Added mutex code Fixed resource release order for list destory. Change-Id: I050ad117a32c4f051f2f669b64c0cb5890b88ee3 Signed-off-by: sungrae jo --- common/vc_command.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index e271c0b..6d0b546 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -34,8 +34,11 @@ #include "voice_control_key_defines.h" static pthread_mutex_t g_cmd_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t g_cmd_list_mutex = PTHREAD_MUTEX_INITIALIZER; #define CMD_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_mutex) #define CMD_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_mutex) +#define CMD_LIST_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_list_mutex) +#define CMD_LIST_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_list_mutex) static int g_feature_enabled = -1; static bool g_privilege_allowed = false; @@ -181,8 +184,11 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) return VC_ERROR_PERMISSION_DENIED; } + CMD_LIST_MUTEX_LOCK(); + if (NULL == vc_cmd_list) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -190,6 +196,7 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) if (NULL == list) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_OUT_OF_MEMORY; } @@ -202,6 +209,7 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_NONE; } @@ -214,12 +222,14 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) return VC_ERROR_PERMISSION_DENIED; } + CMD_LIST_MUTEX_LOCK(); + if (NULL == vc_cmd_list) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } - vc_cmd_list_remove_all(vc_cmd_list, release_command); vc_cmd_list_s* list = NULL; list = (vc_cmd_list_s*)vc_cmd_list; @@ -230,15 +240,19 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) iter = g_list_find(g_cmdlist_list, list); if (NULL == iter) { SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); - if (iter->data) - free(iter->data); - iter->data = NULL; - iter = NULL; + + vc_cmd_list_remove_all((vc_cmd_list_h)list, release_command); + free(list); + list = NULL; + SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); + + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_NONE; } @@ -372,11 +386,14 @@ int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)" , list, release_command ? "true" : "false"); - if (true == release_command) - g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL); - g_slist_free(list->list); - list->list = NULL; - list->index = -1; + if (true == release_command) { + if (list->list) { + g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL); + g_slist_free(list->list); + list->list = NULL; + } + list->index = -1; + } SLOG(LOG_DEBUG, TAG_VCCMD, "@@@"); -- 2.7.4