]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 182450 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 17 Mar 2009 05:54:07 +0000 (05:54 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 17 Mar 2009 05:54:07 +0000 (05:54 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r182450 | tilghman | 2009-03-17 00:51:54 -0500 (Tue, 17 Mar 2009) | 14 lines

  Merged revisions 182449 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r182449 | tilghman | 2009-03-17 00:50:52 -0500 (Tue, 17 Mar 2009) | 7 lines

    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: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@182452 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/db.c

index 3fcf9eee2e81c1540c9125754a23d9c119cf5608..d15ac961963b509a579fbcb81ad4c4290217fdec 100644 (file)
--- a/main/db.c
+++ b/main/db.c
@@ -180,10 +180,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) {
@@ -200,6 +198,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;
 }