Skip to content
Snippets Groups Projects
Commit 36522b3b authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Fix UID FETCH deadlock.

Also, after grabbing a lock, enter a try/catch that will unlock
and re-throw the error.
parent ce677196
No related branches found
No related tags found
No related merge requests found
...@@ -1394,6 +1394,7 @@ function open_cfg(usr) ...@@ -1394,6 +1394,7 @@ function open_cfg(usr)
return false; return false;
} }
lock_cfg(); lock_cfg();
try {
// Check if it's the old INI format... // Check if it's the old INI format...
if (cfgfile.length > 0) { if (cfgfile.length > 0) {
var ch = cfgfile.read(1); var ch = cfgfile.read(1);
...@@ -1406,6 +1407,11 @@ function open_cfg(usr) ...@@ -1406,6 +1407,11 @@ function open_cfg(usr)
else { else {
save_cfg(false); save_cfg(false);
} }
}
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg(); unlock_cfg();
return true; return true;
} }
...@@ -1686,9 +1692,15 @@ var authenticated_command_handlers = { ...@@ -1686,9 +1692,15 @@ var authenticated_command_handlers = {
if(msg_area.sub[sub]!=undefined && msg_area.sub[sub].can_read) { if(msg_area.sub[sub]!=undefined && msg_area.sub[sub].can_read) {
lock_cfg(); lock_cfg();
try {
read_cfg(sub, false); read_cfg(sub, false);
saved_config[sub].subscribed = true; saved_config[sub].subscribed = true;
save_cfg(false); save_cfg(false);
}
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg(); unlock_cfg();
tagged(tag, "OK", "Subscribed..."); tagged(tag, "OK", "Subscribed...");
} }
...@@ -1704,9 +1716,15 @@ var authenticated_command_handlers = { ...@@ -1704,9 +1716,15 @@ var authenticated_command_handlers = {
if(msg_area.sub[sub]!=undefined && msg_area.sub[sub].can_read) { if(msg_area.sub[sub]!=undefined && msg_area.sub[sub].can_read) {
lock_cfg(); lock_cfg();
try {
read_cfg(sub, false); read_cfg(sub, false);
saved_config[sub].subscribed = false; saved_config[sub].subscribed = false;
save_cfg(false); save_cfg(false);
}
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg(); unlock_cfg();
tagged(tag, "OK", "Unsubscribed..."); tagged(tag, "OK", "Unsubscribed...");
} }
...@@ -1841,6 +1859,7 @@ function do_store(seq, uid, item, data) ...@@ -1841,6 +1859,7 @@ function do_store(seq, uid, item, data)
var changed=false; var changed=false;
lock_cfg(); lock_cfg();
try {
read_cfg(index.code, false); read_cfg(index.code, false);
for(i in seq) { for(i in seq) {
idx=index.idx[seq[i]]; idx=index.idx[seq[i]];
...@@ -1882,9 +1901,15 @@ function do_store(seq, uid, item, data) ...@@ -1882,9 +1901,15 @@ function do_store(seq, uid, item, data)
js.gc(); js.gc();
} }
save_cfg(false); save_cfg(false);
}
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg(); unlock_cfg();
if(mod_seen && base.cfg != undefined) { if(mod_seen && base.cfg != undefined) {
lock_cfg(); lock_cfg();
try {
read_cfg(base.cfg.code, false); read_cfg(base.cfg.code, false);
if(saved_config[base.cfg.code] == undefined) { if(saved_config[base.cfg.code] == undefined) {
saved_config[base.cfg.code] = {subscribed:false}; saved_config[base.cfg.code] = {subscribed:false};
...@@ -1899,6 +1924,11 @@ function do_store(seq, uid, item, data) ...@@ -1899,6 +1924,11 @@ function do_store(seq, uid, item, data)
else else
index.idx[seq[i]].attr &= ~MSG_READ; index.idx[seq[i]].attr &= ~MSG_READ;
save_cfg(false); save_cfg(false);
}
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg(); unlock_cfg();
} }
if(changed) if(changed)
...@@ -2810,6 +2840,7 @@ var selected_command_handlers = { ...@@ -2810,6 +2840,7 @@ var selected_command_handlers = {
var i; var i;
lock_cfg(); lock_cfg();
try {
read_cfg(get_base_code(base), false); read_cfg(get_base_code(base), false);
for(i in seq) { for(i in seq) {
send_fetch_response(seq[i], data_items, false); send_fetch_response(seq[i], data_items, false);
...@@ -2817,6 +2848,11 @@ var selected_command_handlers = { ...@@ -2817,6 +2848,11 @@ var selected_command_handlers = {
break; break;
} }
save_cfg(false); save_cfg(false);
}
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg(); unlock_cfg();
js.gc(); js.gc();
tagged(tag, "OK", "There they are!"); tagged(tag, "OK", "There they are!");
...@@ -2865,6 +2901,7 @@ var selected_command_handlers = { ...@@ -2865,6 +2901,7 @@ var selected_command_handlers = {
seq=parse_seq_set(args[2],true); seq=parse_seq_set(args[2],true);
data_items=parse_data_items(args[3]); data_items=parse_data_items(args[3]);
lock_cfg(); lock_cfg();
try {
read_cfg(get_base_code(base), false); read_cfg(get_base_code(base), false);
for(i in seq) { for(i in seq) {
send_fetch_response(seq[i], data_items, true); send_fetch_response(seq[i], data_items, true);
...@@ -2872,7 +2909,12 @@ var selected_command_handlers = { ...@@ -2872,7 +2909,12 @@ var selected_command_handlers = {
break; break;
} }
save_cfg(false); save_cfg(false);
lock_cfg(); }
catch (error) {
unlock_cfg();
throw error;
}
unlock_cfg();
js.gc(); js.gc();
tagged(tag, "OK", "There they are (with UIDs)!"); tagged(tag, "OK", "There they are (with UIDs)!");
break; break;
...@@ -2986,6 +3028,7 @@ function read_cfg(sub, lck) ...@@ -2986,6 +3028,7 @@ function read_cfg(sub, lck)
if (lck) if (lck)
lock_cfg(); lock_cfg();
try {
if(saved_config[sub]==undefined) if(saved_config[sub]==undefined)
saved_config[sub]={subscribed:false}; saved_config[sub]={subscribed:false};
...@@ -3028,6 +3071,12 @@ function read_cfg(sub, lck) ...@@ -3028,6 +3071,12 @@ function read_cfg(sub, lck)
} }
} }
} }
}
catch (error) {
if (lck)
unlock_cfg();
throw error;
}
if (lck) if (lck)
unlock_cfg(); unlock_cfg();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment