summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornpmccallum <npmccallum@c587cffe-e639-0410-9787-d7902ae8ed56>2007-11-07 22:14:20 +0000
committernpmccallum <npmccallum@c587cffe-e639-0410-9787-d7902ae8ed56>2007-11-07 22:14:20 +0000
commitd92b4c53eb86dc501538369b3a708a41a4940882 (patch)
tree5f8071f3ab84c36a93bb38fac0d92ff1c839ac8a
parentcce2868084a917a83c9dade13db1114f6a0487f6 (diff)
downloadlibproxy-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.c45
-rw-r--r--src/lib/proxy_factory.h8
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);