utox: add fix for settings crash
This commit is contained in:
parent
01f8642d26
commit
e653bfc657
2 changed files with 151 additions and 1 deletions
|
@ -0,0 +1,149 @@
|
|||
From c034ec9fffe79d46503dbb2686fec113bea2d08b Mon Sep 17 00:00:00 2001
|
||||
From: avoidr <avoidr@posteo.de>
|
||||
Date: Sat, 11 Jul 2020 05:18:22 +0200
|
||||
Subject: [PATCH] Fix crash when changing toxcore-related settings
|
||||
|
||||
uTox killed toxcore without killing toxav first, which led to a crash.
|
||||
Resources should be deallocated in reverse order of their allocation.
|
||||
|
||||
utox_av_ctrl_thread was started only once, when uTox was started, so
|
||||
when toxav was killed properly, the thread was never re-created for the
|
||||
next use of Tox. utox_av_ctrl_thread is now created whenever a new
|
||||
toxcore starts.
|
||||
|
||||
Then, the Filter_Audio pointer had to be set to NULL after it's free'd,
|
||||
otherwise it wouldn't get re-initialised, and an invalid pointer would
|
||||
be passed to kill_filter_audio(), causing a crash.
|
||||
|
||||
Finally, replaced magic number 0 with TOX_KILL.
|
||||
Deleted a redundant `toxav_thread_msg = false`.
|
||||
---
|
||||
src/av/audio.c | 1 +
|
||||
src/av/utox_av.c | 7 ++-----
|
||||
src/main.c | 3 ---
|
||||
src/tox.c | 20 +++++++++++---------
|
||||
4 files changed, 14 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/src/av/audio.c b/src/av/audio.c
|
||||
index 324ceb22..d4384d8b 100644
|
||||
--- a/src/av/audio.c
|
||||
+++ b/src/av/audio.c
|
||||
@@ -909,6 +909,7 @@ void utox_audio_thread(void *args) {
|
||||
}
|
||||
|
||||
utox_filter_audio_kill(f_a);
|
||||
+ f_a = NULL;
|
||||
|
||||
// missing some cleanup ?
|
||||
alDeleteSources(1, &ringtone);
|
||||
diff --git a/src/av/utox_av.c b/src/av/utox_av.c
|
||||
index 90e04b36..d7adb9ce 100644
|
||||
--- a/src/av/utox_av.c
|
||||
+++ b/src/av/utox_av.c
|
||||
@@ -275,7 +275,6 @@ void utox_av_ctrl_thread(void *UNUSED(args)) {
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
toxav_thread_msg = false;
|
||||
|
||||
if (av) {
|
||||
@@ -286,19 +285,17 @@ void utox_av_ctrl_thread(void *UNUSED(args)) {
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
postmessage_audio(UTOXAUDIO_KILL, 0, 0, NULL);
|
||||
postmessage_video(UTOXVIDEO_KILL, 0, 0, NULL);
|
||||
-
|
||||
// Wait for all a/v threads to return 0
|
||||
while (utox_audio_thread_init || utox_video_thread_init) {
|
||||
yieldcpu(1);
|
||||
}
|
||||
|
||||
- toxav_thread_msg = false;
|
||||
+ toxav_kill(av);
|
||||
+
|
||||
utox_av_ctrl_init = false;
|
||||
|
||||
- toxav_kill(av);
|
||||
LOG_NOTE("UTOXAV", "Clean thread exit!");
|
||||
return;
|
||||
}
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index a3072edf..39218062 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -269,9 +269,6 @@ void utox_init(void) {
|
||||
if (settings.curr_version != settings.last_version) {
|
||||
settings.show_splash = true;
|
||||
}
|
||||
-
|
||||
- // We likely want to start this on every system.
|
||||
- thread(utox_av_ctrl_thread, NULL);
|
||||
}
|
||||
|
||||
void utox_raze(void) {
|
||||
diff --git a/src/tox.c b/src/tox.c
|
||||
index 8d93ee19..e9fe3ae8 100644
|
||||
--- a/src/tox.c
|
||||
+++ b/src/tox.c
|
||||
@@ -234,10 +234,8 @@ void tox_settingschanged(void) {
|
||||
dropdown_list_clear(&dropdown_audio_out);
|
||||
dropdown_list_clear(&dropdown_video);
|
||||
|
||||
- // send the reconfig message!
|
||||
- postmessage_toxcore(0, 1, 0, NULL);
|
||||
-
|
||||
LOG_NOTE("Toxcore", "Restarting Toxcore");
|
||||
+ postmessage_toxcore(TOX_KILL, 1, 0, NULL); // send the reconfig message!
|
||||
while (!tox_thread_init) {
|
||||
yieldcpu(1);
|
||||
}
|
||||
@@ -476,8 +474,8 @@ void toxcore_thread(void *UNUSED(args)) {
|
||||
// avoid trying the creation of thousands of tox instances before user changes the settings
|
||||
if (tox_thread_msg) {
|
||||
TOX_MSG *msg = &tox_msg;
|
||||
- // If msg->msg is 0, reconfig
|
||||
- if (!msg->msg) {
|
||||
+
|
||||
+ if (msg->msg == TOX_KILL) {
|
||||
reconfig = (bool) msg->param1;
|
||||
tox_thread_init = UTOX_TOX_THREAD_INIT_NONE;
|
||||
}
|
||||
@@ -513,6 +511,7 @@ void toxcore_thread(void *UNUSED(args)) {
|
||||
postmessage_utox(UPDATE_TRAY, 0, 0, NULL);
|
||||
postmessage_utox(PROFILE_DID_LOAD, 0, 0, NULL);
|
||||
|
||||
+ thread(utox_av_ctrl_thread, NULL);
|
||||
postmessage_utoxav(UTOXAV_NEW_TOX_INSTANCE, 0, 0, av);
|
||||
}
|
||||
|
||||
@@ -548,9 +547,9 @@ void toxcore_thread(void *UNUSED(args)) {
|
||||
// If there's a message, load it, and send to the tox message thread
|
||||
if (tox_thread_msg) {
|
||||
TOX_MSG *msg = &tox_msg;
|
||||
- // If msg->msg is 0, reconfig if needed and break from tox_do
|
||||
- if (!msg->msg) {
|
||||
- reconfig = msg->param1;
|
||||
+
|
||||
+ if (msg->msg == TOX_KILL) {
|
||||
+ reconfig = msg->param1; // reconfig if needed
|
||||
tox_thread_msg = 0;
|
||||
tox_thread_init = UTOX_TOX_THREAD_INIT_NONE;
|
||||
break;
|
||||
@@ -574,7 +573,10 @@ void toxcore_thread(void *UNUSED(args)) {
|
||||
write_save(tox);
|
||||
edit_setstr(&edit_profile_password, (char *)"", 0);
|
||||
|
||||
- // Stop toxcore.
|
||||
+ postmessage_utoxav(UTOXAV_KILL, 0, 0, NULL);
|
||||
+ while (utox_av_ctrl_init) {
|
||||
+ yieldcpu(1);
|
||||
+ }
|
||||
LOG_TRACE("Toxcore", "tox thread ending");
|
||||
tox_kill(tox);
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
# Template file for 'utox'
|
||||
pkgname=utox
|
||||
version=0.17.2
|
||||
revision=1
|
||||
revision=2
|
||||
wrksrc=uTox
|
||||
build_style=cmake
|
||||
configure_args="-DENABLE_ASAN=OFF"
|
||||
|
@ -15,6 +15,7 @@ license="MIT"
|
|||
homepage="https://github.com/uTox/uTox/"
|
||||
distfiles="https://github.com/uTox/uTox/releases/download/v${version}/uTox-${version}-full.tar.gz"
|
||||
checksum=8437827b899e4e358adaf0641680c214f4b6dfb52af6534f261d747a905f08b6
|
||||
patch_args="-Np1"
|
||||
nocross=yes
|
||||
|
||||
post_install() {
|
||||
|
|
Loading…
Reference in a new issue