summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/os_calls.c178
-rw-r--r--xrdp/xrdp_list.c24
-rw-r--r--xrdp/xrdp_login_wnd.c57
3 files changed, 175 insertions, 84 deletions
diff --git a/common/os_calls.c b/common/os_calls.c
index ab7d4983..cbd546c4 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -71,13 +71,127 @@ static int g_term = 0;
#endif
#if defined(MEMLEAK)
-#include "/home/j/cvs/xrdp/xrdp/xrdp.h"
-#endif
-
-#if defined(MEMLEAK)
static int g_memsize = 0;
static int g_memid = 0;
-static struct xrdp_list* g_memlist = 0;
+static struct list* g_memlist = 0;
+
+/* for memory debugging */
+struct mem
+{
+ int size;
+ int id;
+};
+
+/* list */
+struct list
+{
+ long* items;
+ int count;
+ int alloc_size;
+ int grow_by;
+ int auto_free;
+};
+
+/*****************************************************************************/
+struct list* list_create(void)
+{
+ struct list* self;
+
+ self = (struct list*)malloc(sizeof(struct list));
+ memset(self, 0, sizeof(struct list));
+ self->grow_by = 10;
+ self->alloc_size = 10;
+ self->items = (long*)malloc(sizeof(long) * 10);
+ memset(self->items, 0, sizeof(long) * 10);
+ return self;
+}
+
+/*****************************************************************************/
+void list_delete(struct list* self)
+{
+ int i;
+
+ if (self == 0)
+ {
+ return;
+ }
+ if (self->auto_free)
+ {
+ for (i = 0; i < self->count; i++)
+ {
+ free((void*)self->items[i]);
+ self->items[i] = 0;
+ }
+ }
+ free(self->items);
+ free(self);
+}
+
+/*****************************************************************************/
+void list_add_item(struct list* self, long item)
+{
+ long* p;
+ int i;
+
+ if (self->count >= self->alloc_size)
+ {
+ i = self->alloc_size;
+ self->alloc_size += self->grow_by;
+ p = (long*)malloc(sizeof(long) * self->alloc_size);
+ memset(p, 0, sizeof(long) * self->alloc_size);
+ memcpy(p, self->items, sizeof(long) * i);
+ free(self->items);
+ self->items = p;
+ }
+ self->items[self->count] = item;
+ self->count++;
+}
+
+/*****************************************************************************/
+int list_index_of(struct list* self, long item)
+{
+ int i;
+
+ for (i = 0; i < self->count; i++)
+ {
+ if (self->items[i] == item)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/*****************************************************************************/
+void list_remove_item(struct list* self, int index)
+{
+ int i;
+
+ if (index >= 0 && index < self->count)
+ {
+ if (self->auto_free)
+ {
+ free((void*)self->items[index]);
+ self->items[index] = 0;
+ }
+ for (i = index; i < (self->count - 1); i++)
+ {
+ self->items[i] = self->items[i + 1];
+ }
+ self->count--;
+ }
+}
+
+/*****************************************************************************/
+long list_get_item(struct list* self, int index)
+{
+ if (index < 0 || index >= self->count)
+ {
+ return 0;
+ }
+ return self->items[index];
+}
+
#endif
/* forward declarations */
@@ -96,11 +210,7 @@ int g_init_system(void)
signal(SIGPIPE, g_pipe_sig);
#endif
#if defined(MEMLEAK)
- g_memlist = xrdp_list_create();
- g_printf("some info\n\r");
- g_printf("sizeof xrdp_bitmap is %d\n\r", sizeof(struct xrdp_bitmap));
- g_printf("sizeof xrdp_wm is %d\n\r", sizeof(struct xrdp_wm));
- g_printf("sizeof stream is %d\n\r", sizeof(struct stream));
+ g_memlist = list_create();
#endif
return 0;
}
@@ -114,15 +224,15 @@ int g_exit_system(void)
#endif
#if defined(MEMLEAK)
int i;
- struct xrdp_mem* p;
+ struct mem* p;
for (i = 0; i < g_memlist->count; i++)
{
- p = (struct xrdp_mem*)xrdp_list_get_item(g_memlist, i);
+ p = (struct mem*)list_get_item(g_memlist, i);
g_printf("leak size %d id %d\n\r", p->size, p->id);
}
g_printf("mem %d\n\r", g_memsize);
- xrdp_list_delete(g_memlist);
+ list_delete(g_memlist);
g_memlist = 0;
#endif
return 0;
@@ -133,23 +243,23 @@ void* g_malloc(int size, int zero)
{
#if defined(MEMLEAK)
char* rv;
- struct xrdp_mem* p;
+ struct mem* p;
- rv = (char*)malloc(size + sizeof(struct xrdp_mem));
+ rv = (char*)malloc(size + sizeof(struct mem));
if (zero)
{
- memset(rv, 0, size + sizeof(struct xrdp_mem));
+ memset(rv, 0, size + sizeof(struct mem));
}
g_memsize += size;
- p = (struct xrdp_mem*)rv;
+ p = (struct mem*)rv;
p->size = size;
p->id = g_memid;
if (g_memlist != 0)
{
- xrdp_list_add_item(g_memlist, (int)p);
+ list_add_item(g_memlist, (long)p);
}
g_memid++;
- return rv + sizeof(struct xrdp_mem);
+ return rv + sizeof(struct mem);
#else
char* rv;
@@ -163,33 +273,20 @@ void* g_malloc(int size, int zero)
}
/*****************************************************************************/
-void* g_malloc1(int size, int zero)
-{
- char* rv;
-
- rv = (char*)malloc(size);
- if (zero)
- {
- memset(rv, 0, size);
- }
- return rv;
-}
-
-/*****************************************************************************/
void g_free(void* ptr)
{
#if defined(MEMLEAK)
- struct xrdp_mem* p;
+ struct mem* p;
int i;
if (ptr != 0)
{
- p = (struct xrdp_mem*)(((char*)ptr) - sizeof(struct xrdp_mem));
+ p = (struct mem*)(((char*)ptr) - sizeof(struct mem));
g_memsize -= p->size;
- i = xrdp_list_index_of(g_memlist, (int)p);
+ i = list_index_of(g_memlist, (long)p);
if (i >= 0)
{
- xrdp_list_remove_item(g_memlist, i);
+ list_remove_item(g_memlist, i);
}
free(p);
}
@@ -202,15 +299,6 @@ void g_free(void* ptr)
}
/*****************************************************************************/
-void g_free1(void* ptr)
-{
- if (ptr != 0)
- {
- free(ptr);
- }
-}
-
-/*****************************************************************************/
void g_printf(char* format, ...)
{
va_list ap;
diff --git a/xrdp/xrdp_list.c b/xrdp/xrdp_list.c
index 50f307cc..34264925 100644
--- a/xrdp/xrdp_list.c
+++ b/xrdp/xrdp_list.c
@@ -18,10 +18,6 @@
simple list
- this list is used to track mem leaks so g_malloc1 and
- g_free1 should be used for internal allocs but not
- for auto_free items
-
*/
#include "xrdp.h"
@@ -31,10 +27,10 @@ struct xrdp_list* xrdp_list_create(void)
{
struct xrdp_list* self;
- self = (struct xrdp_list*)g_malloc1(sizeof(struct xrdp_list), 1);
+ self = (struct xrdp_list*)g_malloc(sizeof(struct xrdp_list), 1);
self->grow_by = 10;
self->alloc_size = 10;
- self->items = (long*)g_malloc1(sizeof(long) * 10, 1);
+ self->items = (long*)g_malloc(sizeof(long) * 10, 1);
return self;
}
@@ -55,8 +51,8 @@ void xrdp_list_delete(struct xrdp_list* self)
self->items[i] = 0;
}
}
- g_free1(self->items);
- g_free1(self);
+ g_free(self->items);
+ g_free(self);
}
/*****************************************************************************/
@@ -69,9 +65,9 @@ void xrdp_list_add_item(struct xrdp_list* self, long item)
{
i = self->alloc_size;
self->alloc_size += self->grow_by;
- p = (long*)g_malloc1(sizeof(long) * self->alloc_size, 1);
+ p = (long*)g_malloc(sizeof(long) * self->alloc_size, 1);
g_memcpy(p, self->items, sizeof(long) * i);
- g_free1(self->items);
+ g_free(self->items);
self->items = p;
}
self->items[self->count] = item;
@@ -101,11 +97,11 @@ void xrdp_list_clear(struct xrdp_list* self)
self->items[i] = 0;
}
}
- g_free1(self->items);
+ g_free(self->items);
self->count = 0;
self->grow_by = 10;
self->alloc_size = 10;
- self->items = (long*)g_malloc1(sizeof(long) * 10, 1);
+ self->items = (long*)g_malloc(sizeof(long) * 10, 1);
}
/*****************************************************************************/
@@ -161,9 +157,9 @@ void xrdp_list_insert_item(struct xrdp_list* self, int index, long item)
{
i = self->alloc_size;
self->alloc_size += self->grow_by;
- p = (long*)g_malloc1(sizeof(long) * self->alloc_size, 1);
+ p = (long*)g_malloc(sizeof(long) * self->alloc_size, 1);
g_memcpy(p, self->items, sizeof(long) * i);
- g_free1(self->items);
+ g_free(self->items);
self->items = p;
}
for (i = (self->count - 2); i >= index; i--)
diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c
index 759a070a..fe9e36fb 100644
--- a/xrdp/xrdp_login_wnd.c
+++ b/xrdp/xrdp_login_wnd.c
@@ -89,36 +89,43 @@ int xrdp_wm_popup_notify(struct xrdp_bitmap* wnd,
int xrdp_wm_setup_mod(struct xrdp_wm* self,
struct xrdp_mod_data* mod_data)
{
- if (self != 0)
+ if (self == 0)
{
- if (self->mod_handle == 0)
+ return 1;
+ }
+ if (self->mod_handle == 0)
+ {
+ self->mod_handle = g_load_library(mod_data->lib);
+ if (self->mod_handle != 0)
{
- self->mod_handle = g_load_library(mod_data->lib);
- if (self->mod_handle != 0)
- {
- self->mod_init = (struct xrdp_mod* (*)(void))
- g_get_proc_address(self->mod_handle, "mod_init");
- self->mod_exit = (int (*)(struct xrdp_mod*))
- g_get_proc_address(self->mod_handle, "mod_exit");
- if (self->mod_init != 0 && self->mod_exit != 0)
- {
- self->mod = self->mod_init();
- }
- }
- if (self->mod != 0)
+ self->mod_init = (struct xrdp_mod* (*)(void))
+ g_get_proc_address(self->mod_handle, "mod_init");
+ self->mod_exit = (int (*)(struct xrdp_mod*))
+ g_get_proc_address(self->mod_handle, "mod_exit");
+ if (self->mod_init != 0 && self->mod_exit != 0)
{
- self->mod->wm = (long)self;
- self->mod->server_begin_update = server_begin_update;
- self->mod->server_end_update = server_end_update;
- self->mod->server_fill_rect = server_fill_rect;
- self->mod->server_screen_blt = server_screen_blt;
- self->mod->server_paint_rect = server_paint_rect;
- self->mod->server_set_pointer = server_set_pointer;
- self->mod->server_palette = server_palette;
- self->mod->server_msg = server_msg;
- self->mod->server_is_term = server_is_term;
+ self->mod = self->mod_init();
}
}
+ if (self->mod != 0)
+ {
+ self->mod->wm = (long)self;
+ self->mod->server_begin_update = server_begin_update;
+ self->mod->server_end_update = server_end_update;
+ self->mod->server_fill_rect = server_fill_rect;
+ self->mod->server_screen_blt = server_screen_blt;
+ self->mod->server_paint_rect = server_paint_rect;
+ self->mod->server_set_pointer = server_set_pointer;
+ self->mod->server_palette = server_palette;
+ self->mod->server_msg = server_msg;
+ self->mod->server_is_term = server_is_term;
+ }
+ }
+ /* id self->mod is null, there must be a problem */
+ if (self->mod == 0)
+ {
+ DEBUG(("problem loading lib in xrdp_wm_setup_mod"));
+ return 1;
}
return 0;
}