diff options
author | npmccallum <npmccallum@c587cffe-e639-0410-9787-d7902ae8ed56> | 2007-11-07 22:14:20 +0000 |
---|---|---|
committer | npmccallum <npmccallum@c587cffe-e639-0410-9787-d7902ae8ed56> | 2007-11-07 22:14:20 +0000 |
commit | d92b4c53eb86dc501538369b3a708a41a4940882 (patch) | |
tree | 5f8071f3ab84c36a93bb38fac0d92ff1c839ac8a | |
parent | cce2868084a917a83c9dade13db1114f6a0487f6 (diff) | |
download | libproxy-d92b4c53eb86dc501538369b3a708a41a4940882.tar.gz |
crashers, memory leaks and const fixes; oh my!
git-svn-id: http://libproxy.googlecode.com/svn/trunk@43 c587cffe-e639-0410-9787-d7902ae8ed56
-rw-r--r-- | src/lib/proxy_factory.c | 45 | ||||
-rw-r--r-- | src/lib/proxy_factory.h | 8 |
2 files changed, 32 insertions, 21 deletions
diff --git a/src/lib/proxy_factory.c b/src/lib/proxy_factory.c index 0450b07..263b340 100644 --- a/src/lib/proxy_factory.c +++ b/src/lib/proxy_factory.c @@ -115,7 +115,7 @@ px_proxy_factory_new () for (i=0 ; (ent = readdir(plugindir)) ; i++) { // Load the plugin - char *tmp = px_strcat(PLUGINDIR, "/", ent->d_name); + char *tmp = px_strcat(PLUGINDIR, "/", ent->d_name, NULL); self->plugins[i] = dlopen(tmp, RTLD_LOCAL); px_free(tmp); if (!(self->plugins[i])) @@ -140,7 +140,7 @@ px_proxy_factory_new () } bool -px_proxy_factory_config_add(pxProxyFactory *self, char *name, pxConfigCategory category, pxProxyFactoryPtrCallback callback) +px_proxy_factory_config_add(pxProxyFactory *self, const char *name, pxConfigCategory category, pxProxyFactoryPtrCallback callback) { int count; pxProxyFactoryConfig **tmp; @@ -175,7 +175,7 @@ px_proxy_factory_config_add(pxProxyFactory *self, char *name, pxConfigCategory c } bool -px_proxy_factory_config_del(pxProxyFactory *self, char *name) +px_proxy_factory_config_del(pxProxyFactory *self, const char *name) { int i,j; @@ -207,7 +207,7 @@ px_proxy_factory_config_del(pxProxyFactory *self, char *name) } bool -px_proxy_factory_misc_set(pxProxyFactory *self, char *key, void *value) +px_proxy_factory_misc_set(pxProxyFactory *self, const char *key, const void *value) { int count; pxKeyVal **tmp; @@ -226,15 +226,8 @@ px_proxy_factory_misc_set(pxProxyFactory *self, char *key, void *value) if (!value) { // Remove the keyval, shifting downward - for (int i=0 ; self->misc[i] ; i++) + for (int i=0,j=0 ; self->misc[i] ; i++, j++) { - // If the previous key was unset, shift downward - if (i > 0 && !self->misc[i-1]) - { - self->misc[i-1] = self->misc[i]; - self->misc[i] = NULL; - } - // If the key is found, remove it if (!strcmp(key, self->misc[i]->key)) { @@ -242,11 +235,16 @@ px_proxy_factory_misc_set(pxProxyFactory *self, char *key, void *value) px_free(self->misc[i]); self->misc[i] = NULL; count--; + j--; } + + // Shift down + if (i > 0 && j > 0) + self->misc[j] = self->misc[i]; } // Resize array - tmp = px_malloc0(sizeof(pxKeyVal *) * count + 1); + tmp = px_malloc0(sizeof(pxKeyVal *) * (count + 1)); memcpy(tmp, self->misc, sizeof(pxKeyVal *) * count); px_free(self->misc); self->misc = tmp; @@ -255,25 +253,27 @@ px_proxy_factory_misc_set(pxProxyFactory *self, char *key, void *value) // Attempt to update the value within the array for (int i=0 ; self->misc[i] ; i++) + { if (!strcmp(key, self->misc[i]->key)) { - self->misc[i]->value = value; + self->misc[i]->value = (void *) value; return true; } + } // The key was not found in the array, so add it - tmp = px_malloc0(sizeof(pxKeyVal *) * count + 2); + tmp = px_malloc0(sizeof(pxKeyVal *) * (count + 2)); memcpy(tmp, self->misc, sizeof(pxKeyVal *) * count); tmp[count] = px_malloc0(sizeof(pxKeyVal)); tmp[count]->key = px_strdup(key); - tmp[count]->value = value; + tmp[count]->value = (void *) value; px_free(self->misc); self->misc = tmp; return true; } void * -px_proxy_factory_misc_get(pxProxyFactory *self, char *key) +px_proxy_factory_misc_get(pxProxyFactory *self, const char *key) { // Verify some basic stuff if (!self) return NULL; @@ -655,6 +655,17 @@ px_proxy_factory_free (pxProxyFactory *self) px_free(self->plugins); } + // Free misc + if (self->misc) + { + for (i=0 ; self->misc[i] ; i++) + { + px_free(self->misc[i]->key); + px_free(self->misc[i]); + } + px_free(self->misc); + } + // Free everything else if (self->pac) px_pac_free(self->pac); if (self->wpad) px_wpad_free(self->wpad); diff --git a/src/lib/proxy_factory.h b/src/lib/proxy_factory.h index 89435ef..8bb887d 100644 --- a/src/lib/proxy_factory.h +++ b/src/lib/proxy_factory.h @@ -53,10 +53,10 @@ typedef bool (*pxProxyFactoryBoolCallback) (pxProxyFactory *self); typedef void *(*pxProxyFactoryPtrCallback) (pxProxyFactory *self); typedef char *(*pxPACRunnerCallback) (pxProxyFactory *self, pxPAC *pac, pxURL *url); -bool px_proxy_factory_config_add (pxProxyFactory *self, char *name, pxConfigCategory category, pxProxyFactoryPtrCallback callback); -bool px_proxy_factory_config_del (pxProxyFactory *self, char *name); -bool px_proxy_factory_misc_set (pxProxyFactory *self, char *key, void *value); -void *px_proxy_factory_misc_get (pxProxyFactory *self, char *key); +bool px_proxy_factory_config_add (pxProxyFactory *self, const char *name, pxConfigCategory category, pxProxyFactoryPtrCallback callback); +bool px_proxy_factory_config_del (pxProxyFactory *self, const char *name); +bool px_proxy_factory_misc_set (pxProxyFactory *self, const char *key, const void *value); +void *px_proxy_factory_misc_get (pxProxyFactory *self, const char *key); void px_proxy_factory_network_changed (pxProxyFactory *self); bool px_proxy_factory_on_get_proxy_add(pxProxyFactory *self, pxProxyFactoryVoidCallback callback); bool px_proxy_factory_on_get_proxy_del(pxProxyFactory *self, pxProxyFactoryVoidCallback callback); |