[sr-dev] git:ser_core_cvs: cfg framework: fix the group handles in the main process

Andrei Pelinescu-Onciul andrei at iptel.org
Fri Jul 17 17:43:28 CEST 2009


Module: sip-router
Branch: ser_core_cvs
Commit: c0f12714391fa6b359cceaed22ed238ba5387457
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c0f12714391fa6b359cceaed22ed238ba5387457

Author: Miklos Tirpak <miklos at iptel.org>
Committer: Miklos Tirpak <miklos at iptel.org>
Date:   Mon Jul 13 15:13:12 2009 +0000

cfg framework: fix the group handles in the main process
(backport from GIT)

    The main process does not have a local configuration,
    it has access only to the config values that were set before
    forking. As a result, the group handles cannot ponint to
    the shared memory address because the shared memory block
    may be freed later by one of the child processes. This problem
    resulted sometimes in a core dump after the processes were killed
    when the main process tried to access a variable from shared mem
    which was no longer available.

---

 cfg/cfg_script.c |    1 -
 cfg/cfg_struct.c |   12 +++++++-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/cfg/cfg_script.c b/cfg/cfg_script.c
index 39a4068..8804e40 100644
--- a/cfg/cfg_script.c
+++ b/cfg/cfg_script.c
@@ -143,7 +143,6 @@ error:
 /* fix-up the dynamically declared group:
  *  - allocate memory for the arrays
  *  - set the values within the memory block
- *  - notify the drivers about the new group
  */
 int cfg_script_fixup(cfg_group_t *group, unsigned char *block)
 {
diff --git a/cfg/cfg_struct.c b/cfg/cfg_struct.c
index fe7d8d6..966443e 100644
--- a/cfg/cfg_struct.c
+++ b/cfg/cfg_struct.c
@@ -194,21 +194,23 @@ int cfg_shmize(void)
 			/* clone the strings to shm mem */
 			if (cfg_shmize_strings(group)) goto error;
 
-			/* copy the values to the new block,
-			and update the module's handle */
+			/* copy the values to the new block */
 			memcpy(block->vars+group->offset, group->vars, group->size);
-			*(group->handle) = block->vars+group->offset;
 		} else {
 			/* The group was declared with NULL values,
 			 * we have to fix it up.
 			 * The fixup function takes care about the values,
 			 * it fills up the block */
 			if (cfg_script_fixup(group, block->vars+group->offset)) goto error;
-			*(group->handle) = block->vars+group->offset;
 
-			/* notify the drivers about the new config definition */
+			/* Notify the drivers about the new config definition.
+			 * Temporary set the group handle so that the drivers have a chance to
+			 * overwrite the default values. The handle must be reset after this
+			 * because the main process does not have a local configuration. */
+			*(group->handle) = block->vars+group->offset;
 			cfg_notify_drivers(group->name, group->name_len,
 					group->mapping->def);
+			*(group->handle) = NULL;
 		}
 	}
 	/* try to fixup the selects that failed to be fixed-up previously */




More information about the sr-dev mailing list