aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-17 05:50:52 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-17 05:50:52 +0000
commitb1ec7dcbc319fea646ab8eef1ce6f1116a3ffa80 (patch)
tree296b1ff31439173ce815ebf2c6c7bb249f9704e4 /main
parentf9c7c386b54537f7f04113b5ab6a39b6eb22ce1b (diff)
Fix race in astdb
The underlying db1 implementation does not fully isolate the pages retrieved from astdb, so the lock protecting accesses needs to be extended until the copy from the shared memory structure is done. (closes issue #14682) Reported by: makoto git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@182449 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/db.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/main/db.c b/main/db.c
index 3e61be509..9da3a11dd 100644
--- a/main/db.c
+++ b/main/db.c
@@ -187,10 +187,8 @@ int ast_db_get(const char *family, const char *keys, char *value, int valuelen)
memset(value, 0, valuelen);
key.data = fullkey;
key.size = fullkeylen + 1;
-
+
res = astdb->get(astdb, &key, &data, 0);
-
- ast_mutex_unlock(&dblock);
/* Be sure to NULL terminate our data either way */
if (res) {
@@ -208,6 +206,11 @@ int ast_db_get(const char *family, const char *keys, char *value, int valuelen)
ast_log(LOG_NOTICE, "Strange, empty value for /%s/%s\n", family, keys);
}
}
+
+ /* Data is not fully isolated for concurrency, so the lock must be extended
+ * to after the copy to the output buffer. */
+ ast_mutex_unlock(&dblock);
+
return res;
}