From 8e819c331b2fb297810e37923929b461545dbc2a Mon Sep 17 00:00:00 2001 From: Henning Geinitz Date: Sun, 13 May 2001 16:23:48 +0000 Subject: [PATCH] Fixed some memory leaks. A bit of reformating. Added more debug output. Used #include "../include/sane/...". Henning Meier-Geinitz --- backend/net.c | 83 ++++++++++++++++++++++++++++++++++++++++-------- backend/net.desc | 2 +- backend/net.h | 2 +- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/backend/net.c b/backend/net.c index 522a72315..32a47566f 100644 --- a/backend/net.c +++ b/backend/net.c @@ -42,7 +42,7 @@ /* Please increase version number with every change (don't forget to update net.desc) */ -#define NET_VERSION "1.0.2" +#define NET_VERSION "1.0.3" #ifdef _AIX # include "../include/lalloca.h" /* MUST come first for AIX! */ @@ -106,7 +106,8 @@ add_device (const char *name, Net_Device ** ndp) if (he->h_addrtype != AF_INET) { - DBG (1, "add_device: don't know how to deal with addr family %d\n", he->h_addrtype); + DBG (1, "add_device: don't know how to deal with addr family %d\n", + he->h_addrtype); return SANE_STATUS_INVAL; } @@ -243,6 +244,8 @@ fail: static SANE_Status fetch_options (Net_Scanner * s) { + DBG(3, "fetch_options\n"); + if (s->opt.num_options) { sanei_w_set_dir (&s->hw->wire, WIRE_FREE); @@ -343,14 +346,14 @@ SANE_Status sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) PACKAGE_VERSION); serv = getservbyname ("sane", "tcp"); + if (serv) saned_port = serv->s_port; else { saned_port = htons (6566); - DBG (1, - "sane_init: could not find `sane' service (%s); using default port %d\n", - strerror (errno), ntohs (saned_port)); + DBG (1, "sane_init: could not find `sane' service (%s); using default " + "port %d\n", strerror (errno), ntohs (saned_port)); } fp = sanei_config_open (NET_CONFIG_FILE); @@ -366,6 +369,7 @@ SANE_Status sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) continue; /* ignore empty lines */ add_device (device_name, 0); + } fclose (fp); } @@ -380,7 +384,6 @@ SANE_Status sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) add_device (host, 0); free (copy); } - return SANE_STATUS_GOOD; } @@ -413,16 +416,28 @@ sane_exit (void) sanei_w_call (&dev->wire, SANE_NET_EXIT, (WireCodecFunc) sanei_w_void, 0, (WireCodecFunc) sanei_w_void, 0); - sanei_w_exit(&dev->wire); + sanei_w_exit (&dev->wire); close (dev->ctl); } if (dev->name) - free(dev->name); + free((void *) dev->name); free (dev); } if (devlist) - for (i = 0; devlist[i]; ++i) - free ((void *) devlist[i]); + { + for (i = 0; devlist[i]; ++i) + { + if (devlist[i]->vendor) + free ((void *) devlist[i]->vendor); + if (devlist[i]->model) + free ((void *) devlist[i]->model); + if (devlist[i]->type) + free ((void *) devlist[i]->type); + free ((void *) devlist[i]); + } + free (devlist); + } + DBG (3, "sane_exit: finished.\n"); } /* Note that a call to get_devices() implies that we'll have to @@ -456,6 +471,8 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) } \ } + DBG(3, "sane_get_devices: local_only = %d\n", local_only); + if (local_only) { *device_list = empty_devlist; @@ -463,8 +480,19 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) } if (devlist) - for (i = 0; i < devlist_len; ++i) - free ((void *) devlist[i]); + { + for (i = 0; devlist[i]; ++i) + { + if (devlist[i]->vendor) + free ((void *) devlist[i]->vendor); + if (devlist[i]->model) + free ((void *) devlist[i]->model); + if (devlist[i]->type) + free ((void *) devlist[i]->type); + free ((void *) devlist[i]); + } + free (devlist); + } devlist_len = 0; for (dev = first_device; dev; dev = dev->next) @@ -479,7 +507,6 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) continue; } } - sanei_w_call (&dev->wire, SANE_NET_GET_DEVICES, (WireCodecFunc) sanei_w_void, 0, (WireCodecFunc) sanei_w_get_devices_reply, &reply); @@ -605,7 +632,8 @@ SANE_Status sane_open (SANE_String_Const full_name, SANE_Handle * meta_handle) { if (dev->wire.status != 0) { - DBG (1, "sane_open: open rpc call failed (%s)\n", strerror (dev->wire.status)); + DBG (1, "sane_open: open rpc call failed (%s)\n", + strerror (dev->wire.status)); return SANE_STATUS_IO_ERROR; } @@ -661,6 +689,8 @@ sane_close (SANE_Handle handle) Net_Scanner *prev, *s; SANE_Word ack; + DBG(3, "sane_close: handle %p\n", handle); + prev = 0; for (s = first_handle; s; s = s->next) { @@ -678,6 +708,16 @@ sane_close (SANE_Handle handle) else first_handle = s->next; + if (s->opt.num_options) + { + sanei_w_set_dir (&s->hw->wire, WIRE_FREE); + s->hw->wire.status = 0; + sanei_w_option_descriptor_array (&s->hw->wire, &s->opt); + if (s->hw->wire.status) + DBG(1, "sane_close: couldn't free sanei_w_option_descriptor_array " + "(%s)\n", sane_strstatus (s->hw->wire.status)); + } + sanei_w_call (&s->hw->wire, SANE_NET_CLOSE, (WireCodecFunc) sanei_w_word, &s->handle, (WireCodecFunc) sanei_w_word, &ack); @@ -692,6 +732,8 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) Net_Scanner *s = handle; SANE_Status status; + DBG(3, "sane_get_option_descriptor: option %d\n", option); + if (!s->options_valid) { status = fetch_options (s); @@ -715,6 +757,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option, size_t value_size; int need_auth; + DBG(3, "sane_control_option: option %d, action %d\n", option, action); + if (!s->options_valid) { status = fetch_options (s); @@ -802,6 +846,8 @@ SANE_Status sane_get_parameters (SANE_Handle handle, SANE_Parameters * params) SANE_Get_Parameters_Reply reply; SANE_Status status; + DBG(3, "sane_get_parameters\n"); + if (!params) return SANE_STATUS_INVAL; @@ -827,6 +873,8 @@ SANE_Status sane_start (SANE_Handle handle) socklen_t len; short port; /* Internet-specific */ + DBG(3, "sane_start\n"); + if (s->data >= 0) return SANE_STATUS_INVAL; @@ -903,6 +951,8 @@ sane_read (SANE_Handle handle, SANE_Byte * data, SANE_Int max_length, Net_Scanner *s = handle; ssize_t nread; + DBG(3, "sane_read: max_length = %d\n", max_length); + if (s->data < 0) return SANE_STATUS_CANCELLED; @@ -983,6 +1033,8 @@ sane_cancel (SANE_Handle handle) Net_Scanner *s = handle; SANE_Word ack; + DBG(3, "sane_cancel\n"); + sanei_w_call (&s->hw->wire, SANE_NET_CANCEL, (WireCodecFunc) sanei_w_word, &s->handle, (WireCodecFunc) sanei_w_word, &ack); @@ -993,6 +1045,7 @@ SANE_Status sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking) { Net_Scanner *s = handle; + DBG(3, "sane_set_io_mode: non_blocking = %d\n", non_blocking); if (s->data < 0) return SANE_STATUS_INVAL; @@ -1006,6 +1059,8 @@ SANE_Status sane_get_select_fd (SANE_Handle handle, SANE_Int * fd) { Net_Scanner *s = handle; + DBG(3, "sane_get_select_fd: *fd = %d\n", *fd); + if (s->data < 0) return SANE_STATUS_INVAL; diff --git a/backend/net.desc b/backend/net.desc index 3368f3d65..012f0394c 100644 --- a/backend/net.desc +++ b/backend/net.desc @@ -1,5 +1,5 @@ :backend "net" ; name of backend -:version "1.0.2" +:version "1.0.3" :status :beta :manpage "sane-net" :url "mailto:jochen.eisinger@gmx.net" diff --git a/backend/net.h b/backend/net.h index 3b098a371..c2d026503 100644 --- a/backend/net.h +++ b/backend/net.h @@ -43,7 +43,7 @@ #include #include -#include +#include "../include/sane/sanei_wire.h" typedef struct Net_Device {