[packages/xsane] - rel 3; bunch of fedora fixes
arekm
arekm at pld-linux.org
Tue Aug 26 09:46:07 CEST 2014
commit 12d07cfb268091dbd27b39699b117be334af888a
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date: Tue Aug 26 09:46:02 2014 +0200
- rel 3; bunch of fedora fixes
xsane-0.995-close-fds.patch | 101 ++
xsane-0.995-xdg-open.patch | 32 +
xsane-0.996-no-eula.patch | 94 ++
xsane-0.997-off-root-build.patch | 127 ++
xsane-0.998-desktop-file.patch | 53 +
xsane-0.998-libpng.patch | 41 +
xsane-0.998-preview-selection.patch | 60 +
xsane-0.998-wmclass.patch | 33 +
xsane-0.999-coverity.patch | 2679 +++++++++++++++++++++++++++++++++++
xsane-0.999-lcms2.patch | 372 +++++
xsane-0.999-man-page.patch | 109 ++
xsane-0.999-no-file-selected.patch | 91 ++
xsane-0.999-pdf-no-high-bpp.patch | 51 +
xsane-0.999-signal-handling.patch | 242 ++++
xsane-0.999-snprintf-update.patch | 1390 ++++++++++++++++++
xsane-libpng.patch | 20 -
xsane.spec | 97 +-
17 files changed, 5558 insertions(+), 34 deletions(-)
---
diff --git a/xsane.spec b/xsane.spec
index da22e43..48ec79e 100644
--- a/xsane.spec
+++ b/xsane.spec
@@ -3,7 +3,7 @@ Summary(pl.UTF-8): Ulepszony frontend do SANE
Summary(zh_CN.UTF-8): xsane - 一个图形扫描程序
Name: xsane
Version: 0.999
-Release: 2
+Release: 3
License: GPL v2+
Group: X11/Applications/Graphics
#Source0Download: http://www.xsane.org/cgi-bin/sitexplorer.cgi?/download/
@@ -11,19 +11,73 @@ Source0: http://www.xsane.org/download/%{name}-%{version}.tar.gz
# Source0-md5: 9927f21e1ab6ba96315e7f0e30746deb
Source1: %{name}.desktop
Source2: %{name}.png
-Patch0: %{name}-datadir.patch
-Patch1: %{name}-pl.po-update.patch
-Patch2: %{name}-poMakefile.patch
-Patch3: %{name}-libpng.patch
-Patch4: %{name}-build.patch
-Patch5: %{name}-0.997-ipv6.patch
+# from Fedora
+# use "xdg-open" instead of "netscape" to launch help browser
+# submitted to upstream (Oliver Rauch) via email, 2013-06-04
+Patch0: xsane-0.995-xdg-open.patch
+# submitted to upstream (Oliver Rauch) via email, 2009-08-18
+Patch1: xsane-0.995-close-fds.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=504344
+# distro-specific(?), upstream won't accept it: "don't show license dialog"
+# submitted to upstream (Oliver Rauch) anyway via email, 2013-06-04
+Patch2: xsane-0.996-no-eula.patch
+# enable off-root building
+# submitted to upstream (Oliver Rauch) via email, 2010-06-23
+Patch3: xsane-0.997-off-root-build.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=608047
+# https://bugzilla.redhat.com/show_bug.cgi?id=621778
+# submitted to upstream (Oliver Rauch) via email, 2013-07-05
+Patch4: xsane-0.999-no-file-selected.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=198422
+# submitted to upstream (Oliver Rauch) via email, 2010-06-29
+Patch5: xsane-0.997-ipv6.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=624190
+# fix from: https://bugs.launchpad.net/ubuntu/+source/xsane/+bug/370818
+# submitted to upstream (Oliver Rauch) via email, 2011-06-01
+Patch6: xsane-0.998-preview-selection.patch
+# fix building with libpng >= 1.5
+# submitted to upstream (Oliver Rauch) via email, 2011-11-21
+Patch7: xsane-0.998-libpng.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=795085
+# set program name/wmclass so GNOME shell picks appropriate high resolution
+# icon file
+# submitted to upstream (Oliver Rauch) via email, 2013-06-04
+Patch8: xsane-0.998-wmclass.patch
+# partly distro-specific: customize desktop file
+# submitted to upstream (Oliver Rauch) via email, 2013-06-04
+Patch9: xsane-0.998-desktop-file.patch
+# man page: update command line options
+# submitted to upstream (Oliver Rauch) via email, 2013-07-08
+Patch10: xsane-0.999-man-page.patch
+# avoid producing PDFs with bpp > 8
+# submitted to upstream (Oliver Rauch) via email, 2013-09-09
+Patch11: xsane-0.999-pdf-no-high-bpp.patch
+# build against lcms 2.x
+# submitted to upstream (Oliver Rauch) via email, 2013-09-23
+Patch12: xsane-0.999-lcms2.patch
+# fix issues found during static analysis that don't require far-reaching
+# refactoring
+# submitted to upstream (Oliver Rauch) via email, 2014-04-02
+Patch13: xsane-0.999-coverity.patch
+# update lib/snprintf.c to the latest version from LPRng that has a Free license
+# submitted to upstream (Oliver Rauch) via email, 2014-05-29
+Patch14: xsane-0.999-snprintf-update.patch
+# fix signal handling (#1073698)
+# submitted to upstream (Oliver Rauch) via email, 2014-07-03
+Patch15: xsane-0.999-signal-handling.patch
+
+# PLD
+Patch50: %{name}-datadir.patch
+Patch51: %{name}-pl.po-update.patch
+Patch52: %{name}-poMakefile.patch
+Patch53: %{name}-build.patch
URL: http://www.xsane.org/
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: gettext-devel
BuildRequires: gimp-devel >= 1:2.0.0
BuildRequires: gtk+2-devel >= 1:2.0.0
-BuildRequires: lcms-devel
+BuildRequires: lcms2-devel
BuildRequires: libjpeg-devel
BuildRequires: libpng-devel
BuildRequires: libtiff-devel
@@ -44,12 +98,27 @@ do komunikacji ze skanerem.
%prep
%setup -q
-%patch0 -p1
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
+%patch0 -p1 -b .xdg-open
+%patch1 -p1 -b .close-fds
+%patch2 -p1 -b .no-eula
+%patch3 -p1 -b .off-root-build
+%patch4 -p1 -b .no-file-selected
+%patch5 -p1 -b .ipv6
+%patch6 -p1 -b .preview-selection.patch
+%patch7 -p1 -b .libpng
+%patch8 -p1 -b .wmclass
+%patch9 -p1 -b .desktop-file
+%patch10 -p1 -b .man-page
+%patch11 -p1 -b .pdf-no-high-bpp
+%patch12 -p1 -b .lcms2
+%patch13 -p1 -b .coverity
+%patch14 -p1 -b .snprintf-update
+%patch15 -p1 -b .signal-handling
+
+%patch50 -p1
+%patch51 -p1
+%patch52 -p1
+%patch53 -p1
mv -f po/{zh,zh_TW}.po
diff --git a/xsane-0.995-close-fds.patch b/xsane-0.995-close-fds.patch
new file mode 100644
index 0000000..917b075
--- /dev/null
+++ b/xsane-0.995-close-fds.patch
@@ -0,0 +1,101 @@
+From 6dee7eadd1b7352ec503ea04fa1639d4a93f370b Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Thu, 16 Aug 2012 11:18:31 +0200
+Subject: [PATCH] patch: close-fds
+
+Squashed commit of the following:
+
+commit 4fdedd3a8b66fb42b2d4dde62df28c78571c1c5d
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri Nov 19 12:15:58 2010 +0100
+
+ don't leak file descriptors to help browser process (#455450)
+---
+ src/xsane.c | 43 +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 43 insertions(+)
+
+diff --git a/src/xsane.c b/src/xsane.c
+index 775610e..1c5d61d 100644
+--- a/src/xsane.c
++++ b/src/xsane.c
+@@ -48,6 +48,8 @@
+
+ #include <sys/wait.h>
+
++#include <stdarg.h>
++
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+
+ struct option long_options[] =
+@@ -3684,6 +3686,41 @@ static void xsane_show_gpl(GtkWidget *widget, gpointer data)
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+
++static void xsane_close_fds_for_exec(signed int first_fd_to_leave_open, ...)
++{
++ int open_max;
++ signed int i;
++
++ va_list ap;
++ unsigned char *close_fds;
++
++ open_max = (int) sysconf (_SC_OPEN_MAX);
++
++ close_fds = malloc (open_max);
++
++ memset (close_fds, 1, open_max);
++
++ va_start (ap, first_fd_to_leave_open);
++
++ for (i = first_fd_to_leave_open; i >= 0; i = va_arg (ap, signed int)) {
++ if (i < open_max)
++ close_fds[i] = 0;
++ }
++
++ va_end (ap);
++
++ DBG(DBG_info, "closing unneeded file descriptors\n");
++
++ for (i = 0; i < open_max; i++) {
++ if (close_fds[i])
++ close (i);
++ }
++
++ free (close_fds);
++}
++
++/* ---------------------------------------------------------------------------------------------------------------------- */
++
+ static void xsane_show_doc_via_nsr(GtkWidget *widget, gpointer data) /* show via netscape remote */
+ {
+ char *name = (char *) data;
+@@ -3736,6 +3773,8 @@ static void xsane_show_doc_via_nsr(GtkWidget *widget, gpointer data) /* show via
+ ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
+ }
+
++ xsane_close_fds_for_exec (1, 2, xsane.ipc_pipefd[1], -1);
++
+ DBG(DBG_info, "trying to change user id for new subprocess:\n");
+ DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
+ setuid(getuid());
+@@ -3778,6 +3817,8 @@ static void xsane_show_doc_via_nsr(GtkWidget *widget, gpointer data) /* show via
+ ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
+ }
+
++ xsane_close_fds_for_exec (1, 2, xsane.ipc_pipefd[1], -1);
++
+ DBG(DBG_info, "trying to change user id for new subprocess:\n");
+ DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
+ setuid(getuid());
+@@ -3899,6 +3940,8 @@ static void xsane_show_doc(GtkWidget *widget, gpointer data)
+ ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
+ }
+
++ xsane_close_fds_for_exec (1, 2, xsane.ipc_pipefd[1], -1);
++
+ DBG(DBG_info, "trying to change user id for new subprocess:\n");
+ DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
+ setuid(getuid());
+--
+1.7.11.4
+
diff --git a/xsane-0.995-xdg-open.patch b/xsane-0.995-xdg-open.patch
new file mode 100644
index 0000000..c276938
--- /dev/null
+++ b/xsane-0.995-xdg-open.patch
@@ -0,0 +1,32 @@
+From 813d7063e3d265ba7e625766a040b8ba9bb130a9 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Thu, 16 Aug 2012 11:18:00 +0200
+Subject: [PATCH] patch: xdg-open
+
+Squashed commit of the following:
+
+commit 55380b90cece459e20d14e6da552abcf5ca54621
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri Nov 19 12:14:17 2010 +0100
+
+ use "xdg-open" instead of "netscape" to launch help browser
+---
+ src/xsane.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/xsane.h b/src/xsane.h
+index cf6111f..3d8caaa 100644
+--- a/src/xsane.h
++++ b/src/xsane.h
+@@ -251,7 +251,7 @@
+ # elif defined(HAVE_OS2_H)
+ # define DEFAULT_BROWSER "netscape"
+ # else
+-# define DEFAULT_BROWSER "netscape"
++# define DEFAULT_BROWSER "xdg-open"
+ # endif
+ #endif
+
+--
+1.7.11.4
+
diff --git a/xsane-0.996-no-eula.patch b/xsane-0.996-no-eula.patch
new file mode 100644
index 0000000..66cd684
--- /dev/null
+++ b/xsane-0.996-no-eula.patch
@@ -0,0 +1,94 @@
+From 7018206ea45db2e8bdfeb67d33f3387c9678a407 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Thu, 16 Aug 2012 11:19:16 +0200
+Subject: [PATCH] patch: no-eula
+
+Squashed commit of the following:
+
+commit d13f1ccfdf4c150cab91105e9b8542ecbb048a9b
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri Nov 19 12:20:52 2010 +0100
+
+ don't show EULA, mention bugzilla in about dialog (#504344)
+---
+ src/xsane-text.h | 2 ++
+ src/xsane.c | 16 ++++++----------
+ src/xsane.h | 3 +++
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/src/xsane-text.h b/src/xsane-text.h
+index fc6bbeb..ee4a222 100644
+--- a/src/xsane-text.h
++++ b/src/xsane-text.h
+@@ -230,6 +230,8 @@
+ "This program is distributed in the hope that it will be useful, but\n" \
+ "WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n")
++#define TEXT_MODIFIED_BLURB _("This package is modified from the original version.\n" \
++ "Please contact your vendor or report problems at")
+ #define TEXT_EMAIL_ADR _("E-mail:")
+ #define TEXT_HOMEPAGE _("Homepage:")
+ #define TEXT_FILE _("File:")
+diff --git a/src/xsane.c b/src/xsane.c
+index 1c5d61d..8b24b0c 100644
+--- a/src/xsane.c
++++ b/src/xsane.c
+@@ -3533,10 +3533,13 @@ static void xsane_about_dialog(GtkWidget *widget, gpointer data)
+ snprintf(buf, sizeof(buf), "XSane %s %s\n"
+ "%s %s\n"
+ "\n"
++ "%s\n%s"
++ "\n\n"
+ "%s %s\n"
+ "%s %s\n",
+ TEXT_VERSION, XSANE_VERSION,
+ XSANE_COPYRIGHT_SIGN, XSANE_COPYRIGHT_TXT,
++ TEXT_MODIFIED_BLURB, XSANE_BUGTRACKER_URL,
+ TEXT_HOMEPAGE, XSANE_HOMEPAGE,
+ TEXT_EMAIL_ADR, XSANE_EMAIL_ADR);
+
+@@ -5733,6 +5736,7 @@ static int xsane_init(int argc, char **argv)
+
+ case 'v': /* --version */
+ g_print("%s-%s %s %s\n", xsane.prog_name, XSANE_VERSION, XSANE_COPYRIGHT_SIGN, XSANE_COPYRIGHT_TXT);
++ g_print("\n%s\n%s\n\n", TEXT_MODIFIED_BLURB, XSANE_BUGTRACKER_URL);
+ g_print(" %s %s\n", TEXT_EMAIL_ADR, XSANE_EMAIL_ADR);
+ g_print(" %s %s\n", TEXT_PACKAGE, XSANE_PACKAGE_VERSION);
+ g_print(" %s%d.%d.%d\n", TEXT_GTK_VERSION, GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+@@ -5859,17 +5863,9 @@ static int xsane_init(int argc, char **argv)
+ }
+
+
+- if (xsane_pref_restore()) /* restore preferences, returns TRUE if license is not accpted yet */
++ if (xsane_pref_restore()) /* restore preferences, returns TRUE if the version is different from the last run */
+ {
+- if (xsane_display_eula(1)) /* show license and ask for accept/not accept */
+- {
+- DBG(DBG_info, "user did not accept eula, we abort\n");
+- return 1; /* User did not accept eula */
+- }
+- else /* User did accept eula */
+- {
+- xsane_pref_save();
+- }
++ xsane_pref_save();
+ }
+
+ xsane_pref_restore_media();
+diff --git a/src/xsane.h b/src/xsane.h
+index 3d8caaa..6c7568e 100644
+--- a/src/xsane.h
++++ b/src/xsane.h
+@@ -98,6 +98,9 @@
+ #define XSANE_EMAIL_ADR "Oliver.Rauch at xsane.org"
+ #define XSANE_HOMEPAGE "http://www.xsane.org"
+ #define XSANE_COPYRIGHT_TXT XSANE_DATE " " XSANE_COPYRIGHT
++#ifndef XSANE_BUGTRACKER_URL
++#define XSANE_BUGTRACKER_URL "(no bug tracker configured)"
++#endif
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+
+--
+1.7.11.4
+
diff --git a/xsane-0.997-off-root-build.patch b/xsane-0.997-off-root-build.patch
new file mode 100644
index 0000000..02155f8
--- /dev/null
+++ b/xsane-0.997-off-root-build.patch
@@ -0,0 +1,127 @@
+From 7f43255972b741ff178f94233ffff67c9779c247 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Thu, 16 Aug 2012 10:57:38 +0200
+Subject: [PATCH] patch: off-root-build
+
+Squashed commit of the following:
+
+commit f88d28c807667f618b3b1cf91c12b823f3853983
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri Nov 19 12:23:57 2010 +0100
+
+ enable off-root builds
+---
+ configure.in | 2 +-
+ doc/Makefile.in | 12 ++++++------
+ lib/Makefile.in | 4 ++--
+ src/Makefile.in | 8 ++++----
+ 4 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index a770253..770077b 100644
+--- a/configure.in
++++ b/configure.in
+@@ -312,4 +312,4 @@ echo "* ------------------------------------------------------------ *"
+ echo "* ... PLEASE READ SANE DOCUMENTATION BEFORE STARTING XSANE ... *"
+ echo "* ------------------------------------------------------------ *"
+ echo "****************************************************************"
+-cat xsane.NEWS
++cat ${srcdir}/xsane.NEWS
+diff --git a/doc/Makefile.in b/doc/Makefile.in
+index 59b022b..4038a6b 100644
+--- a/doc/Makefile.in
++++ b/doc/Makefile.in
+@@ -57,14 +57,14 @@ install: $(MANPAGES)
+ $(MKINSTALLDIRS) $(DESTDIR)$(datadir)
+
+ $(MKINSTALLDIRS) $(DESTDIR)$(xsanedocdir)
+- @for page in *.html; do\
++ @for page in $(notdir $(wildcard $(srcdir)/*.html)); do \
+ echo installing $${page} in $(DESTDIR)$(xsanedocdir)/$${page}...; \
+- $(INSTALL_DATA) $${page} $(DESTDIR)$(xsanedocdir)/$${page} || exit 1; \
++ $(INSTALL_DATA) $(srcdir)/$${page} $(DESTDIR)$(xsanedocdir)/$${page} || exit 1; \
+ done
+
+- @for image in *.jpg; do\
++ @for image in $(notdir $(wildcard $(srcdir)/*.jpg)); do \
+ echo installing $${image} in $(DESTDIR)$(xsanedocdir)/$${image}...; \
+- $(INSTALL_DATA) $${image} $(DESTDIR)$(xsanedocdir)/$${image} || exit 1; \
++ $(INSTALL_DATA) $(srcdir)/$${image} $(DESTDIR)$(xsanedocdir)/$${image} || exit 1; \
+ done
+
+ uninstall:
+@@ -73,12 +73,12 @@ uninstall:
+ rm -f $(DESTDIR)$(mandir)/man1/$${page} || exit 1; \
+ done
+
+- @for page in *.html; do\
++ @for page in $(notdir $(wildcard $(srcdir)/*.html)); do \
+ echo uninstalling $(DESTDIR)$(xsanedocdir)/$${page}...; \
+ rm -f $(DESTDIR)$(xsanedocdir)/$${page} || exit 1; \
+ done
+
+- @for image in *.jpg; do\
++ @for image in $(notdir $(wildcard $(srcdir)/*.jpg)); do \
+ echo uninstalling $${image} in $(DESTDIR)$(xsanedocdir)/$${image}...; \
+ rm -f $(DESTDIR)$(xsanedocdir)/$${image} || exit 1; \
+ done
+diff --git a/lib/Makefile.in b/lib/Makefile.in
+index 7567d54..6be1eeb 100644
+--- a/lib/Makefile.in
++++ b/lib/Makefile.in
+@@ -30,7 +30,7 @@ RANLIB = @RANLIB@
+
+ CC = @CC@
+ INCLUDES = -I. -I$(srcdir) \
+- -I$(top_builddir)/include/sane -I$(top_srcdir)/include
++ -I$(top_builddir)/include/sane -I$(top_builddir)/include -I$(top_srcdir)/include
+ CPPFLAGS = @CPPFLAGS@
+ CFLAGS = @CFLAGS@
+ LDFLAGS = @LDFLAGS@
+@@ -68,7 +68,7 @@ uninstall:
+ check:
+
+ depend:
+- makedepend -I. -I../include *.c
++ makedepend -I. -I../include $(srcdir)/*.c
+
+ clean:
+ rm -f *.out *.o *.lo *~ *.a *.bak $(TESTPROGRAMS)
+diff --git a/src/Makefile.in b/src/Makefile.in
+index 905ef93..2b246db 100644
+--- a/src/Makefile.in
++++ b/src/Makefile.in
+@@ -77,10 +77,10 @@ install: $(PROGRAMS)
+ $(INSTALL_DATA) $(srcdir)/xsane-eula.txt $(DESTDIR)$(sanedatadir)/xsane/xsane-eula.txt
+ $(INSTALL_DATA) $(srcdir)/xsane.desktop $(DESTDIR)$(desktopappdir)/xsane.desktop
+ $(INSTALL_DATA) $(srcdir)/xsane.xpm $(DESTDIR)$(pixmapdir)/xsane.xpm
+- @for logo in *-logo.xpm; do \
++ @for logo in $(notdir $(wildcard $(srcdir)/*-logo.xpm)); do \
+ echo installing $(DESTDIR)$(sanedatadir)/xsane/$${logo}; \
+ $(INSTALL_DATA) $(srcdir)/$${logo} $(DESTDIR)$(sanedatadir)/xsane/$${logo}; \
+- done
++ done
+
+ uninstall:
+ @for program in $(BINPROGS); do \
+@@ -99,7 +99,7 @@ uninstall:
+ rm -f $(DESTDIR)$(desktopappdir)/xsane.desktop
+ echo uninstalling $(DESTDIR)$(pixmapdir)/xsane.xpm
+ rm -f $(DESTDIR)$(pixmapdir)/xsane.xpm
+- @for logo in *-logo.xpm; do \
++ @for logo in $(notdir $(wildcard $(srcdir)/*-logo.xpm)); do \
+ echo uninstalling $(DESTDIR)$(sanedatadir)/xsane/$${logo}; \
+ rm -f $(DESTDIR)$(sanedatadir)/xsane/$${logo}; \
+ done
+@@ -119,7 +119,7 @@ distclean: clean
+ rm -f Makefile $(PROGRAMS)
+
+ depend:
+- makedepend $(INCLUDES) *.c
++ makedepend $(INCLUDES) $(srcdir)/*.c
+
+ .PHONY: all install depend clean distclean
+
+--
+1.7.11.4
+
diff --git a/xsane-0.998-desktop-file.patch b/xsane-0.998-desktop-file.patch
new file mode 100644
index 0000000..396be67
--- /dev/null
+++ b/xsane-0.998-desktop-file.patch
@@ -0,0 +1,53 @@
+From e3f3e266249f77ff655299daeab3128347d6cb17 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Wed, 30 Jan 2013 15:59:40 +0100
+Subject: [PATCH] patch: desktop-file
+
+Squashed commit of the following:
+
+commit e472b870c4490f41b9257c835d4c8c72a575e9e9
+Author: Nils Philippsen <nils at redhat.com>
+Date: Wed Jan 30 15:57:57 2013 +0100
+
+ desktop file: use Name, GenericName, X-GNOME-FullName
+
+commit 9f7f6a039193f91473ded79780bd72e29d7b94fb
+Author: Nils Philippsen <nils at redhat.com>
+Date: Wed Jan 30 15:57:14 2013 +0100
+
+ desktop file: remove obsolete encoding key
+
+commit 79a444793a60bd729c72283ad1920f0ce9c65dc2
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri Nov 19 12:41:23 2010 +0100
+
+ customize desktop file
+---
+ src/xsane.desktop | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/src/xsane.desktop b/src/xsane.desktop
+index d5161e5..a2a4a61 100644
+--- a/src/xsane.desktop
++++ b/src/xsane.desktop
+@@ -1,9 +1,14 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+-Name=XSane - Scanning
++Version=1.0
++#Name=XSane - Scanning
++Name=XSane
++GenericName=Scanner Tool
++X-GNOME-FullName=XSane (Scanner Tool)
+ Comment=Acquire images from a scanner
+ Exec=xsane
++TryExec=xsane
+ Icon=xsane
+ Terminal=false
+ Type=Application
+-Categories=Application;Graphics
++Categories=Graphics;2DGraphics;RasterGraphics;Scanning;GTK;
++StartupNotify=true
+--
+1.8.1
+
diff --git a/xsane-0.998-libpng.patch b/xsane-0.998-libpng.patch
new file mode 100644
index 0000000..c792c5a
--- /dev/null
+++ b/xsane-0.998-libpng.patch
@@ -0,0 +1,41 @@
+From bd29bb933cf80f397dd28286635da2aec58e6e6c Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Thu, 16 Aug 2012 11:26:54 +0200
+Subject: [PATCH] patch: libpng
+
+Squashed commit of the following:
+
+commit 9df6d60274c95b5081faf5b398aa27cde969c649
+Author: Nils Philippsen <nils at redhat.com>
+Date: Mon Nov 21 13:50:38 2011 +0100
+
+ support libpng-1.5
+---
+ src/xsane-save.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/xsane-save.c b/src/xsane-save.c
+index 87ef685..5461bf1 100644
+--- a/src/xsane-save.c
++++ b/src/xsane-save.c
+@@ -4912,7 +4912,7 @@ int xsane_save_png(FILE *outfile, int compression, FILE *imagefile, Image_info *
+ return -1; /* error */
+ }
+
+- if (setjmp(png_ptr->jmpbuf))
++ if (setjmp(png_jmpbuf(png_ptr)))
+ {
+ snprintf(buf, sizeof(buf), "%s %s", ERR_DURING_SAVE, ERR_LIBPNG);
+ xsane_back_gtk_error(buf, TRUE);
+@@ -5102,7 +5102,7 @@ int xsane_save_png_16(FILE *outfile, int compression, FILE *imagefile, Image_inf
+ return -1; /* error */
+ }
+
+- if (setjmp(png_ptr->jmpbuf))
++ if (setjmp(png_jmpbuf(png_ptr)))
+ {
+ snprintf(buf, sizeof(buf), "%s %s", ERR_DURING_SAVE, ERR_LIBPNG);
+ xsane_back_gtk_error(buf, TRUE);
+--
+1.7.11.4
+
diff --git a/xsane-0.998-preview-selection.patch b/xsane-0.998-preview-selection.patch
new file mode 100644
index 0000000..2939818
--- /dev/null
+++ b/xsane-0.998-preview-selection.patch
@@ -0,0 +1,60 @@
+From d8bf0d3f0af16e208b52084f19a9a1287acbcea0 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Fri, 2 Sep 2011 11:56:26 +0200
+Subject: [PATCH] patch: preview-selection
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Squashed commit of the following:
+
+commit e7c03a6de0c76256810b6340e0a954e88c3448e9
+Author: Reinhard Fössmeier <info at ais-sanmarino.org>
+Date: Wed May 12 20:23:18 2010 +0200
+
+ fixed a problem in mouse event processing
+
+ Fixed a problem in mouse event processing that interfered with selecting
+ the scan rectangle in the preview window.
+---
+ src/xsane-preview.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/src/xsane-preview.c b/src/xsane-preview.c
+index f089dd1..264c775 100644
+--- a/src/xsane-preview.c
++++ b/src/xsane-preview.c
+@@ -80,7 +80,6 @@
+ #include "xsane-preview.h"
+ #include "xsane-preferences.h"
+ #include "xsane-gamma.h"
+-#include <gdk/gdkkeysyms.h>
+
+
+ #ifndef PATH_MAX
+@@ -3023,9 +3022,9 @@ static gint preview_motion_event_handler(GtkWidget *window, GdkEvent *event, gpo
+ preview_display_color_components(p, event->motion.x, event->motion.y);
+
+ switch (((GdkEventMotion *)event)->state &
+- GDK_Num_Lock & GDK_Caps_Lock & GDK_Shift_Lock & GDK_Scroll_Lock) /* mask all Locks */
++ (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) /* only check for mouse buttons */
+ {
+- case 256: /* left button */
++ case GDK_BUTTON1_MASK: /* left button */
+
+ DBG(DBG_info2, "left button\n");
+
+@@ -3292,8 +3291,8 @@ static gint preview_motion_event_handler(GtkWidget *window, GdkEvent *event, gpo
+ }
+ break;
+
+- case 512: /* middle button */
+- case 1024: /* right button */
++ case GDK_BUTTON2_MASK: /* middle button */
++ case GDK_BUTTON3_MASK: /* right button */
+ DBG(DBG_info2, "middle or right button\n");
+
+ if (p->selection_drag)
+--
+1.7.11.4
+
diff --git a/xsane-0.998-wmclass.patch b/xsane-0.998-wmclass.patch
new file mode 100644
index 0000000..4fd84ba
--- /dev/null
+++ b/xsane-0.998-wmclass.patch
@@ -0,0 +1,33 @@
+From a0b23d7e1991b23e2b9ab78bf382c55b9e24cfb9 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Fri, 25 May 2012 11:47:39 +0200
+Subject: [PATCH] patch: wmclass
+
+Squashed commit of the following:
+
+commit d42b7a9dbe397a301373e3cbaa589540a1475a0b
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri May 25 11:45:48 2012 +0200
+
+ set program name -> wmclass to match desktop file name
+---
+ src/xsane.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/xsane.c b/src/xsane.c
+index 8b24b0c..eee76ff 100644
+--- a/src/xsane.c
++++ b/src/xsane.c
+@@ -6208,6 +6208,9 @@ int main(int argc, char **argv)
+ xsane.ipc_pipefd[1] = 0;
+ }
+
++ /* Set program name -> wmclass to match desktop file name */
++ g_set_prgname("xsane");
++
+ #if 0
+ bindtextdomain(PACKAGE, STRINGIFY(LOCALEDIR));
+ textdomain(PACKAGE);
+--
+1.7.11.4
+
diff --git a/xsane-0.999-coverity.patch b/xsane-0.999-coverity.patch
new file mode 100644
index 0000000..f6350fe
--- /dev/null
+++ b/xsane-0.999-coverity.patch
@@ -0,0 +1,2679 @@
+From 9fe09c0e0746067f9e9774229b3d0beb35c5766b Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Wed, 2 Apr 2014 14:54:05 +0200
+Subject: [PATCH] patch: coverity
+
+Squashed commit of the following:
+
+commit e26d784a5217d1609e774678d8abaeb2e1ecdadc
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Mar 11 10:28:02 2014 +0100
+
+ ensure loop is run at least once while scaling
+
+commit e5bf8c8a659a7b03ae3eb130ebfaad292e16816d
+Author: Nils Philippsen <nils at redhat.com>
+Date: Thu Feb 27 15:07:42 2014 +0100
+
+ remove stray semicolon
+
+commit ad928333ba038051ca0a405470dadeaa0f365b95
+Author: Nils Philippsen <nils at redhat.com>
+Date: Thu Feb 27 15:06:17 2014 +0100
+
+ use actual pointer type in realloc()
+
+commit 11dfb289d03555218318ce1a284c1165bbc58b22
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 17:42:54 2014 +0100
+
+ don't overflow size expression for allocation
+
+commit 5daccfc14f129c632f8409a89903d21c5495dd2f
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 17:18:58 2014 +0100
+
+ don't leak file descriptors and other resources
+
+commit 034023d7aaac378b8ab02051d11392c639154842
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 16:04:28 2014 +0100
+
+ don't overrun buffers
+
+commit f7454d62b5206e2100e8569e04ff4a6868cbd909
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 15:56:40 2014 +0100
+
+ check if files actually could be opened
+
+commit de30cacd285c02382a32dc48cf9fe015223a57f7
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 15:47:51 2014 +0100
+
+ handle negative return values of some calls
+
+commit b46a520ba85bda776b1a91de9f842ed96d97fa73
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 11:54:31 2014 +0100
+
+ only attempt to close successfully opened files
+
+commit bb6a8ccab418f89fa6fb367874f84aa56195cca0
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 11:54:15 2014 +0100
+
+ bail out early if memory can't be allocated
+
+commit 9b1e34c1d099c0a7acf7bd5aec8e3f0c2d2eafa8
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 11:53:11 2014 +0100
+
+ gtk_entry_get_text() isn't supposed to return NULL
+
+commit bc7553caaea1955e7fa48f3a2f4c0773d40204c3
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 11:00:11 2014 +0100
+
+ negate comparison instead of operand
+
+commit d1d4675a416383d808def730ade4f6b5b1a493b8
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 10:55:42 2014 +0100
+
+ use int types for fgetc() results
+
+commit cbdc2df85367c27ff56fb9cdd77a61c6d82be0e1
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 25 10:36:53 2014 +0100
+
+ avoid freeing static strings
+
+commit 0c377b9658daa5dcdbc6c260baa4e31237202f3e
+Author: Nils Philippsen <nils at redhat.com>
+Date: Wed Feb 19 16:10:35 2014 +0100
+
+ use guchar* for PNG profile buffer
+
+commit 70152131771b891fe04b3087e3b73c42e6d5ebbe
+Author: Nils Philippsen <nils at redhat.com>
+Date: Wed Feb 19 16:09:46 2014 +0100
+
+ cast time_t into long instead of int
+
+commit 0ac0683bcba7d8cf4e786abc3abe9c3e3c7d60a0
+Author: Nils Philippsen <nils at redhat.com>
+Date: Tue Feb 18 17:55:02 2014 +0100
+
+ use glib macros where ints are transported in pointers
+
+commit 8e85947fe5a592a3f938ab5bb2dc79488b638515
+Author: Nils Philippsen <nils at redhat.com>
+Date: Mon Feb 17 13:42:13 2014 +0100
+
+ handle return values of some file related system calls
+
+commit f4ba79f720a9a1e4a3caddc77d0de19a7d2fb75c
+Author: Nils Philippsen <nils at redhat.com>
+Date: Mon Feb 17 12:07:09 2014 +0100
+
+ avoid leaking resources
+---
+ src/xsane-back-gtk.c | 75 +++++++++++++---
+ src/xsane-batch-scan.c | 41 ++++-----
+ src/xsane-email-project.c | 83 +++++++++---------
+ src/xsane-fax-project.c | 14 ++-
+ src/xsane-front-gtk.c | 42 ++++-----
+ src/xsane-multipage-project.c | 5 ++
+ src/xsane-preview.c | 34 ++++----
+ src/xsane-save.c | 166 ++++++++++++++++++++++-------------
+ src/xsane-scan.c | 17 ++--
+ src/xsane-setup.c | 70 +++++++--------
+ src/xsane-text.h | 1 +
+ src/xsane-viewer.c | 199 +++++++++++++++++++++++-------------------
+ src/xsane.c | 65 ++++++++------
+ 13 files changed, 478 insertions(+), 334 deletions(-)
+
+diff --git a/src/xsane-back-gtk.c b/src/xsane-back-gtk.c
+index 6ef1506..6452f4b 100644
+--- a/src/xsane-back-gtk.c
++++ b/src/xsane-back-gtk.c
+@@ -40,6 +40,7 @@ SANE_Status xsane_control_option(SANE_Handle handle, SANE_Int option, SANE_Actio
+ const SANE_Option_Descriptor *xsane_get_option_descriptor(SANE_Handle handle, SANE_Int option);
+ const char *xsane_back_gtk_unit_string(SANE_Unit unit);
+ void xsane_back_gtk_set_tooltip(GtkTooltips *tooltips, GtkWidget *widget, const gchar *desc);
++static int xsane_back_gtk_ensure_dir(const char *path);
+ int xsane_back_gtk_make_path(size_t buf_size, char *buf, const char *prog_name, const char *dir_name,
+ const char *prefix, const char *dev_name, const char *postfix, int location);
+ void xsane_back_gtk_set_option(int opt_num, void *val, SANE_Action action);
+@@ -245,11 +246,47 @@ void xsane_back_gtk_set_tooltip(GtkTooltips *tooltips, GtkWidget *widget, const
+
+ /* ----------------------------------------------------------------------------------------------------------------- */
+
++static int xsane_back_gtk_ensure_dir(const char *path)
++{
++ struct stat statbuf;
++
++ if (stat(path, &statbuf) < 0)
++ {
++ if (errno != ENOENT)
++ {
++ /* stat() failed and it wasn't because the file doesn't exist */
++ return -1;
++ }
++ else
++ {
++ /* if path doesn't exist, create directory */
++ if (mkdir(path, 0777) < 0)
++ {
++ /* mkdir() failed */
++ return -2;
++ }
++ else
++ {
++ return 0;
++ }
++ }
++ }
++
++ if (S_ISDIR(statbuf.st_mode))
++ {
++ return 0;
++ }
++
++ /* path exists and isn't a directory */
++ return -3;
++}
++
+ int xsane_back_gtk_make_path(size_t buf_size, char *buf, const char *prog_name, const char *dir_name,
+ const char *prefix, const char *dev_name, const char *postfix, int location)
+ {
+ size_t len, extra;
+ int i;
++ char msgbuf[TEXTBUFSIZE];
+
+ DBG(DBG_proc, "xsane_back_gtk_make_path\n");
+
+@@ -263,7 +300,10 @@ int xsane_back_gtk_make_path(size_t buf_size, char *buf, const char *prog_name,
+ {
+ snprintf(buf, buf_size-2, "%s", STRINGIFY(XSANE_FIXED_APPDATA_DIR));
+ }
+- mkdir(buf, 0777); /* ensure ~/.sane directory exists */
++ if (xsane_back_gtk_ensure_dir(buf))
++ {
++ goto dir_failed;
++ }
+ }
+ else if (location == XSANE_PATH_SYSTEM) /* make path to system file */
+ {
+@@ -290,7 +330,10 @@ int xsane_back_gtk_make_path(size_t buf_size, char *buf, const char *prog_name,
+ len += extra;
+
+ buf[len] = '\0';
+- mkdir(buf, 0777); /* ensure ~/.sane/PROG_NAME directory exists */
++ if (xsane_back_gtk_ensure_dir(buf))
++ {
++ goto dir_failed;
++ }
+
+ buf[len++] = SLASH; /* OS/2 does not like slash at end of mktemp-path */
+ }
+@@ -314,7 +357,10 @@ int xsane_back_gtk_make_path(size_t buf_size, char *buf, const char *prog_name,
+ buf[len++] = SLASH;
+
+ buf[len] = '\0';
+- mkdir(buf, 0777); /* ensure DIR_NAME directory exists */
++ if (xsane_back_gtk_ensure_dir(buf))
++ {
++ goto dir_failed;
++ }
+ }
+
+ if (len >= buf_size)
+@@ -454,6 +500,12 @@ filename_too_long:
+ xsane_back_gtk_error(ERR_FILENAME_TOO_LONG, FALSE);
+ errno = E2BIG;
+ return -1;
++
++dir_failed:
++ snprintf(msgbuf, sizeof(msgbuf), "%s %s.", ERR_FAILED_CREATE_ENSURE_DIR,
++ strerror(errno));
++ xsane_back_gtk_error(msgbuf, FALSE);
++ return -1;
+ }
+
+ /* ----------------------------------------------------------------------------------------------------------------- */
+@@ -784,11 +836,15 @@ gint xsane_back_gtk_decision(gchar *title, gchar **xpm_d, gchar *message, gchar
+ void xsane_back_gtk_ipc_dialog_callback(gpointer data, gint source, GdkInputCondition cond)
+ {
+ char message[TEXTBUFSIZE];
+- size_t bytes;
++ ssize_t bytes;
+
+ DBG(DBG_proc, "xsane_back_gtk_message\n");
+
+- bytes = read(xsane.ipc_pipefd[0], message, sizeof(message)-1);
++ if ((bytes = read(xsane.ipc_pipefd[0], message, sizeof(message)-1)) < 0)
++ {
++ DBG(DBG_error, "xsane_back_gtk_message(): can't read from pipe\n");
++ return;
++ }
+ message[bytes] = 0;
+
+ xsane_back_gtk_decision(ERR_HEADER_CHILD_PROCESS_ERROR, (gchar **) error_xpm, message, BUTTON_CLOSE, 0 /* no reject text */, FALSE);
+@@ -1980,7 +2036,7 @@ static void xsane_back_gtk_value_update(GtkAdjustment *adj_data, DialogElement *
+ static void xsane_back_gtk_range_display_value_right_callback(GtkAdjustment *adjust, gpointer data)
+ {
+ gchar buf[TEXTBUFSIZE];
+- int digits = (int) data;
++ int digits = GPOINTER_TO_INT(data);
+ GtkLabel *label;
+
+ snprintf(buf, sizeof(buf), "%1.*f", digits, adjust->value);
+@@ -2028,7 +2084,7 @@ void xsane_back_gtk_range_new(GtkWidget *parent, const char *name, gfloat val,
+ gtk_widget_set_size_request(value_label, 45, -1);
+ gtk_box_pack_end(GTK_BOX(hbox), value_label, FALSE, FALSE, 1);
+
+- g_signal_connect(elem->data, "value_changed", (GtkSignalFunc) xsane_back_gtk_range_display_value_right_callback, (void *) digits);
++ g_signal_connect(elem->data, "value_changed", (GtkSignalFunc) xsane_back_gtk_range_display_value_right_callback, GINT_TO_POINTER(digits));
+ gtk_object_set_data(GTK_OBJECT(elem->data), "value-label", value_label);
+ g_signal_emit_by_name(GTK_OBJECT(elem->data), "value_changed"); /* update value */
+ gtk_widget_show(value_label);
+@@ -2318,10 +2374,7 @@ static void xsane_back_gtk_text_entry_callback(GtkWidget *w, gpointer data)
+ buf[0] = '\0';
+
+ text = gtk_entry_get_text(GTK_ENTRY(elem->widget));
+- if (text)
+- {
+- strncpy(buf, text, opt->size);
+- }
++ strncpy(buf, text, opt->size);
+ buf[opt->size - 1] = '\0';
+
+ xsane_back_gtk_set_option(opt_num, buf, SANE_ACTION_SET_VALUE);
+diff --git a/src/xsane-batch-scan.c b/src/xsane-batch-scan.c
+index 90cc0e0..12eb1b2 100644
+--- a/src/xsane-batch-scan.c
++++ b/src/xsane-batch-scan.c
+@@ -291,7 +291,7 @@ int xsane_batch_scan_load_list_from_file(char *filename)
+
+ fd = open(filename, O_RDONLY);
+
+- if (fd > 0)
++ if (fd >= 0)
+ {
+ w.io.fd = fd;
+ w.io.read = read;
+@@ -396,11 +396,11 @@ static void xsane_batch_scan_save_list(void)
+ sprintf(windowname, "%s %s %s", xsane.prog_name, WINDOW_SAVE_BATCH_LIST, xsane.device_text);
+ xsane_back_gtk_make_path(sizeof(filename), filename, "xsane", "batch-lists", 0, "default", ".xbl", XSANE_PATH_LOCAL_SANE);
+
+- if (!xsane_back_gtk_get_filename(windowname, filename, sizeof(filename), filename, NULL, NULL, XSANE_FILE_CHOOSER_ACTION_SAVE, XSANE_GET_FILENAME_SHOW_NOTHING, XSANE_FILE_FILTER_ALL | XSANE_FILE_FILTER_BATCHLIST, XSANE_FILE_FILTER_BATCHLIST));
++ if (!xsane_back_gtk_get_filename(windowname, filename, sizeof(filename), filename, NULL, NULL, XSANE_FILE_CHOOSER_ACTION_SAVE, XSANE_GET_FILENAME_SHOW_NOTHING, XSANE_FILE_FILTER_ALL | XSANE_FILE_FILTER_BATCHLIST, XSANE_FILE_FILTER_BATCHLIST))
+ {
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+- if (fd > 0)
++ if (fd >= 0)
+ {
+ w.io.fd = fd;
+ w.io.read = read;
+@@ -680,7 +680,6 @@ static GtkWidget *xsane_batch_scan_create_list_entry(Batch_Scan_Parameters *para
+ GtkWidget *list_item;
+ GtkWidget *hbox;
+ int size = 120;
+- char *data;
+
+ list_item = gtk_list_item_new();
+
+@@ -688,8 +687,6 @@ static GtkWidget *xsane_batch_scan_create_list_entry(Batch_Scan_Parameters *para
+ gtk_container_add(GTK_CONTAINER(list_item), hbox);
+ gtk_widget_show(hbox);
+
+- data = calloc(size, size);
+-
+ parameters->gtk_preview = gtk_preview_new(GTK_PREVIEW_COLOR);
+ gtk_preview_size(GTK_PREVIEW(parameters->gtk_preview), size, size);
+ gtk_box_pack_start(GTK_BOX(hbox), parameters->gtk_preview, FALSE, FALSE, 0);
+@@ -725,13 +722,17 @@ void xsane_batch_scan_add()
+
+ parameters = calloc(1, sizeof(Batch_Scan_Parameters));
+
+- if (parameters)
++ if (!parameters)
+ {
+- xsane_batch_scan_get_parameters(parameters);
+-
+- parameters->name = strdup(TEXT_BATCH_AREA_DEFAULT_NAME);
++ DBG(DBG_error, "xsane_batch_scan_add(): couldn't allocate memory for "
++ "parameters\n");
++ return;
+ }
+
++ xsane_batch_scan_get_parameters(parameters);
++
++ parameters->name = strdup(TEXT_BATCH_AREA_DEFAULT_NAME);
++
+ list_item = xsane_batch_scan_create_list_entry(parameters);
+
+ /* scroll list to end */
+@@ -796,7 +797,7 @@ static void xsane_batch_scan_rotate_mirror(GtkWidget *widget, gpointer data)
+ GList *select;
+ GtkObject *list_item;
+ Batch_Scan_Parameters *parameters = NULL;
+- int rotate_info = (int) data;
++ int rotate_info = GPOINTER_TO_INT(data);
+ int rotate, mirror;
+
+ DBG(DBG_proc, "xsane_batch_scan_rotate_mirror\n");
+@@ -834,7 +835,7 @@ static void xsane_batch_scan_rename_button_callback(GtkWidget *widget, gpointer
+ {
+ DBG(DBG_proc, "xsane_batch_scan_rename\n");
+
+- xsane_batch_scan_rename = (int) data;
++ xsane_batch_scan_rename = GPOINTER_TO_INT(data);
+ }
+
+
+@@ -881,7 +882,7 @@ static void xsane_batch_scan_rename_callback(GtkWidget *widget, gpointer data)
+ gtk_window_set_resizable(GTK_WINDOW(rename_dialog), FALSE);
+ snprintf(buf, sizeof(buf), "%s %s", xsane.prog_name, WINDOW_BATCH_RENAME);
+ gtk_window_set_title(GTK_WINDOW(rename_dialog), buf);
+- g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_batch_scan_rename_button_callback,(void *) -1);
++ g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_batch_scan_rename_button_callback, GINT_TO_POINTER(-1));
+ gtk_widget_show(rename_dialog);
+
+ text = gtk_entry_new();
+@@ -898,7 +899,7 @@ static void xsane_batch_scan_rename_callback(GtkWidget *widget, gpointer data)
+ #else
+ button = gtk_button_new_with_label(BUTTON_CANCEL);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_batch_scan_rename_button_callback, (void *) -1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_batch_scan_rename_button_callback, GINT_TO_POINTER(-1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+@@ -909,7 +910,7 @@ static void xsane_batch_scan_rename_callback(GtkWidget *widget, gpointer data)
+ button = gtk_button_new_with_label(BUTTON_OK);
+ #endif
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_batch_scan_rename_button_callback, (void *) 1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_batch_scan_rename_button_callback, GINT_TO_POINTER(1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_grab_default(button);
+ gtk_widget_show(button);
+@@ -1000,11 +1001,11 @@ void xsane_create_batch_scan_dialog(const char *devicetext)
+ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, del_batch_xpm, DESC_BATCH_DEL, (GtkSignalFunc) xsane_batch_scan_delete, NULL);
+
+ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, ascii_xpm, DESC_BATCH_RENAME, (GtkSignalFunc) xsane_batch_scan_rename_callback, NULL);
+- xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, rotate90_xpm, DESC_ROTATE90, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, (void *) 1);
+- xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, rotate180_xpm, DESC_ROTATE180, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, (void *) 2);
+- xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, rotate270_xpm, DESC_ROTATE270, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, (void *) 3);
+- xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, mirror_x_xpm, DESC_MIRROR_X, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, (void *) 4);
+- xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, mirror_y_xpm, DESC_MIRROR_Y, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, (void *) 6);
++ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, rotate90_xpm, DESC_ROTATE90, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, GINT_TO_POINTER(1));
++ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, rotate180_xpm, DESC_ROTATE180, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, GINT_TO_POINTER(2));
++ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, rotate270_xpm, DESC_ROTATE270, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, GINT_TO_POINTER(3));
++ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, mirror_x_xpm, DESC_MIRROR_X, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, GINT_TO_POINTER(4));
++ xsane_button_new_with_pixmap(xsane.batch_scan_dialog->window, xsane.batch_scan_button_box, mirror_y_xpm, DESC_MIRROR_Y, (GtkSignalFunc) xsane_batch_scan_rotate_mirror, GINT_TO_POINTER(6));
+
+
+ /* the scolled window with the list */
+diff --git a/src/xsane-email-project.c b/src/xsane-email-project.c
+index 23fc942..413e3f7 100644
+--- a/src/xsane-email-project.c
++++ b/src/xsane-email-project.c
+@@ -895,6 +895,11 @@ static void xsane_email_project_update_project_status()
+
+ snprintf(filename, sizeof(filename), "%s/xsane-mail-list", preferences.email_project);
+ projectfile = fopen(filename, "r+b"); /* r+ = read and write, position = start of file */
++ if (!projectfile)
++ {
++ DBG(DBG_error, "Could not open project file '%s'.\n", filename);
++ return;
++ }
+
+ snprintf(buf, 32, "%s@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", xsane.email_status); /* fill 32 characters status line */
+ fprintf(projectfile, "%s\n", buf); /* first line is status of email */
+@@ -931,6 +936,11 @@ void xsane_email_project_save()
+ }
+
+ projectfile = fopen(filename, "wb"); /* write binary (b for win32) */
++ if (! projectfile)
++ {
++ DBG(DBG_error, "Could not open project file '%s'.\n", filename);
++ return;
++ }
+
+ if (xsane.email_status)
+ {
+@@ -1271,7 +1281,7 @@ static void xsane_email_entry_rename_button_callback(GtkWidget *widget, gpointer
+ {
+ DBG(DBG_proc, "xsane_email_entry_rename\n");
+
+- xsane_email_entry_rename = (int) data;
++ xsane_email_entry_rename = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -1322,7 +1332,7 @@ static void xsane_email_entry_rename_callback(GtkWidget *widget, gpointer list)
+ gtk_window_set_resizable(GTK_WINDOW(rename_dialog), FALSE);
+ snprintf(filename, sizeof(filename), "%s %s", xsane.prog_name, WINDOW_EMAIL_RENAME);
+ gtk_window_set_title(GTK_WINDOW(rename_dialog), filename);
+- g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_email_entry_rename_button_callback, (void *) -1);
++ g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_email_entry_rename_button_callback, GINT_TO_POINTER(-1));
+ gtk_widget_show(rename_dialog);
+
+ text = gtk_entry_new();
+@@ -1339,7 +1349,7 @@ static void xsane_email_entry_rename_callback(GtkWidget *widget, gpointer list)
+ #else
+ button = gtk_button_new_with_label(BUTTON_CANCEL);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_button_callback,(void *) -1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_button_callback, GINT_TO_POINTER(-1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+@@ -1348,7 +1358,7 @@ static void xsane_email_entry_rename_callback(GtkWidget *widget, gpointer list)
+ #else
+ button = gtk_button_new_with_label(BUTTON_OK);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_button_callback, (void *) 1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_button_callback, GINT_TO_POINTER(1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+@@ -1526,6 +1536,11 @@ static void xsane_create_email(int fd)
+ {
+ DBG(DBG_error, "could not open email project file %s\n", filename);
+
++ if (projectfile)
++ {
++ fclose(projectfile);
++ }
++
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+@@ -1766,7 +1781,7 @@ static void xsane_create_email(int fd)
+
+ static void xsane_email_send_process()
+ {
+- int fd_socket;
++ int fd_socket = -1;
+ int status;
+ char *password;
+ int i;
+@@ -1787,36 +1802,20 @@ static void xsane_email_send_process()
+
+ if (fd_socket < 0) /* could not open socket */
+ {
+- if (xsane.email_status)
+- {
+- free(xsane.email_status);
+- }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_POP3_CONNECTION_FAILED);
+- xsane.email_progress_val = 0.0;
+- xsane_front_gtk_email_project_update_lockfile_status();
+-
+- free(password);
+-
+- return;
++ status = -1;
++ goto out;
+ }
+
+ status = pop3_login(fd_socket, preferences.email_auth_user, password);
+
+ close(fd_socket);
++ fd_socket = -1;
+
+ if (status == -1)
+ {
+- if (xsane.email_status)
+- {
+- free(xsane.email_status);
+- }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_POP3_LOGIN_FAILED);
+- xsane.email_progress_val = 0.0;
+- xsane_front_gtk_email_project_update_lockfile_status();
+-
+- free(password);
+-
+- return;
++ goto out;
+ }
+
+ DBG(DBG_info, "POP3 authentication done\n");
+@@ -1829,17 +1828,9 @@ static void xsane_email_send_process()
+
+ if (fd_socket < 0) /* could not open socket */
+ {
+- if (xsane.email_status)
+- {
+- free(xsane.email_status);
+- }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_SMTP_CONNECTION_FAILED);
+- xsane.email_progress_val = 0.0;
+- xsane_front_gtk_email_project_update_lockfile_status();
+-
+- free(password);
+-
+- return;
++ status = -1;
++ goto out;
+ }
+
+
+@@ -1847,7 +1838,8 @@ static void xsane_email_send_process()
+ preferences.email_authentication, preferences.email_auth_user, password);
+ if (status == -1)
+ {
+- return;
++ xsane.email_status = strdup(TEXT_EMAIL_STATUS_SMTP_ERR_DATA);
++ goto out;
+ }
+
+
+@@ -1855,19 +1847,30 @@ static void xsane_email_send_process()
+
+ write_smtp_footer(fd_socket);
+
+- close(fd_socket);
++out:
++ if (fd_socket >= 0)
++ {
++ close(fd_socket);
++ }
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+- xsane.email_status = strdup(TEXT_EMAIL_STATUS_SENT);
+- xsane.email_progress_val = 1.0;
++ if (status != -1)
++ {
++ xsane.email_status = strdup(TEXT_EMAIL_STATUS_SENT);
++ xsane.email_progress_val = 1.0;
++ }
++ else
++ {
++ xsane.email_progress_val = 0.0;
++ }
+ xsane_front_gtk_email_project_update_lockfile_status();
+
+ free(password);
+
+- _exit(0);
++ _exit(status);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+diff --git a/src/xsane-fax-project.c b/src/xsane-fax-project.c
+index 5750b55..c08af59 100644
+--- a/src/xsane-fax-project.c
++++ b/src/xsane-fax-project.c
+@@ -452,6 +452,12 @@ static void xsane_fax_project_update_project_status()
+ snprintf(filename, sizeof(filename), "%s/xsane-fax-list", preferences.fax_project);
+ projectfile = fopen(filename, "r+b"); /* r+ = read and write, position = start of file */
+
++ if (! projectfile)
++ {
++ DBG(DBG_error, "Could not open project file '%s'.\n", filename);
++ return;
++ }
++
+ snprintf(buf, 32, "%s@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", xsane.fax_status); /* fill 32 characters status line */
+ fprintf(projectfile, "%s\n", buf); /* first line is status of mail */
+
+@@ -754,7 +760,7 @@ static void xsane_fax_entry_rename_button_callback(GtkWidget *widget, gpointer d
+ {
+ DBG(DBG_proc, "xsane_fax_entry_rename\n");
+
+- xsane_fax_entry_rename = (int) data;
++ xsane_fax_entry_rename = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -805,7 +811,7 @@ static void xsane_fax_entry_rename_callback(GtkWidget *widget, gpointer list)
+ gtk_window_set_resizable(GTK_WINDOW(rename_dialog), FALSE);
+ snprintf(filename, sizeof(filename), "%s %s", xsane.prog_name, WINDOW_FAX_RENAME);
+ gtk_window_set_title(GTK_WINDOW(rename_dialog), filename);
+- g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_fax_entry_rename_button_callback,(void *) -1);
++ g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_fax_entry_rename_button_callback, GINT_TO_POINTER(-1));
+ gtk_widget_show(rename_dialog);
+
+ text = gtk_entry_new();
+@@ -822,7 +828,7 @@ static void xsane_fax_entry_rename_callback(GtkWidget *widget, gpointer list)
+ #else
+ button = gtk_button_new_with_label(BUTTON_CANCEL);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_fax_entry_rename_button_callback, (void *) -1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_fax_entry_rename_button_callback, GINT_TO_POINTER(-1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+@@ -832,7 +838,7 @@ static void xsane_fax_entry_rename_callback(GtkWidget *widget, gpointer list)
+ #else
+ button = gtk_button_new_with_label(BUTTON_OK);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_fax_entry_rename_button_callback, (void *) 1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_fax_entry_rename_button_callback, GINT_TO_POINTER(1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+diff --git a/src/xsane-front-gtk.c b/src/xsane-front-gtk.c
+index 7bb49b0..84452f2 100644
+--- a/src/xsane-front-gtk.c
++++ b/src/xsane-front-gtk.c
+@@ -598,7 +598,7 @@ gint xsane_authorization_callback(SANE_String_Const resource,
+ authorize_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_position(GTK_WINDOW(authorize_dialog), GTK_WIN_POS_CENTER);
+ gtk_window_set_resizable(GTK_WINDOW(authorize_dialog), FALSE);
+- g_signal_connect(GTK_OBJECT(authorize_dialog), "delete_event", GTK_SIGNAL_FUNC(xsane_authorization_button_callback), (void *) -1); /* -1 = cancel */
++ g_signal_connect(GTK_OBJECT(authorize_dialog), "delete_event", GTK_SIGNAL_FUNC(xsane_authorization_button_callback), GINT_TO_POINTER(-1)); /* -1 = cancel */
+ snprintf(buf, sizeof(buf), "%s %s", xsane.prog_name, WINDOW_AUTHORIZE);
+ gtk_window_set_title(GTK_WINDOW(authorize_dialog), buf);
+ xsane_set_window_icon(authorize_dialog, 0);
+@@ -667,7 +667,7 @@ gint xsane_authorization_callback(SANE_String_Const resource,
+ #else
+ button = gtk_button_new_with_label(BUTTON_CANCEL);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(xsane_authorization_button_callback), (void *) -1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(xsane_authorization_button_callback), GINT_TO_POINTER(-1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10); /* x-space around cancel-button */
+ gtk_widget_show(button);
+
+@@ -677,7 +677,7 @@ gint xsane_authorization_callback(SANE_String_Const resource,
+ button = gtk_button_new_with_label(BUTTON_OK);
+ #endif
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+- g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(xsane_authorization_button_callback), (void *) 1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(xsane_authorization_button_callback), GINT_TO_POINTER(1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10); /* x-space around OK-button */
+ gtk_widget_grab_default(button);
+ gtk_widget_show(button);
+@@ -1107,7 +1107,7 @@ void xsane_option_menu_new_with_pixmap(GdkWindow *window, GtkBox *parent, const
+ static void xsane_range_display_value_right_callback(GtkAdjustment *adjust, gpointer data)
+ {
+ gchar buf[TEXTBUFSIZE];
+- int digits = (int) data;
++ int digits = GPOINTER_TO_INT(data);
+ GtkLabel *label;
+
+ snprintf(buf, sizeof(buf), "%1.*f", digits, adjust->value);
+@@ -1144,7 +1144,7 @@ void xsane_range_new(GtkBox *parent, char *labeltext, const char *desc,
+ gtk_widget_set_size_request(value_label, 35, -1);
+ gtk_box_pack_end(GTK_BOX(hbox), value_label, FALSE, FALSE, 1);
+
+- g_signal_connect(*data, "value_changed", (GtkSignalFunc) xsane_range_display_value_right_callback, (void *) digits);
++ g_signal_connect(*data, "value_changed", (GtkSignalFunc) xsane_range_display_value_right_callback, GINT_TO_POINTER(digits));
+ gtk_object_set_data(GTK_OBJECT(*data), "value-label", value_label);
+ g_signal_emit_by_name(GTK_OBJECT(*data), "value_changed"); /* update value */
+ gtk_widget_show(value_label);
+@@ -1236,7 +1236,7 @@ void xsane_range_new_with_pixmap(GdkWindow *window, GtkBox *parent, const char *
+ gtk_widget_set_size_request(value_label, 35, -1);
+ gtk_box_pack_end(GTK_BOX(hbox), value_label, FALSE, FALSE, 1);
+
+- g_signal_connect(*data, "value_changed", (GtkSignalFunc) xsane_range_display_value_right_callback, (void *) digits);
++ g_signal_connect(*data, "value_changed", (GtkSignalFunc) xsane_range_display_value_right_callback, GINT_TO_POINTER(digits));
+ gtk_object_set_data(GTK_OBJECT(*data), "value-label", value_label);
+ g_signal_emit_by_name(GTK_OBJECT(*data), "value_changed"); /* update value */
+ gtk_widget_show(value_label);
+@@ -1383,7 +1383,7 @@ static void xsane_filename_counter_step_callback(GtkWidget *widget, gpointer dat
+ {
+ DBG(DBG_proc, "xsane_filename_counter_step_callback\n");
+
+- preferences.filename_counter_step = (int) data;
++ preferences.filename_counter_step = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -1528,7 +1528,7 @@ void xsane_outputfilename_new(GtkWidget *vbox)
+ snprintf(buf, sizeof(buf), "%+d", j);
+ xsane_filename_counter_step_item = gtk_menu_item_new_with_label(buf);
+ gtk_container_add(GTK_CONTAINER(xsane_filename_counter_step_menu), xsane_filename_counter_step_item);
+- g_signal_connect(GTK_OBJECT(xsane_filename_counter_step_item), "activate", (GtkSignalFunc) xsane_filename_counter_step_callback, (void *) j);
++ g_signal_connect(GTK_OBJECT(xsane_filename_counter_step_item), "activate", (GtkSignalFunc) xsane_filename_counter_step_callback, GINT_TO_POINTER(j));
+ gtk_widget_show(xsane_filename_counter_step_item);
+ if (preferences.filename_counter_step == j++)
+ {
+@@ -1895,7 +1895,7 @@ static GtkWidget *eula_dialog = NULL;
+
+ static gboolean xsane_eula_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
+ {
+- eula_accept_flag = (int) data;
++ eula_accept_flag = GPOINTER_TO_INT(data);
+
+ DBG(DBG_proc ,"xsane_eula_delete_event(%d)\n", eula_accept_flag);
+ eula_dialog = NULL;
+@@ -1907,7 +1907,7 @@ static gboolean xsane_eula_delete_event(GtkWidget *widget, GdkEvent *event, gpoi
+
+ static void xsane_eula_button_callback(GtkWidget *widget, gpointer data)
+ {
+- eula_accept_flag = (int) data;
++ eula_accept_flag = GPOINTER_TO_INT(data);
+
+ DBG(DBG_proc ,"xsane_eula_button_callback(%d)\n", eula_accept_flag);
+
+@@ -1937,7 +1937,7 @@ int xsane_display_eula(int ask_for_accept)
+ gtk_widget_set_size_request(eula_dialog, 550, 580);
+ gtk_window_set_position(GTK_WINDOW(eula_dialog), GTK_WIN_POS_CENTER);
+ gtk_window_set_resizable(GTK_WINDOW(eula_dialog), TRUE);
+- g_signal_connect(GTK_OBJECT(eula_dialog), "delete_event", GTK_SIGNAL_FUNC(xsane_eula_delete_event), (void *) -1); /* -1 = cancel */
++ g_signal_connect(GTK_OBJECT(eula_dialog), "delete_event", GTK_SIGNAL_FUNC(xsane_eula_delete_event), GINT_TO_POINTER(-1)); /* -1 = cancel */
+ snprintf(buf, sizeof(buf), "%s %s", xsane.prog_name, WINDOW_EULA);
+ gtk_window_set_title(GTK_WINDOW(eula_dialog), buf);
+ accelerator_group = gtk_accel_group_new();
+@@ -2090,13 +2090,13 @@ int xsane_display_eula(int ask_for_accept)
+ button = gtk_button_new_with_label(BUTTON_NOT_ACCEPT);
+ gtk_widget_add_accelerator(button, "clicked", accelerator_group, GDK_Escape, 0, DEF_GTK_ACCEL_LOCKED);
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_eula_button_callback, (void *) 1 /* not accept */);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_eula_button_callback, GINT_TO_POINTER(1) /* not accept */);
+ gtk_container_add(GTK_CONTAINER(hbox), button);
+ gtk_widget_grab_default(button);
+ gtk_widget_show(button);
+
+ button = gtk_button_new_with_label(BUTTON_ACCEPT);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_eula_button_callback, (void *) 0 /* accept */);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_eula_button_callback, GINT_TO_POINTER(0) /* accept */);
+ gtk_container_add(GTK_CONTAINER(hbox), button);
+ gtk_widget_show(button);
+ }
+@@ -2109,7 +2109,7 @@ int xsane_display_eula(int ask_for_accept)
+ #endif
+ gtk_widget_add_accelerator(button, "clicked", accelerator_group, GDK_Escape, 0, DEF_GTK_ACCEL_LOCKED);
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_eula_button_callback, (void *) 0 /* ok = accept */);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_eula_button_callback, GINT_TO_POINTER(0) /* ok = accept */);
+ gtk_container_add(GTK_CONTAINER(hbox), button);
+ gtk_widget_grab_default(button);
+ gtk_widget_show(button);
+@@ -2336,7 +2336,7 @@ void xsane_display_gpl(void)
+ #endif
+ gtk_widget_add_accelerator(button, "clicked", accelerator_group, GDK_Escape, 0, DEF_GTK_ACCEL_LOCKED);
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_close_license_dialog_callback, (void *) 0 /* ok = accept */);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_close_license_dialog_callback, GINT_TO_POINTER(0) /* ok = accept */);
+ gtk_container_add(GTK_CONTAINER(hbox), button);
+ gtk_widget_grab_default(button);
+ gtk_widget_show(button);
+@@ -2414,7 +2414,7 @@ static void xsane_front_gtk_getname_button_callback(GtkWidget *widget, gpointer
+ {
+ DBG(DBG_proc, "xsane_front_gtk_getname_button_callback\n");
+
+- xsane_front_gtk_getname_button = (int) data;
++ xsane_front_gtk_getname_button = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -2438,7 +2438,7 @@ int xsane_front_gtk_getname_dialog(const char *dialog_title, const char *desc_te
+ gtk_window_set_resizable(GTK_WINDOW(getname_dialog), FALSE);
+ snprintf(buf, sizeof(buf), "%s %s", xsane.prog_name, dialog_title);
+ gtk_window_set_title(GTK_WINDOW(getname_dialog), buf);
+- g_signal_connect(GTK_OBJECT(getname_dialog), "delete_event", (GtkSignalFunc) xsane_front_gtk_getname_button_callback, (void *) -1);
++ g_signal_connect(GTK_OBJECT(getname_dialog), "delete_event", (GtkSignalFunc) xsane_front_gtk_getname_button_callback, GINT_TO_POINTER(-1));
+ gtk_widget_show(getname_dialog);
+
+ /* set the main vbox */
+@@ -2469,7 +2469,7 @@ int xsane_front_gtk_getname_dialog(const char *dialog_title, const char *desc_te
+ #else
+ button = gtk_button_new_with_label(BUTTON_CANCEL);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_front_gtk_getname_button_callback, (void *) -1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_front_gtk_getname_button_callback, GINT_TO_POINTER(-1));
+ gtk_widget_add_accelerator(button, "clicked", accelerator_group, GDK_Escape, 0, DEF_GTK_ACCEL_LOCKED); /* ESC */
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+@@ -2479,7 +2479,7 @@ int xsane_front_gtk_getname_dialog(const char *dialog_title, const char *desc_te
+ #else
+ button = gtk_button_new_with_label(BUTTON_OK);
+ #endif
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_front_gtk_getname_button_callback, (void *) 1);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_front_gtk_getname_button_callback, GINT_TO_POINTER(1));
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+@@ -2580,9 +2580,9 @@ void xsane_front_gtk_email_project_update_lockfile_status()
+ {
+ fprintf(lockfile, "%s\n", xsane.email_status); /* first line is status of mail */
+ fprintf(lockfile, "%3d\n", (int) (xsane.email_progress_val * 100));
+- }
+
+- fclose(lockfile);
++ fclose(lockfile);
++ }
+ }
+ #endif
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+diff --git a/src/xsane-multipage-project.c b/src/xsane-multipage-project.c
+index f23e5f8..af3c6cc 100644
+--- a/src/xsane-multipage-project.c
++++ b/src/xsane-multipage-project.c
+@@ -517,6 +517,11 @@ void xsane_multipage_project_save()
+ }
+
+ projectfile = fopen(filename, "wb"); /* write binary (b for win32) */
++ if (!projectfile)
++ {
++ DBG(DBG_error, "Could not open project file '%s'.\n", filename);
++ return;
++ }
+
+ if (xsane.multipage_status)
+ {
+diff --git a/src/xsane-preview.c b/src/xsane-preview.c
+index 6eaf687..ef26098 100644
+--- a/src/xsane-preview.c
++++ b/src/xsane-preview.c
+@@ -4112,7 +4112,7 @@ static void preview_create_preset_area_menu(Preview *p, int selection)
+ gtk_container_add(GTK_CONTAINER(preset_area_menu), preset_area_item);
+ g_signal_connect(GTK_OBJECT(preset_area_item), "button_press_event", (GtkSignalFunc) preview_preset_area_context_menu_callback, p);
+ g_signal_connect(GTK_OBJECT(preset_area_item), "activate", (GtkSignalFunc) preview_preset_area_callback, p);
+- gtk_object_set_data(GTK_OBJECT(preset_area_item), "Selection", (void *) i);
++ gtk_object_set_data(GTK_OBJECT(preset_area_item), "Selection", GINT_TO_POINTER(i));
+ gtk_object_set_data(GTK_OBJECT(preset_area_item), "Preview", (void *) p);
+
+ gtk_widget_show(preset_area_item);
+@@ -4468,7 +4468,7 @@ Preview *preview_new(void)
+ rotation_item = gtk_menu_item_new_with_label(buf);
+ gtk_container_add(GTK_CONTAINER(rotation_menu), rotation_item);
+ g_signal_connect(GTK_OBJECT(rotation_item), "activate", (GtkSignalFunc) preview_rotation_callback, p);
+- gtk_object_set_data(GTK_OBJECT(rotation_item), "Selection", (void *) rot);
++ gtk_object_set_data(GTK_OBJECT(rotation_item), "Selection", GINT_TO_POINTER(rot));
+
+ gtk_widget_show(rotation_item);
+ }
+@@ -5145,11 +5145,11 @@ static void preview_save_image_file(Preview *p, FILE *out)
+ /* always save it as a 16 bit PPM image: */
+ fprintf(out, "P6\n"
+ "# surface: %g %g %g %g %u %u\n"
+- "# time: %d\n"
++ "# time: %ld\n"
+ "%d %d\n65535\n",
+ dsurface[0], dsurface[1], dsurface[2], dsurface[3],
+ p->surface_type, p->surface_unit,
+- (int) time(NULL),
++ (long) time(NULL),
+ p->image_width, p->image_height);
+
+ fwrite(p->image_data_raw, 6, p->image_width*p->image_height, out);
+@@ -5711,14 +5711,14 @@ static gint preview_preset_area_rename_callback(GtkWidget *widget, GtkWidget *pr
+
+ DBG(DBG_proc, "preview_preset_area_rename_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection"));
+ p = (Preview *) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Preview");
+
+ DBG(DBG_info ,"rename %s\n", preferences.preset_area[selection]->name);
+
+ /* set menu in correct state, is a bit strange this way but I do not have a better idea */
+ old_preset_area_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection"));
+ gtk_menu_popdown(GTK_MENU(old_preset_area_menu));
+ gtk_option_menu_set_history(GTK_OPTION_MENU(p->preset_area_option_menu), old_selection);
+
+@@ -5761,12 +5761,12 @@ static gint preview_preset_area_add_callback(GtkWidget *widget, GtkWidget *prese
+
+ DBG(DBG_proc, "preview_preset_area_add_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection"));
+ p = (Preview *) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Preview");
+
+ /* set menu in correct state, is a bit strange this way but I do not have a better idea */
+ old_preset_area_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection"));
+ gtk_menu_popdown(GTK_MENU(old_preset_area_menu));
+ gtk_option_menu_set_history(GTK_OPTION_MENU(p->preset_area_option_menu), old_selection);
+
+@@ -5812,7 +5812,7 @@ static gint preview_preset_area_delete_callback(GtkWidget *widget, GtkWidget *pr
+
+ DBG(DBG_proc, "preview_preset_area_delete_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection"));
+ p = (Preview *) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Preview");
+
+
+@@ -5832,7 +5832,7 @@ static gint preview_preset_area_delete_callback(GtkWidget *widget, GtkWidget *pr
+ old_preset_area_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+
+ gtk_option_menu_remove_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection"));
+
+ if (old_selection == selection) /* we are deleting the selected surface */
+ {
+@@ -5861,7 +5861,7 @@ static gint preview_preset_area_move_up_callback(GtkWidget *widget, GtkWidget *p
+
+ DBG(DBG_proc, "preview_preset_area_move_up_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection"));
+ p = (Preview *) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Preview");
+
+ if (selection > 1) /* make sure "full area" stays at top */
+@@ -5877,7 +5877,7 @@ static gint preview_preset_area_move_up_callback(GtkWidget *widget, GtkWidget *p
+ old_preset_area_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+
+ gtk_option_menu_remove_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection"));
+
+ if (old_selection == selection)
+ {
+@@ -5906,7 +5906,7 @@ static gint preview_preset_area_move_down_callback(GtkWidget *widget, GtkWidget
+
+ DBG(DBG_proc, "preview_preset_area_move_down_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Selection"));
+ p = (Preview *) gtk_object_get_data(GTK_OBJECT(preset_area_widget), "Preview");
+
+ /* full size can not moved down */
+@@ -5923,7 +5923,7 @@ static gint preview_preset_area_move_down_callback(GtkWidget *widget, GtkWidget
+ old_preset_area_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+
+ gtk_option_menu_remove_menu(GTK_OPTION_MENU(p->preset_area_option_menu));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_preset_area_menu))), "Selection"));
+
+ if (old_selection == selection)
+ {
+@@ -5954,7 +5954,7 @@ static gint preview_preset_area_context_menu_callback(GtkWidget *widget, GdkEven
+
+ DBG(DBG_proc, "preview_preset_area_context_menu_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ if (event->type == GDK_BUTTON_PRESS)
+ {
+@@ -6031,7 +6031,7 @@ static void preview_preset_area_callback(GtkWidget *widget, gpointer data)
+
+ DBG(DBG_proc, "preview_preset_area_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ p->preset_surface[0] = preferences.preset_area[selection]->xoffset;
+ p->preset_surface[1] = preferences.preset_area[selection]->yoffset;
+@@ -6055,7 +6055,7 @@ static void preview_rotation_callback(GtkWidget *widget, gpointer data)
+
+ DBG(DBG_proc, "preview_rotation_callback\n");
+
+- rot = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ rot = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ switch (rot)
+ {
+diff --git a/src/xsane-save.c b/src/xsane-save.c
+index 2d0e44b..31825d8 100644
+--- a/src/xsane-save.c
++++ b/src/xsane-save.c
+@@ -28,6 +28,8 @@
+ #include "xsane-save.h"
+ #include <time.h>
+ #include <sys/wait.h>
++#include <string.h>
++#include <errno.h>
+
+ #include <glib.h>
+
+@@ -138,7 +140,7 @@ int xsane_create_secure_file(const char *filename)
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
+ umask(XSANE_DEFAULT_UMASK); /* define new file permissions */
+
+- if (fd > 0)
++ if (fd >= 0)
+ {
+ DBG(DBG_info, "file %s is created and secure\n", filename);
+ close(fd);
+@@ -261,22 +263,27 @@ int xsane_get_filesize(char *filename)
+ {
+ FILE *infile;
+ int pos;
+- int size;
++ int size = -1;
+
+ infile = fopen(filename, "rb"); /* read binary (b for win32) */
+ if (infile == NULL)
+ {
+- return 0;
++ return 0;
+ }
+
+- pos = ftell(infile);
++ if ((pos = ftell(infile)) < 0)
++ {
++ DBG(DBG_error, "xsane_get_filesize(): can't get file position\n");
++ goto out;
++ }
+ fseek(infile, 0, SEEK_END); /* get size */
+ size = ftell(infile);
+ fseek(infile, pos, SEEK_SET); /* go to previous position */
+
++out:
+ fclose(infile);
+
+- return size;
++ return size;
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -959,7 +966,8 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio
+ int xsane_save_grayscale_image_as_lineart(FILE *outfile, FILE *imagefile, Image_info *image_info, GtkProgressBar *progress_bar, int *cancel_save)
+ {
+ int x, y, bit;
+- u_char bitval, packed;
++ int bitval;
++ u_char packed;
+
+ *cancel_save = 0;
+
+@@ -1107,7 +1115,7 @@ int xsane_save_scaled_image(FILE *outfile, FILE *imagefile, Image_info *image_in
+ y_factor = 1.0;
+ y = 0.0;
+
+- while (y < original_image_height)
++ do
+ {
+ DBG(DBG_info2, "xsane_save_scaled_image: original line %d, new line %d\n", (int) y, y_new);
+
+@@ -1233,6 +1241,7 @@ int xsane_save_scaled_image(FILE *outfile, FILE *imagefile, Image_info *image_in
+ y += y_factor;
+ read_line = (oldy != (int) y);
+ }
++ while (y < original_image_height);
+
+ if (read_line) /* we have to write one more line */
+ {
+@@ -3784,7 +3793,8 @@ int xsane_save_ps(FILE *outfile, FILE *imagefile, Image_info *image_info, float
+ static int xsane_embed_pdf_icm_profile(FILE *outfile, struct pdf_xref *xref, char *icm_filename, int flatedecode, int icc_object)
+ {
+ FILE *icm_profile;
+- size_t size, embed_len;
++ ssize_t size;
++ size_t embed_len;
+ unsigned char *embed_buffer;
+ int ret;
+
+@@ -3798,7 +3808,12 @@ static int xsane_embed_pdf_icm_profile(FILE *outfile, struct pdf_xref *xref, cha
+ }
+
+ fseek(icm_profile, 0, SEEK_END);
+- size = ftell(icm_profile);
++ if ((size = ftell(icm_profile)) < 0)
++ {
++ DBG(DBG_error, "Could not determine size of ICM profile file.");
++ fclose(icm_profile);
++ return -1;
++ }
+ fseek(icm_profile, 0, SEEK_SET);
+
+ embed_buffer = malloc(size + 1);
+@@ -4374,7 +4389,8 @@ static void xsane_jpeg_write_icm_profile(j_compress_ptr cinfo_ptr, const JOCTET
+ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const char *icm_filename)
+ {
+ FILE *icm_profile;
+- size_t size, embed_len;
++ ssize_t size;
++ size_t embed_len;
+ cmsUInt8Number *embed_buffer;
+
+ DBG(DBG_proc, "xsane_jpeg_embed_scanner_icm_profile(%s)\n", icm_filename);
+@@ -4385,15 +4401,19 @@ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const
+ return;
+ }
+
+- fseek(icm_profile, 0, SEEK_END);
+- size = ftell(icm_profile);
+- fseek(icm_profile, 0, SEEK_SET);
++ if ((fseek(icm_profile, 0, SEEK_END) < 0) ||
++ ((size = ftell(icm_profile)) < 0) ||
++ (fseek(icm_profile, 0, SEEK_SET) < 0))
++ {
++ DBG(DBG_error, "Can't determine size of ICM profile file '%s': '%s'",
++ icm_filename, strerror(errno));
++ goto out;
++ }
+
+ embed_buffer = (cmsUInt8Number *) malloc(size + 1);
+ if (embed_buffer)
+ {
+ embed_len = fread(embed_buffer, 1, size, icm_profile);
+- fclose(icm_profile);
+ embed_buffer[embed_len] = 0;
+
+ xsane_jpeg_write_icm_profile(cinfo_ptr, embed_buffer, embed_len);
+@@ -4401,6 +4421,9 @@ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const
+
+ DBG(DBG_info, "ICM profile %s has been embedded to jpeg file\n", icm_filename);
+ }
++
++out:
++ fclose(icm_profile);
+ }
+ #endif
+
+@@ -4606,15 +4629,20 @@ int xsane_save_jpeg(FILE *outfile, int quality, FILE *imagefile, Image_info *ima
+ static void xsane_tiff_embed_scanner_icm_profile(TIFF *tiffile, const char *icm_filename)
+ {
+ FILE *icm_profile;
+- size_t size;
++ ssize_t size;
+ char *icm_profile_buffer;
+
+ DBG(DBG_proc, "xsane_tiff_embed_scanner_icm_profile(%s)\n", icm_filename);
+ if((icm_profile = fopen(icm_filename, "rb")))
+ {
+- fseek(icm_profile, 0, SEEK_END);
+- size = ftell(icm_profile);
+- fseek(icm_profile, 0, SEEK_SET);
++ if ((fseek(icm_profile, 0, SEEK_END) < 0) ||
++ ((size = ftell(icm_profile)) < 0) ||
++ (fseek(icm_profile, 0, SEEK_SET) < 0))
++ {
++ DBG(DBG_error, "Can't determine size of ICM profile file '%s': '%s'",
++ icm_filename, strerror(errno));
++ goto out;
++ }
+
+ icm_profile_buffer = (char *) malloc(size + 1);
+
+@@ -4638,7 +4666,7 @@ static void xsane_tiff_embed_scanner_icm_profile(TIFF *tiffile, const char *icm_
+ DBG(DBG_error, "Can not get enogh memory for ICM profile\n");
+ }
+
+-
++out:
+ fclose(icm_profile);
+ }
+ else
+@@ -4869,17 +4897,22 @@ int xsane_save_tiff_page(TIFF *tiffile, int page, int pages, int quality, FILE *
+ static void xsane_png_embed_scanner_icm_profile(png_structp png_ptr, png_infop png_info_ptr, const char *icm_filename)
+ {
+ FILE *icm_profile;
+- gchar *profile_buffer;
+- size_t size;
++ guchar *profile_buffer;
++ ssize_t size;
+
+ DBG(DBG_proc, "xsane_png_embed_scanner_icm_profile(%s)\n", icm_filename);
+ icm_profile = fopen(icm_filename, "rb");
+
+ if (icm_profile)
+ {
+- fseek(icm_profile, 0, SEEK_END);
+- size = ftell(icm_profile);
+- fseek(icm_profile, 0, SEEK_SET);
++ if ((fseek(icm_profile, 0, SEEK_END) < 0) ||
++ ((size = ftell(icm_profile)) < 0) ||
++ (fseek(icm_profile, 0, SEEK_SET) < 0))
++ {
++ DBG(DBG_error, "Can't determine size of ICM profile file '%s': '%s'",
++ icm_filename, strerror(errno));
++ goto out;
++ }
+
+ profile_buffer = malloc(size);
+
+@@ -4901,6 +4934,7 @@ static void xsane_png_embed_scanner_icm_profile(png_structp png_ptr, png_infop p
+ DBG(DBG_error, "can not allocate profile_buffer\n");
+ }
+
++out:
+ fclose(icm_profile);
+ }
+ else
+@@ -5416,7 +5450,7 @@ static int xsane_save_pnm_16_ascii_color(FILE *outfile, FILE *imagefile, Image_i
+ *cancel_save = 0;
+
+
+- data = malloc(image_info->image_width * 6);
++ data = malloc((guint32)image_info->image_width * 6);
+
+ if (!data)
+ {
+@@ -5432,7 +5466,7 @@ static int xsane_save_pnm_16_ascii_color(FILE *outfile, FILE *imagefile, Image_i
+ {
+ DBG(DBG_info, "Doing CMS color conversion\n");
+
+- data_raw = malloc(image_info->image_width * 6);
++ data_raw = malloc((guint32)image_info->image_width * 6);
+
+ if (!data_raw)
+ {
+@@ -5622,7 +5656,7 @@ static int xsane_save_pnm_16_binary_color(FILE *outfile, FILE *imagefile, Image_
+
+ *cancel_save = 0;
+
+- data = malloc(image_info->image_width * 6);
++ data = malloc((guint32)image_info->image_width * 6);
+
+ if (!data)
+ {
+@@ -5638,7 +5672,7 @@ static int xsane_save_pnm_16_binary_color(FILE *outfile, FILE *imagefile, Image_
+ {
+ DBG(DBG_info, "Doing CMS color conversion\n");
+
+- data_raw = malloc(image_info->image_width * 6);
++ data_raw = malloc((guint32)image_info->image_width * 6);
+
+ if (!data_raw)
+ {
+@@ -6159,6 +6193,8 @@ int xsane_save_image_as_text(char *output_filename, char *input_filename, GtkPro
+
+ gtk_progress_set_format_string(GTK_PROGRESS(progress_bar), "");
+ xsane_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar), 0.0);
++
++ fclose(ocr_progress); /* close reading end of pipe */
+ }
+ else /* no pipe available */
+ {
+@@ -6178,11 +6214,6 @@ int xsane_save_image_as_text(char *output_filename, char *input_filename, GtkPro
+ }
+ }
+ }
+-
+- if (pipefd[0])
+- {
+- fclose(ocr_progress); /* close reading end of pipe */
+- }
+
+ return (*cancel_save);
+ }
+@@ -6784,11 +6815,12 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ unsigned tile_offset;
+ int i, x, y;
+ Image_info image_info;
+- FILE *imagefile;
++ FILE *imagefile = NULL;
+ int bytes;
+ unsigned char *data = NULL;
+ guint16 *data16 = NULL;
+ size_t bytes_read;
++ int retval = 0;
+ #ifdef HAVE_LIBLCMS
+ unsigned char *data_raw = NULL;
+ cmsHTRANSFORM hTransform = NULL;
+@@ -6799,13 +6831,13 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ *cancel_save = 0;
+
+ imagefile = fopen(input_filename, "rb"); /* read binary (b for win32) */
+- if (imagefile == 0)
++ if (!imagefile)
+ {
+ char buf[TEXTBUFSIZE];
+ snprintf(buf, sizeof(buf), "%s `%s': %s", ERR_OPEN_FAILED, input_filename, strerror(errno));
+ xsane_back_gtk_error(buf, TRUE);
+-
+- return -1;
++ retval = -1;
++ goto out;
+ }
+
+ xsane_read_pnm_header(imagefile, &image_info);
+@@ -6828,7 +6860,8 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+
+ snprintf(buf, sizeof(buf), "%s %s", ERR_DURING_SAVE, ERR_NO_MEM);
+ xsane_back_gtk_error(buf, TRUE);
+- return -1; /* error */
++ retval = -1; /* error */
++ goto out;
+ }
+
+ #ifdef HAVE_LIBLCMS
+@@ -6847,11 +6880,10 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ {
+ char buf[TEXTBUFSIZE];
+
+- free(data);
+-
+ snprintf(buf, sizeof(buf), "%s %s", ERR_DURING_SAVE, ERR_NO_MEM);
+ xsane_back_gtk_error(buf, TRUE);
+- return -1; /* error */
++ retval = -1; /* error */
++ goto out;
+ }
+ }
+ #endif
+@@ -6892,6 +6924,11 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ {
+ fseek(icm_profile, 0, SEEK_END);
+ size = ftell(icm_profile);
++ if (size < 0)
++ {
++ DBG(DBG_error, "xsane_transfer_to_gimp(): can't tell file position");
++ goto out;
++ }
+ fseek(icm_profile, 0, SEEK_SET);
+
+ profile_buffer = malloc(size);
+@@ -6949,7 +6986,7 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ case 1: /* 1 bit gray => conversion to 8 bit gray */
+ for (i = 0; i < ( (image_info.image_width + 7) / 8) * image_info.image_height; ++i)
+ {
+- u_char mask;
++ int mask;
+ int j;
+
+ mask = fgetc(imagefile);
+@@ -7219,7 +7256,7 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ g_free(tile);
+ tile = 0;
+
+- fclose(imagefile);
++out:
+
+ #ifdef HAVE_LIBLCMS
+ if (hTransform != NULL)
+@@ -7232,9 +7269,18 @@ int xsane_transfer_to_gimp(char *input_filename, int apply_ICM_profile, int cms_
+ free(data_raw);
+ }
+ #endif
+- free(data);
+
+- return 0;
++ if (imagefile)
++ {
++ fclose(imagefile);
++ }
++
++ if (data)
++ {
++ free(data);
++ }
++
++ return retval;
+ }
+ #endif /* HAVE_ANY_GIMP */
+
+@@ -7617,7 +7663,7 @@ int pop3_login(int fd_socket, char *user, char *passwd)
+ int len;
+ ssize_t bytes_written;
+
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7627,7 +7673,7 @@ int pop3_login(int fd_socket, char *user, char *passwd)
+ snprintf(buf, sizeof(buf), "USER %s\r\n", user);
+ DBG(DBG_info2, "> USER xxx\n");
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7641,7 +7687,7 @@ int pop3_login(int fd_socket, char *user, char *passwd)
+ snprintf(buf, sizeof(buf), "PASS %s\r\n", passwd);
+ DBG(DBG_info2, "> PASS xxx\n");
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7655,7 +7701,7 @@ int pop3_login(int fd_socket, char *user, char *passwd)
+ snprintf(buf, sizeof(buf), "QUIT\r\n");
+ DBG(DBG_info2, "> QUIT\n");
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7683,7 +7729,7 @@ int asmtp_authentication(int fd_socket, int auth_type, char *user, char *passwd)
+ bytes_written = write(fd_socket, buf, strlen(buf));
+ snprintf(buf, sizeof(buf), "%c%s%c%s", 0, user, 0, passwd);
+ write_string_base64(fd_socket, buf, strlen(user)+strlen(passwd)+2);
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7695,7 +7741,7 @@ int asmtp_authentication(int fd_socket, int auth_type, char *user, char *passwd)
+ snprintf(buf, sizeof(buf), "AUTH LOGIN\r\n");
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7710,7 +7756,7 @@ int asmtp_authentication(int fd_socket, int auth_type, char *user, char *passwd)
+ DBG(DBG_info2, "> (USERNAME)\n");
+ write_string_base64(fd_socket, user, strlen(user));
+
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7725,7 +7771,7 @@ int asmtp_authentication(int fd_socket, int auth_type, char *user, char *passwd)
+ DBG(DBG_info2, "> (PASSWORD)\n");
+ write_string_base64(fd_socket, passwd, strlen(passwd));
+
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7743,7 +7789,7 @@ int asmtp_authentication(int fd_socket, int auth_type, char *user, char *passwd)
+ snprintf(buf, sizeof(buf), "AUTH CRAM-MD5\r\n");
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7773,7 +7819,7 @@ int write_smtp_header(int fd_socket, char *from, char *to, int auth_type, char *
+ char *pos = NULL;
+ ssize_t bytes_written;
+
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7790,7 +7836,7 @@ int write_smtp_header(int fd_socket, char *from, char *to, int auth_type, char *
+ }
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7824,7 +7870,7 @@ int write_smtp_header(int fd_socket, char *from, char *to, int auth_type, char *
+ snprintf(buf, sizeof(buf), "MAIL FROM: <%s>\r\n", from);
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7864,7 +7910,7 @@ int write_smtp_header(int fd_socket, char *from, char *to, int auth_type, char *
+
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7897,7 +7943,7 @@ int write_smtp_header(int fd_socket, char *from, char *to, int auth_type, char *
+ snprintf(buf, sizeof(buf), "DATA\r\n");
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+@@ -7932,7 +7978,7 @@ int write_smtp_footer(int fd_socket)
+ snprintf(buf, sizeof(buf), "\r\n.\r\n");
+ DBG(DBG_info2, "> %s", buf);
+ bytes_written = write(fd_socket, buf, strlen(buf));
+- len = read(fd_socket, buf, sizeof(buf));
++ len = read(fd_socket, buf, sizeof(buf) - 1);
+ if (len >= 0)
+ {
+ buf[len] = 0;
+diff --git a/src/xsane-scan.c b/src/xsane-scan.c
+index 88f954a..b6a66d6 100644
+--- a/src/xsane-scan.c
++++ b/src/xsane-scan.c
+@@ -394,6 +394,13 @@ static void xsane_read_image_data(gpointer data, gint source, GdkInputCondition
+ {
+ long fpos = ftell(xsane.out);
+
++ if (fpos < 0)
++ {
++ DBG(DBG_error, "xsane_read_image_data(): can't tell file "
++ "position");
++ return;
++ }
++
+ fseek(xsane.out, 0, SEEK_CUR); /* sync between write and read */
+ bytes_read = fread(rgbbuf, 1, bytes - 1, xsane.out);
+ fseek(xsane.out, fpos, SEEK_SET);
+@@ -1173,6 +1180,8 @@ void xsane_scan_done(SANE_Status status)
+ {
+ abort = 1;
+ }
++
++ fclose(outfile);
+ }
+ else
+ {
+@@ -1182,8 +1191,6 @@ void xsane_scan_done(SANE_Status status)
+ xsane_back_gtk_error(buf, TRUE);
+ abort = 1;
+ }
+-
+- fclose(outfile);
+ }
+
+ fclose(infile);
+@@ -1452,7 +1459,7 @@ void xsane_scan_done(SANE_Status status)
+ }
+ else
+ {
+- type = "";
++ type = strdup("");
+ }
+
+ list_item = gtk_list_item_new_with_label(page);
+@@ -1493,7 +1500,7 @@ void xsane_scan_done(SANE_Status status)
+ }
+ else
+ {
+- type = "";
++ type = strdup("");
+ }
+
+ list_item = gtk_list_item_new_with_label(page);
+@@ -1535,7 +1542,7 @@ void xsane_scan_done(SANE_Status status)
+ }
+ else
+ {
+- type = "";
++ type = strdup("");
+ }
+
+ list_item = gtk_list_item_new_with_label(page);
+diff --git a/src/xsane-setup.c b/src/xsane-setup.c
+index a61833a..413a343 100644
+--- a/src/xsane-setup.c
++++ b/src/xsane-setup.c
+@@ -111,7 +111,7 @@ void xsane_new_printer(void)
+
+ DBG(DBG_proc, "xsane_new_printer\n");
+
+- newprinters = realloc(preferences.printer, (preferences.printerdefinitions+1) * sizeof(void *));
++ newprinters = realloc(preferences.printer, (preferences.printerdefinitions+1) * sizeof(Preferences_printer_t *));
+
+ if (newprinters) /* realloc returns NULL if failed, in this case the old memory keeps alive */
+ {
+@@ -309,7 +309,7 @@ static void xsane_setup_printer_callback(GtkWidget *widget, gpointer data)
+ {
+ DBG(DBG_proc, "xsane_setup_printer_callback\n");
+
+- preferences.printernr = (int) data;
++ preferences.printernr = GPOINTER_TO_INT(data);
+ xsane_setup_printer_update();
+ }
+
+@@ -328,7 +328,7 @@ static void xsane_setup_printer_menu_build(GtkWidget *option_menu)
+ {
+ printer_item = gtk_menu_item_new_with_label(preferences.printer[i]->name);
+ gtk_container_add(GTK_CONTAINER(printer_menu), printer_item);
+- g_signal_connect(GTK_OBJECT(printer_item), "activate", (GtkSignalFunc) xsane_setup_printer_callback, (void *) i);
++ g_signal_connect(GTK_OBJECT(printer_item), "activate", (GtkSignalFunc) xsane_setup_printer_callback, GINT_TO_POINTER(i));
+ gtk_widget_show(printer_item);
+ }
+
+@@ -454,7 +454,7 @@ static void xsane_setup_filename_counter_len_callback(GtkWidget *widget, gpointe
+ {
+ DBG(DBG_proc, "xsane_setup_filename_counter_len_callback\n");
+
+- xsane_setup.filename_counter_len = (int) data;
++ xsane_setup.filename_counter_len = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -464,7 +464,7 @@ static void xsane_setup_tiff_compression16_callback(GtkWidget *widget, gpointer
+ {
+ DBG(DBG_proc, "xsane_setup_tiff_compression16_callback\n");
+
+- xsane_setup.tiff_compression16_nr = (int) data;
++ xsane_setup.tiff_compression16_nr = GPOINTER_TO_INT(data);
+ }
+
+ /* -------------------------------------- */
+@@ -473,7 +473,7 @@ static void xsane_setup_tiff_compression8_callback(GtkWidget *widget, gpointer d
+ {
+ DBG(DBG_proc, "xsane_setup_tiff_compression8_callback\n");
+
+- xsane_setup.tiff_compression8_nr = (int) data;
++ xsane_setup.tiff_compression8_nr = GPOINTER_TO_INT(data);
+ }
+
+ /* -------------------------------------- */
+@@ -481,7 +481,7 @@ static void xsane_setup_tiff_compression8_callback(GtkWidget *widget, gpointer d
+ static void xsane_setup_tiff_compression1_callback(GtkWidget *widget, gpointer data)
+ {
+ DBG(DBG_proc, "xsane_setup_tiff_compression1_callback\n");
+- xsane_setup.tiff_compression1_nr = (int) data;
++ xsane_setup.tiff_compression1_nr = GPOINTER_TO_INT(data);
+ }
+ #endif
+
+@@ -569,7 +569,7 @@ static void xsane_setup_color_management_apply_changes(GtkWidget *widget, gpoint
+ {
+ DBG(DBG_proc, "xsane_setup_colormagaement_apply_changes\n");
+
+- preferences.cms_intent = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(xsane_setup.cms_intent_option_menu))))), "Selection");
++ preferences.cms_intent = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(xsane_setup.cms_intent_option_menu))))), "Selection"));
+ xsane_update_bool(xsane_setup.cms_bpc_button, &preferences.cms_bpc);
+
+ if (xsane.scanner_default_color_icm_profile)
+@@ -843,7 +843,7 @@ void xsane_close_setup_dialog_callback(GtkWidget *widget, gpointer data)
+
+ static void xsane_permission_toggled(GtkWidget *widget, gpointer data)
+ {
+- int mask = (int) data;
++ int mask = GPOINTER_TO_INT(data);
+ int *permission = 0;
+ const gchar *name = gtk_widget_get_name(widget);
+
+@@ -912,7 +912,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_READ);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 256);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(256));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+ gtk_widget_set_sensitive(button, user_sensitivity);
+@@ -922,7 +922,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_WRITE);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 128);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(128));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+ gtk_widget_set_sensitive(button, user_sensitivity);
+@@ -932,7 +932,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_SEARCH);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 64);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(64));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+ gtk_widget_set_sensitive(button, x_sensitivity & user_sensitivity);
+@@ -950,7 +950,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_READ);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 32);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(32));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+
+@@ -959,7 +959,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_WRITE);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 16);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(16));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+
+@@ -968,7 +968,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_SEARCH);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 8);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(8));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+ gtk_widget_set_sensitive(button, x_sensitivity);
+@@ -986,7 +986,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_READ);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 4);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(4));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+
+@@ -995,7 +995,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_WRITE);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 2);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(2));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+
+@@ -1004,7 +1004,7 @@ static void xsane_permission_box(GtkWidget *parent, gchar *name, gchar *descript
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_PERMISSION_SEARCH);
+ gtk_widget_set_size_request(button, 26, -1);
+ gtk_widget_set_name(button, name);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, (void *) 1);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_permission_toggled, GINT_TO_POINTER(1));
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);
+ gtk_widget_show(button);
+ gtk_widget_set_sensitive(button, x_sensitivity);
+@@ -1750,7 +1750,7 @@ static void xsane_saving_notebook(GtkWidget *notebook)
+ }
+ filename_counter_len_item = gtk_menu_item_new_with_label(buf);
+ gtk_container_add(GTK_CONTAINER(filename_counter_len_menu), filename_counter_len_item);
+- g_signal_connect(GTK_OBJECT(filename_counter_len_item), "activate", (GtkSignalFunc) xsane_setup_filename_counter_len_callback, (void *) i);
++ g_signal_connect(GTK_OBJECT(filename_counter_len_item), "activate", (GtkSignalFunc) xsane_setup_filename_counter_len_callback, GINT_TO_POINTER(i));
+ gtk_widget_show(filename_counter_len_item);
+ if (preferences.filename_counter_len == i)
+ {
+@@ -1983,7 +1983,7 @@ static void xsane_filetype_notebook(GtkWidget *notebook)
+ {
+ tiff_compression_item = gtk_menu_item_new_with_label(tiff_compression16_strings[i-1].name);
+ gtk_container_add(GTK_CONTAINER(tiff_compression_menu), tiff_compression_item);
+- g_signal_connect(GTK_OBJECT(tiff_compression_item), "activate", (GtkSignalFunc) xsane_setup_tiff_compression16_callback, (void *) tiff_compression16_strings[i-1].number);
++ g_signal_connect(GTK_OBJECT(tiff_compression_item), "activate", (GtkSignalFunc) xsane_setup_tiff_compression16_callback, GINT_TO_POINTER(tiff_compression16_strings[i-1].number));
+ gtk_widget_show(tiff_compression_item);
+ if (tiff_compression16_strings[i-1].number == preferences.tiff_compression16_nr)
+ {
+@@ -2019,7 +2019,7 @@ static void xsane_filetype_notebook(GtkWidget *notebook)
+ {
+ tiff_compression_item = gtk_menu_item_new_with_label(tiff_compression8_strings[i-1].name);
+ gtk_container_add(GTK_CONTAINER(tiff_compression_menu), tiff_compression_item);
+- g_signal_connect(GTK_OBJECT(tiff_compression_item), "activate", (GtkSignalFunc) xsane_setup_tiff_compression8_callback, (void *) tiff_compression8_strings[i-1].number);
++ g_signal_connect(GTK_OBJECT(tiff_compression_item), "activate", (GtkSignalFunc) xsane_setup_tiff_compression8_callback, GINT_TO_POINTER(tiff_compression8_strings[i-1].number));
+ gtk_widget_show(tiff_compression_item);
+ if (tiff_compression8_strings[i-1].number == preferences.tiff_compression8_nr)
+ {
+@@ -2056,7 +2056,7 @@ static void xsane_filetype_notebook(GtkWidget *notebook)
+ {
+ tiff_compression_item = gtk_menu_item_new_with_label(tiff_compression1_strings[i-1].name);
+ gtk_container_add(GTK_CONTAINER(tiff_compression_menu), tiff_compression_item);
+- g_signal_connect(GTK_OBJECT(tiff_compression_item), "activate", (GtkSignalFunc) xsane_setup_tiff_compression1_callback, (void *) tiff_compression1_strings[i-1].number);
++ g_signal_connect(GTK_OBJECT(tiff_compression_item), "activate", (GtkSignalFunc) xsane_setup_tiff_compression1_callback, GINT_TO_POINTER(tiff_compression1_strings[i-1].number));
+ gtk_widget_show(tiff_compression_item);
+ if (tiff_compression1_strings[i-1].number == preferences.tiff_compression1_nr)
+ {
+@@ -2251,7 +2251,7 @@ static void xsane_fax_notebook(GtkWidget *notebook)
+ for (i=0; i < sizeof(fax_program)/sizeof(fax_program_options_type); i++)
+ {
+ button = gtk_button_new_with_label(fax_program[i].identifier);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_fax_notebook_set_faxprogram_default_callback, (void *) i);
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_fax_notebook_set_faxprogram_default_callback, GINT_TO_POINTER(i));
+ gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 10);
+ gtk_widget_show(button);
+ }
+@@ -2557,7 +2557,7 @@ static void xsane_email_notebook(GtkWidget *notebook)
+ {
+ authentication_menu_item = gtk_menu_item_new_with_label(authentication_strings[i-1].name);
+ gtk_container_add(GTK_CONTAINER(authentication_menu), authentication_menu_item);
+- g_signal_connect(GTK_OBJECT(authentication_menu_item), "activate", (GtkSignalFunc) xsane_setup_authentication_type_callback, (void *) authentication_strings[i-1].number);
++ g_signal_connect(GTK_OBJECT(authentication_menu_item), "activate", (GtkSignalFunc) xsane_setup_authentication_type_callback, GINT_TO_POINTER(authentication_strings[i-1].number));
+ gtk_widget_show(authentication_menu_item);
+ if (authentication_strings[i-1].number == preferences.email_authentication)
+ {
+@@ -2926,7 +2926,7 @@ static void xsane_display_notebook(GtkWidget *notebook)
+ {
+ show_range_mode_item = gtk_menu_item_new_with_label(show_range_mode_strings[i-1].name);
+ gtk_container_add(GTK_CONTAINER(show_range_mode_menu), show_range_mode_item);
+- g_signal_connect(GTK_OBJECT(show_range_mode_item), "activate", (GtkSignalFunc) xsane_setup_show_range_mode_callback, (void *) show_range_mode_strings[i-1].number);
++ g_signal_connect(GTK_OBJECT(show_range_mode_item), "activate", (GtkSignalFunc) xsane_setup_show_range_mode_callback, GINT_TO_POINTER(show_range_mode_strings[i-1].number));
+ gtk_widget_show(show_range_mode_item);
+ if (show_range_mode_strings[i-1].number == preferences.show_range_mode)
+ {
+@@ -3129,7 +3129,7 @@ static void xsane_enhance_notebook_sensitivity(int lineart_mode)
+
+ static void xsane_setup_authentication_type_callback(GtkWidget *widget, gpointer data)
+ {
+- xsane_setup.email_authentication = (int) data;
++ xsane_setup.email_authentication = GPOINTER_TO_INT(data);
+
+ gtk_widget_set_sensitive(xsane_setup.pop3_vbox, (xsane_setup.email_authentication == EMAIL_AUTH_POP3));
+ }
+@@ -3138,14 +3138,14 @@ static void xsane_setup_authentication_type_callback(GtkWidget *widget, gpointer
+
+ static void xsane_setup_show_range_mode_callback(GtkWidget *widget, gpointer data)
+ {
+- xsane_setup.show_range_mode = (int) data;
++ xsane_setup.show_range_mode = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+
+ static void xsane_setup_lineart_mode_callback(GtkWidget *widget, gpointer data)
+ {
+- xsane_setup.lineart_mode = (int) data;
++ xsane_setup.lineart_mode = GPOINTER_TO_INT(data);
+ xsane_enhance_notebook_sensitivity(xsane_setup.lineart_mode);
+ }
+
+@@ -3168,7 +3168,7 @@ static void xsane_setup_preview_pipette_range_callback(GtkWidget *widget, gpoint
+ {
+ DBG(DBG_proc, "xsane_setup_preview_pipette_range_callback\n");
+
+- xsane_setup.preview_pipette_range = (int) data;
++ xsane_setup.preview_pipette_range = GPOINTER_TO_INT(data);
+ }
+
+ /* ---------------------------------------------------------------------------------------------------------------------- */
+@@ -3237,7 +3237,7 @@ static void xsane_enhance_notebook(GtkWidget *notebook)
+ {
+ lineart_mode_item = gtk_menu_item_new_with_label(lineart_mode_strings[i-1].name);
+ gtk_container_add(GTK_CONTAINER(lineart_mode_menu), lineart_mode_item);
+- g_signal_connect(GTK_OBJECT(lineart_mode_item), "activate", (GtkSignalFunc) xsane_setup_lineart_mode_callback, (void *) lineart_mode_strings[i-1].number);
++ g_signal_connect(GTK_OBJECT(lineart_mode_item), "activate", (GtkSignalFunc) xsane_setup_lineart_mode_callback, GINT_TO_POINTER(lineart_mode_strings[i-1].number));
+ gtk_widget_show(lineart_mode_item);
+ if (lineart_mode_strings[i-1].number == xsane.lineart_mode)
+ {
+@@ -3461,7 +3461,7 @@ static void xsane_enhance_notebook(GtkWidget *notebook)
+ snprintf(buf, sizeof(buf), "%d x %d pixel", j, j);
+ preview_pipette_range_item = gtk_menu_item_new_with_label(buf);
+ gtk_container_add(GTK_CONTAINER(preview_pipette_range_menu), preview_pipette_range_item);
+- g_signal_connect(GTK_OBJECT(preview_pipette_range_item), "activate", (GtkSignalFunc) xsane_setup_preview_pipette_range_callback, (void *) j);
++ g_signal_connect(GTK_OBJECT(preview_pipette_range_item), "activate", (GtkSignalFunc) xsane_setup_preview_pipette_range_callback, GINT_TO_POINTER(j));
+ gtk_widget_show(preview_pipette_range_item);
+ if (preferences.preview_pipette_range == j)
+ {
+@@ -3555,22 +3555,22 @@ static void xsane_color_management_notebook(GtkWidget *notebook)
+ menu = gtk_menu_new();
+
+ menu_item = gtk_menu_item_new_with_label(SUBMENU_ITEM_CMS_INTENT_PERCEPTUAL);
+- gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", (void *) INTENT_PERCEPTUAL);
++ gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", GINT_TO_POINTER(INTENT_PERCEPTUAL));
+ gtk_container_add(GTK_CONTAINER(menu), menu_item);
+ gtk_widget_show(menu_item);
+
+ menu_item = gtk_menu_item_new_with_label(SUBMENU_ITEM_CMS_INTENT_RELATIVE_COLORIMETRIC);
+- gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", (void *) INTENT_RELATIVE_COLORIMETRIC);
++ gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", GINT_TO_POINTER(INTENT_RELATIVE_COLORIMETRIC));
+ gtk_container_add(GTK_CONTAINER(menu), menu_item);
+ gtk_widget_show(menu_item);
+
+ menu_item = gtk_menu_item_new_with_label(SUBMENU_ITEM_CMS_INTENT_ABSOLUTE_COLORIMETRIC);
+- gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", (void *) INTENT_ABSOLUTE_COLORIMETRIC);
++ gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", GINT_TO_POINTER(INTENT_ABSOLUTE_COLORIMETRIC));
+ gtk_container_add(GTK_CONTAINER(menu), menu_item);
+ gtk_widget_show(menu_item);
+
+ menu_item = gtk_menu_item_new_with_label(SUBMENU_ITEM_CMS_INTENT_SATURATION);
+- gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", (void *) INTENT_SATURATION);
++ gtk_object_set_data(GTK_OBJECT(menu_item), "Selection", GINT_TO_POINTER(INTENT_SATURATION));
+ gtk_container_add(GTK_CONTAINER(menu), menu_item);
+ gtk_widget_show(menu_item);
+
+diff --git a/src/xsane-text.h b/src/xsane-text.h
+index ee4a222..44659b9 100644
+--- a/src/xsane-text.h
++++ b/src/xsane-text.h
+@@ -803,6 +803,7 @@ YOU ARE ALONE!\
+ #define ERR_HEADER_CHILD_PROCESS_ERROR _("Child process error")
+
+ #define ERR_FAILED_CREATE_FILE _("Failed to create file:")
++#define ERR_FAILED_CREATE_ENSURE_DIR _("Failed to ensure path is a directory, or to create as one:")
+ #define ERR_LOAD_DEVICE_SETTINGS _("Error while loading device settings:")
+ #define ERR_NO_DRC_FILE _("is not a device-rc-file !!!")
+ #define ERR_NETSCAPE_EXECUTE_FAIL _("Failed to execute netscape!")
+diff --git a/src/xsane-viewer.c b/src/xsane-viewer.c
+index 844c077..6786e96 100644
+--- a/src/xsane-viewer.c
++++ b/src/xsane-viewer.c
+@@ -32,6 +32,8 @@
+ #include "xsane-save.h"
+ #include <gdk/gdkkeysyms.h>
+ #include <sys/wait.h>
++#include <string.h>
++#include <errno.h>
+
+ #ifndef PATH_MAX
+ # define PATH_MAX 1024
+@@ -506,8 +508,8 @@ static void xsane_viewer_scale_set_scale_value_and_adjustments(GtkAdjustment *ad
+
+ *scale_val = adj_data->value;
+
+- image_width = (int) gtk_object_get_data(GTK_OBJECT(adj_data), "image_width");
+- image_height = (int) gtk_object_get_data(GTK_OBJECT(adj_data), "image_height");
++ image_width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(adj_data), "image_width"));
++ image_height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(adj_data), "image_height"));
+
+ adj = (GtkAdjustment*) gtk_object_get_data(GTK_OBJECT(adj_data), "size-x-adjustment");
+ if ((adj) && (image_width))
+@@ -529,8 +531,8 @@ static void xsane_viewer_scale_set_size_x_value_and_adjustments(GtkAdjustment *a
+ GtkAdjustment *adj;
+ int image_width, image_height;
+
+- image_width = (int) gtk_object_get_data(GTK_OBJECT(adj_data), "image_width");
+- image_height = (int) gtk_object_get_data(GTK_OBJECT(adj_data), "image_height");
++ image_width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(adj_data), "image_width"));
++ image_height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(adj_data), "image_height"));
+
+ if (!image_width)
+ {
+@@ -553,8 +555,8 @@ static void xsane_viewer_scale_set_size_y_value_and_adjustments(GtkAdjustment *a
+ GtkAdjustment *adj;
+ int image_width, image_height;
+
+- image_width = (int) gtk_object_get_data(GTK_OBJECT(adj_data), "image_width");
+- image_height = (int) gtk_object_get_data(GTK_OBJECT(adj_data), "image_height");
++ image_width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(adj_data), "image_width"));
++ image_height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(adj_data), "image_height"));
+
+ if (!image_height)
+ {
+@@ -663,7 +665,7 @@ static void xsane_viewer_scale_callback(GtkWidget *window, gpointer data)
+ button = gtk_check_button_new_with_label(BUTTON_SCALE_BIND);
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), v->bind_scale);
+- g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_viewer_button_changed, (void *) &v->bind_scale);
++ g_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_viewer_button_changed, GINT_TO_POINTER(&v->bind_scale));
+ g_signal_connect_after(GTK_OBJECT(button), "toggled", (GtkSignalFunc) xsane_viewer_scale_callback, (void *) v);
+ gtk_widget_show(button);
+
+@@ -715,20 +717,20 @@ static void xsane_viewer_scale_callback(GtkWidget *window, gpointer data)
+ gtk_widget_show(spinbutton);
+ xsane_back_gtk_set_tooltip(xsane.tooltips, spinbutton, DESC_SCALE_HEIGHT);
+
+- gtk_object_set_data(GTK_OBJECT(scale_widget), "size-x-adjustment", (void *) adjustment_size_x);
+- gtk_object_set_data(GTK_OBJECT(scale_widget), "size-y-adjustment", (void *) adjustment_size_y);
+- gtk_object_set_data(GTK_OBJECT(scale_widget), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(scale_widget), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(scale_widget), "size-x-adjustment", GINT_TO_POINTER(adjustment_size_x));
++ gtk_object_set_data(GTK_OBJECT(scale_widget), "size-y-adjustment", GINT_TO_POINTER(adjustment_size_y));
++ gtk_object_set_data(GTK_OBJECT(scale_widget), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(scale_widget), "image_height", GINT_TO_POINTER(image_info.image_height));
+
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "scale-adjustment", (void *) scale_widget);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "size-y-adjustment", (void *) adjustment_size_y);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "scale-adjustment", GINT_TO_POINTER(scale_widget));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "size-y-adjustment", GINT_TO_POINTER(adjustment_size_y));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_height", GINT_TO_POINTER(image_info.image_height));
+
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "scale-adjustment", (void *) scale_widget);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "size-x-adjustment", (void *) adjustment_size_x);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "scale-adjustment", GINT_TO_POINTER(scale_widget));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "size-x-adjustment", GINT_TO_POINTER(adjustment_size_x));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_height", GINT_TO_POINTER(image_info.image_height));
+ }
+ else
+ {
+@@ -763,12 +765,12 @@ static void xsane_viewer_scale_callback(GtkWidget *window, gpointer data)
+ xsane_back_gtk_set_tooltip(xsane.tooltips, spinbutton, DESC_SCALE_WIDTH);
+
+ gtk_object_set_data(GTK_OBJECT(scalex_widget), "size-x-adjustment", (void *) adjustment_size_x);
+- gtk_object_set_data(GTK_OBJECT(scalex_widget), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(scalex_widget), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(scalex_widget), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(scalex_widget), "image_height", GINT_TO_POINTER(image_info.image_height));
+
+ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "scale-adjustment", (void *) scalex_widget);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_x), "image_height", GINT_TO_POINTER(image_info.image_height));
+
+
+ /* Y */
+@@ -802,12 +804,12 @@ static void xsane_viewer_scale_callback(GtkWidget *window, gpointer data)
+ xsane_back_gtk_set_tooltip(xsane.tooltips, spinbutton, DESC_SCALE_HEIGHT);
+
+ gtk_object_set_data(GTK_OBJECT(scaley_widget), "size-y-adjustment", (void *) adjustment_size_y);
+- gtk_object_set_data(GTK_OBJECT(scaley_widget), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(scaley_widget), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(scaley_widget), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(scaley_widget), "image_height", GINT_TO_POINTER(image_info.image_height));
+
+ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "scale-adjustment", (void *) scaley_widget);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_width", (void *) image_info.image_width);
+- gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_height", (void *) image_info.image_height);
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_width", GINT_TO_POINTER(image_info.image_width));
++ gtk_object_set_data(GTK_OBJECT(adjustment_size_y), "image_height", GINT_TO_POINTER(image_info.image_height));
+ }
+
+ /* Apply Cancel */
+@@ -1094,6 +1096,7 @@ static void xsane_viewer_scale_image(GtkWidget *window, gpointer data)
+ {
+ DBG(DBG_error, "could not save file %s\n", outfilename);
+ xsane_viewer_set_sensitivity(v, TRUE);
++ fclose(infile);
+ return;
+ }
+
+@@ -1176,6 +1179,7 @@ static void xsane_viewer_despeckle_image(GtkWidget *window, gpointer data)
+ {
+ DBG(DBG_error, "could not save file %s\n", outfilename);
+ xsane_viewer_set_sensitivity(v, TRUE);
++ fclose(infile);
+ return;
+ }
+
+@@ -1253,6 +1257,7 @@ static void xsane_viewer_blur_image(GtkWidget *window, gpointer data)
+ {
+ DBG(DBG_error, "could not save file %s\n", outfilename);
+ xsane_viewer_set_sensitivity(v, TRUE);
++ fclose(infile);
+ return;
+ }
+
+@@ -1335,6 +1340,7 @@ static void xsane_viewer_rotate(Viewer *v, int rotation)
+ {
+ DBG(DBG_error, "could not save file %s\n", outfilename);
+ xsane_viewer_set_sensitivity(v, TRUE);
++ fclose(infile);
+
+ return;
+ }
+@@ -1444,7 +1450,7 @@ static void xsane_viewer_zoom_callback(GtkWidget *widget, gpointer data)
+
+ DBG(DBG_proc, "xsane_viewer_zoom_callback\n");
+
+- val = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ val = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+ v->zoom = (float) val / 100;
+ DBG(DBG_info, "setting zoom factor to %f\n", v->zoom);
+ xsane_viewer_read_image(v);
+@@ -1721,7 +1727,7 @@ static void xsane_viewer_set_cms_proofing_callback(GtkWidget *widget, gpointer d
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_proofing_widget[1]), (GtkSignalFunc) xsane_viewer_set_cms_proofing_callback, v);
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_proofing_widget[2]), (GtkSignalFunc) xsane_viewer_set_cms_proofing_callback, v);
+
+- val = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ val = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ DBG(DBG_proc, "xsane_viewer_set_cms_proofing_callback (%d)\n", val);
+
+@@ -1748,7 +1754,7 @@ static void xsane_viewer_set_cms_intent_callback(GtkWidget *widget, gpointer dat
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_intent_widget[2]), (GtkSignalFunc) xsane_viewer_set_cms_intent_callback, v);
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_intent_widget[3]), (GtkSignalFunc) xsane_viewer_set_cms_intent_callback, v);
+
+- val = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ val = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ DBG(DBG_proc, "xsane_viewer_set_cms_intent_callback (%d)\n", val);
+
+@@ -1774,7 +1780,7 @@ static void xsane_viewer_set_cms_proofing_intent_callback(GtkWidget *widget, gpo
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_proofing_intent_widget[0]), (GtkSignalFunc) xsane_viewer_set_cms_proofing_intent_callback, v);
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_proofing_intent_widget[1]), (GtkSignalFunc) xsane_viewer_set_cms_proofing_intent_callback, v);
+
+- val = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ val = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ DBG(DBG_proc, "xsane_viewer_set_cms_proofing_intent_callback (%d)\n", val);
+
+@@ -1806,7 +1812,7 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[4]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[5]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+
+- val = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ val = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ DBG(DBG_proc, "xsane_viewer_set_cms_gamut_alarm_color_callback (%d)\n", val);
+
+@@ -1942,7 +1948,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_proofing_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 0);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(0));
+ gtk_widget_show(subitem);
+ v->cms_proofing_widget[0] = subitem;
+
+@@ -1953,7 +1959,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_proofing_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 1);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(1));
+ gtk_widget_show(subitem);
+ v->cms_proofing_widget[1] = subitem;
+
+@@ -1964,7 +1970,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_proofing_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 2);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(2));
+ gtk_widget_show(subitem);
+ v->cms_proofing_widget[2] = subitem;
+
+@@ -1985,7 +1991,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_intent_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) INTENT_PERCEPTUAL);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(INTENT_PERCEPTUAL));
+ gtk_widget_show(subitem);
+ v->cms_intent_widget[INTENT_PERCEPTUAL] = subitem;
+
+@@ -1996,7 +2002,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_intent_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) INTENT_RELATIVE_COLORIMETRIC);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(INTENT_RELATIVE_COLORIMETRIC));
+ gtk_widget_show(subitem);
+ v->cms_intent_widget[INTENT_RELATIVE_COLORIMETRIC] = subitem;
+
+@@ -2007,7 +2013,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_intent_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) INTENT_ABSOLUTE_COLORIMETRIC);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(INTENT_ABSOLUTE_COLORIMETRIC));
+ gtk_widget_show(subitem);
+ v->cms_intent_widget[INTENT_ABSOLUTE_COLORIMETRIC] = subitem;
+
+@@ -2018,7 +2024,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_intent_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) INTENT_SATURATION);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(INTENT_SATURATION));
+ gtk_widget_show(subitem);
+ v->cms_intent_widget[INTENT_SATURATION] = subitem;
+
+@@ -2039,7 +2045,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_proofing_intent_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) INTENT_RELATIVE_COLORIMETRIC);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(INTENT_RELATIVE_COLORIMETRIC));
+ gtk_widget_show(subitem);
+ v->cms_proofing_intent_widget[0] = subitem;
+
+@@ -2050,7 +2056,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_proofing_intent_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) INTENT_ABSOLUTE_COLORIMETRIC);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(INTENT_ABSOLUTE_COLORIMETRIC));
+ gtk_widget_show(subitem);
+ v->cms_proofing_intent_widget[1] = subitem;
+
+@@ -2078,7 +2084,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 0);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(0));
+ gtk_widget_show(subitem);
+ v->cms_gamut_alarm_color_widget[0] = subitem;
+
+@@ -2089,7 +2095,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 1);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(1));
+ gtk_widget_show(subitem);
+ v->cms_gamut_alarm_color_widget[1] = subitem;
+
+@@ -2100,7 +2106,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 2);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(2));
+ gtk_widget_show(subitem);
+ v->cms_gamut_alarm_color_widget[2] = subitem;
+
+@@ -2111,7 +2117,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 3);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(3));
+ gtk_widget_show(subitem);
+ v->cms_gamut_alarm_color_widget[3] = subitem;
+
+@@ -2122,7 +2128,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 4);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(4));
+ gtk_widget_show(subitem);
+ v->cms_gamut_alarm_color_widget[4] = subitem;
+
+@@ -2133,7 +2139,7 @@ static GtkWidget *xsane_viewer_color_management_build_menu(Viewer *v)
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+- gtk_object_set_data(GTK_OBJECT(subitem), "Selection", (void *) 5);
++ gtk_object_set_data(GTK_OBJECT(subitem), "Selection", GINT_TO_POINTER(5));
+ gtk_widget_show(subitem);
+ v->cms_gamut_alarm_color_widget[5] = subitem;
+
+@@ -2158,7 +2164,7 @@ static int xsane_viewer_read_image_header(Viewer *v)
+ if (!infile)
+ {
+ DBG(DBG_error, "could not load file %s\n", v->filename);
+- return -1;
++ return -1;
+ }
+
+ xsane_read_pnm_header(infile, &image_info);
+@@ -2200,7 +2206,7 @@ static int xsane_viewer_read_image_header(Viewer *v)
+
+ static int xsane_viewer_read_image(Viewer *v)
+ {
+- unsigned char *cms_row, *row, *src_row;
++ unsigned char *cms_row, *row = NULL, *src_row = NULL;
+ int x, y;
+ int last_y;
+ int nread;
+@@ -2211,6 +2217,7 @@ static int xsane_viewer_read_image(Viewer *v)
+ float size;
+ char *size_unit;
+ int width, height;
++ int retval = 0;
+
+ #ifdef HAVE_LIBLCMS
+ cmsHPROFILE hInProfile = NULL;
+@@ -2311,7 +2318,8 @@ static int xsane_viewer_read_image(Viewer *v)
+
+ snprintf(buf, sizeof(buf), "%s\n%s %s: %s\n", ERR_CMS_CONVERSION, ERR_CMS_OPEN_ICM_FILE, CMS_SCANNER_ICM, image_info.icm_profile);
+ xsane_back_gtk_error(buf, TRUE);
+- return -1;
++ retval = -1;
++ goto out;
+ }
+
+ hOutProfile = cmsOpenProfileFromFile(preferences.display_icm_profile, "r");
+@@ -2323,7 +2331,8 @@ static int xsane_viewer_read_image(Viewer *v)
+
+ snprintf(buf, sizeof(buf), "%s\n%s %s: %s\n", ERR_CMS_CONVERSION, ERR_CMS_OPEN_ICM_FILE, CMS_DISPLAY_ICM, preferences.display_icm_profile);
+ xsane_back_gtk_error(buf, TRUE);
+- return -1;
++ retval = -1;
++ goto out;
+ }
+
+
+@@ -2352,7 +2361,8 @@ static int xsane_viewer_read_image(Viewer *v)
+
+ snprintf(buf, sizeof(buf), "%s\n%s %s: %s\n", ERR_CMS_CONVERSION, ERR_CMS_OPEN_ICM_FILE, CMS_PROOF_ICM, cms_proof_icm_profile);
+ xsane_back_gtk_error(buf, TRUE);
+- return -1;
++ retval = -1;
++ goto out;
+ }
+
+ hTransform = cmsCreateProofingTransform(hInProfile, cms_input_format,
+@@ -2374,7 +2384,8 @@ static int xsane_viewer_read_image(Viewer *v)
+
+ snprintf(buf, sizeof(buf), "%s\n%s\n", ERR_CMS_CONVERSION, ERR_CMS_CREATE_TRANSFORM);
+ xsane_back_gtk_error(buf, TRUE);
+- return -1;
++ retval = -1;
++ goto out;
+ }
+ }
+ #endif
+@@ -2414,39 +2425,11 @@ static int xsane_viewer_read_image(Viewer *v)
+ row = malloc(((int) image_info.image_width * v->zoom) * image_info.channels);
+ }
+
+-#ifdef HAVE_LIBLCMS
+- if ((v->enable_color_management) && (v->cms_enable))
+- {
+- cms_row = malloc(((int) image_info.image_width * v->zoom) * image_info.channels);
+- }
+- else
+-#endif
++ if (!row || !src_row)
+ {
+- cms_row = row;
+- }
+-
+- if (!row || !src_row || !cms_row)
+- {
+- if (src_row)
+- {
+- free(src_row);
+- }
+-
+- if (row)
+- {
+- free(row);
+- }
+-
+-#ifdef HAVE_LIBLCMS
+- if ((cms_row) && (v->enable_color_management) && (v->cms_enable))
+- {
+- free(cms_row);
+- }
+-#endif
+-
+- fclose(infile);
+- DBG(DBG_error, "could not allocate memory\n");
+- return -1;
++ DBG(DBG_error, "could not allocate memory\n");
++ retval = -1;
++ goto out;
+ }
+
+
+@@ -2514,7 +2497,13 @@ static int xsane_viewer_read_image(Viewer *v)
+ guint16 *src_row16 = (guint16 *) src_row;
+ guint16 *dst_row16 = (guint16 *) row;
+
+- fseek(infile, pos0 + (((int) (y / v->zoom)) * image_info.image_width) * image_info.channels * 2, SEEK_SET);
++ if (fseek(infile, pos0 + (((int) (y / v->zoom)) * image_info.image_width) * image_info.channels * 2, SEEK_SET))
++ {
++ DBG(DBG_error, "could not seek in file '%s': '%s'\n", v->filename,
++ strerror(errno));
++ retval = -1;
++ goto out;
++ }
+ nread = fread(src_row, 2 * image_info.channels, image_info.image_width, infile);
+
+ if (image_info.channels > 1)
+@@ -2541,10 +2530,22 @@ static int xsane_viewer_read_image(Viewer *v)
+ #ifdef HAVE_LIBLCMS
+ if ((v->enable_color_management) && (v->cms_enable))
+ {
++ cms_row = malloc(((int) image_info.image_width * v->zoom) * image_info.channels);
++ if (! cms_row)
++ {
++ DBG(DBG_error, "could not allocate memory\n");
++ retval = -1;
++ goto out;
++ }
+ cmsDoTransform(hTransform, row, cms_row, image_info.image_width * v->zoom);
++ gtk_preview_draw_row(GTK_PREVIEW(v->window), cms_row, 0, y, image_info.image_width * v->zoom);
++ free(cms_row);
+ }
++ else
+ #endif
+- gtk_preview_draw_row(GTK_PREVIEW(v->window), cms_row, 0, y, image_info.image_width * v->zoom);
++ {
++ gtk_preview_draw_row(GTK_PREVIEW(v->window), row, 0, y, image_info.image_width * v->zoom);
++ }
+ }
+
+ gtk_preview_put(GTK_PREVIEW(v->window), v->window->window, v->window->style->black_gc, 0, 0, 0, 0,
+@@ -2610,9 +2611,23 @@ static int xsane_viewer_read_image(Viewer *v)
+ gtk_window_set_default_size(GTK_WINDOW(v->top), width, height);
+ }
+
+- free(row);
+- free(src_row);
+- fclose(infile);
++out:
++ if (row)
++ {
++ free(row);
++ }
++
++ if (src_row)
++ {
++ free(src_row);
++ }
++
++ /* cms_row is freed directly after use */
++
++ if (infile)
++ {
++ fclose(infile);
++ }
+
+ #ifdef HAVE_LIBLCMS
+ if ((v->enable_color_management) && (v->cms_enable))
+@@ -2621,7 +2636,7 @@ static int xsane_viewer_read_image(Viewer *v)
+ }
+ #endif
+
+- return 0;
++ return retval;
+ }
+
+ #if 0 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+@@ -3066,7 +3081,7 @@ Viewer *xsane_viewer_new(char *filename, char *selection_filetype, int allow_red
+ zoom_menu_item = gtk_menu_item_new_with_label(buf);
+ gtk_menu_append(GTK_MENU(zoom_menu), zoom_menu_item);
+ g_signal_connect(GTK_OBJECT(zoom_menu_item), "activate", (GtkSignalFunc) xsane_viewer_zoom_callback, v);
+- gtk_object_set_data(GTK_OBJECT(zoom_menu_item), "Selection", (void *) xsane_viewer_zoom[i]);
++ gtk_object_set_data(GTK_OBJECT(zoom_menu_item), "Selection", GINT_TO_POINTER(xsane_viewer_zoom[i]));
+ gtk_widget_show(zoom_menu_item);
+ if (v->zoom*100 == xsane_viewer_zoom[i])
+ {
+diff --git a/src/xsane.c b/src/xsane.c
+index 02b4da4..a4a3f1e 100644
+--- a/src/xsane.c
++++ b/src/xsane.c
+@@ -585,7 +585,7 @@ static void xsane_show_batch_scan_callback(GtkWidget * widget)
+
+ static void xsane_paper_orientation_callback(GtkWidget *widget, gpointer data)
+ {
+- int pos = (int) data;
++ int pos = GPOINTER_TO_INT(data);
+
+ DBG(DBG_proc, "xsane_paper_orientation_callback\n");
+
+@@ -601,7 +601,7 @@ static void xsane_printer_callback(GtkWidget *widget, gpointer data)
+
+ DBG(DBG_proc, "xsane_printer_callback\n");
+
+- preferences.printernr = (int) data;
++ preferences.printernr = GPOINTER_TO_INT(data);
+
+ switch (xsane.param.format)
+ {
+@@ -1165,7 +1165,7 @@ static void xsane_scanmode_menu_callback(GtkWidget *widget, gpointer data)
+
+ static void xsane_cms_function_menu_callback(GtkWidget *widget, gpointer data)
+ {
+- preferences.cms_function = (int) data;
++ preferences.cms_function = GPOINTER_TO_INT(data);
+ DBG(DBG_proc, "xsane_cms_function_menu_callback(%d)\n", preferences.cms_function);
+ }
+
+@@ -1402,7 +1402,7 @@ GtkWidget *xsane_update_xsane_callback() /* creates the XSane option window */
+
+
+ gtk_container_add(GTK_CONTAINER(paper_orientation_menu), paper_orientation_item);
+- g_signal_connect(GTK_OBJECT(paper_orientation_item), "activate", (GtkSignalFunc) xsane_paper_orientation_callback, (void *) i);
++ g_signal_connect(GTK_OBJECT(paper_orientation_item), "activate", (GtkSignalFunc) xsane_paper_orientation_callback, GINT_TO_POINTER(i));
+
+ gtk_widget_show(paper_orientation_item);
+ }
+@@ -1436,7 +1436,7 @@ GtkWidget *xsane_update_xsane_callback() /* creates the XSane option window */
+ GDK_F1+i, GDK_SHIFT_MASK, DEF_GTK_MENU_ACCEL_VISIBLE | DEF_GTK_ACCEL_LOCKED);
+ }
+ gtk_container_add(GTK_CONTAINER(xsane_printer_menu), xsane_printer_item);
+- g_signal_connect(GTK_OBJECT(xsane_printer_item), "activate", (GtkSignalFunc) xsane_printer_callback, (void *) i);
++ g_signal_connect(GTK_OBJECT(xsane_printer_item), "activate", (GtkSignalFunc) xsane_printer_callback, GINT_TO_POINTER(i));
+ gtk_widget_show(xsane_printer_item);
+ }
+
+@@ -1584,9 +1584,9 @@ GtkWidget *xsane_update_xsane_callback() /* creates the XSane option window */
+ {
+ xsane_medium_item = gtk_menu_item_new_with_label(preferences.medium[i]->name);
+ gtk_menu_append(GTK_MENU(xsane_medium_menu), xsane_medium_item);
+- g_signal_connect(GTK_OBJECT(xsane_medium_item), "button_press_event", (GtkSignalFunc) xsane_medium_context_menu_callback, (void *) i);
+- g_signal_connect(GTK_OBJECT(xsane_medium_item), "activate", (GtkSignalFunc) xsane_set_medium_callback, (void *) i);
+- gtk_object_set_data(GTK_OBJECT(xsane_medium_item), "Selection", (void *) i);
++ g_signal_connect(GTK_OBJECT(xsane_medium_item), "button_press_event", (GtkSignalFunc) xsane_medium_context_menu_callback, GINT_TO_POINTER(i));
++ g_signal_connect(GTK_OBJECT(xsane_medium_item), "activate", (GtkSignalFunc) xsane_set_medium_callback, GINT_TO_POINTER(i));
++ gtk_object_set_data(GTK_OBJECT(xsane_medium_item), "Selection", GINT_TO_POINTER(i));
+
+ gtk_widget_show(xsane_medium_item);
+ }
+@@ -2697,7 +2697,7 @@ static gint xsane_medium_move_up_callback(GtkWidget *widget, GtkWidget *medium_w
+
+ DBG(DBG_proc, "xsane_medium_move_up_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection"));
+
+ if (selection > 1) /* make sure "full range" stays at top */
+ {
+@@ -2732,7 +2732,7 @@ static gint xsane_medium_move_down_callback(GtkWidget *widget, GtkWidget *medium
+
+ DBG(DBG_proc, "xsane_medium_move_up_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection"));
+
+ if ((selection) && (selection < preferences.medium_definitions-1))
+ {
+@@ -2771,7 +2771,7 @@ static gint xsane_medium_rename_callback(GtkWidget *widget, GtkWidget *medium_wi
+
+ DBG(DBG_proc, "xsane_medium_rename_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection"));
+
+ oldname = strdup(preferences.medium[selection]->name);
+
+@@ -2779,7 +2779,7 @@ static gint xsane_medium_rename_callback(GtkWidget *widget, GtkWidget *medium_wi
+
+ /* set menu in correct state, is a bit strange this way but I do not have a better idea */
+ old_medium_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(xsane.medium_widget));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_medium_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_medium_menu))), "Selection"));
+ gtk_menu_popdown(GTK_MENU(old_medium_menu));
+ gtk_option_menu_set_history(GTK_OPTION_MENU(xsane.medium_widget), old_selection);
+
+@@ -2814,13 +2814,13 @@ static gint xsane_medium_add_callback(GtkWidget *widget, GtkWidget *medium_widge
+ DBG(DBG_proc, "xsane_medium_add_callback\n");
+
+ /* add new item after selected item */
+- selection = 1 + (int) gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection");
++ selection = 1 + GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection"));
+
+ oldname = strdup(TEXT_NEW_MEDIA_NAME);
+
+ /* set menu in correct state, is a bit strange this way but I do not have a better idea */
+ old_medium_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(xsane.medium_widget));
+- old_selection = (int) gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_medium_menu))), "Selection");
++ old_selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(gtk_menu_get_active(GTK_MENU(old_medium_menu))), "Selection"));
+ gtk_menu_popdown(GTK_MENU(old_medium_menu));
+ gtk_option_menu_set_history(GTK_OPTION_MENU(xsane.medium_widget), old_selection);
+
+@@ -2895,7 +2895,7 @@ static gint xsane_medium_delete_callback(GtkWidget *widget, GtkWidget *medium_wi
+
+ DBG(DBG_proc, "xsane_medium_delete_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(medium_widget), "Selection"));
+
+ if (selection) /* full range can not be deleted */
+ {
+@@ -2951,7 +2951,7 @@ static gint xsane_medium_context_menu_callback(GtkWidget *widget, GdkEvent *even
+
+ DBG(DBG_proc, "xsane_medium_context_menu_callback\n");
+
+- selection = (int) gtk_object_get_data(GTK_OBJECT(widget), "Selection");
++ selection = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), "Selection"));
+
+ if (event->type == GDK_BUTTON_PRESS)
+ {
+@@ -3022,7 +3022,7 @@ static gint xsane_medium_context_menu_callback(GtkWidget *widget, GdkEvent *even
+
+ static void xsane_set_medium_callback(GtkWidget *widget, gpointer data)
+ {
+- int medium_nr = (int) data;
++ int medium_nr = GPOINTER_TO_INT(data);
+
+ if (medium_nr != preferences.medium_nr)
+ {
+@@ -3205,11 +3205,11 @@ static void xsane_set_update_policy_callback(GtkWidget *widget, gpointer data)
+ DBG(DBG_proc, "xsane_set_update_policy_callback\n");
+
+ g_signal_handlers_block_by_func(GTK_OBJECT(xsane.update_policy_continu), (GtkSignalFunc) xsane_set_update_policy_callback,
+- (void *) GTK_UPDATE_CONTINUOUS);
++ GINT_TO_POINTER(GTK_UPDATE_CONTINUOUS));
+ g_signal_handlers_block_by_func(GTK_OBJECT(xsane.update_policy_discont), (GtkSignalFunc) xsane_set_update_policy_callback,
+- (void *) GTK_UPDATE_DISCONTINUOUS);
++ GINT_TO_POINTER(GTK_UPDATE_DISCONTINUOUS));
+ g_signal_handlers_block_by_func(GTK_OBJECT(xsane.update_policy_delayed), (GtkSignalFunc) xsane_set_update_policy_callback,
+- (void *) GTK_UPDATE_DELAYED);
++ GINT_TO_POINTER(GTK_UPDATE_DELAYED));
+
+ if (policy == GTK_UPDATE_CONTINUOUS)
+ {
+@@ -3231,11 +3231,11 @@ static void xsane_set_update_policy_callback(GtkWidget *widget, gpointer data)
+ }
+
+ g_signal_handlers_unblock_by_func(GTK_OBJECT(xsane.update_policy_continu), (GtkSignalFunc) xsane_set_update_policy_callback,
+- (void *) GTK_UPDATE_CONTINUOUS);
++ GINT_TO_POINTER(GTK_UPDATE_CONTINUOUS));
+ g_signal_handlers_unblock_by_func(GTK_OBJECT(xsane.update_policy_discont), (GtkSignalFunc) xsane_set_update_policy_callback,
+- (void *) GTK_UPDATE_DISCONTINUOUS);
++ GINT_TO_POINTER(GTK_UPDATE_DISCONTINUOUS));
+ g_signal_handlers_unblock_by_func(GTK_OBJECT(xsane.update_policy_delayed), (GtkSignalFunc) xsane_set_update_policy_callback,
+- (void *) GTK_UPDATE_DELAYED);
++ GINT_TO_POINTER(GTK_UPDATE_DELAYED));
+
+ preferences.gtk_update_policy = policy;
+ xsane_pref_save();
+@@ -3389,7 +3389,7 @@ static void xsane_info_dialog(GtkWidget *widget, gpointer data)
+ snprintf(buf, sizeof(buf), "%d bit", (int) (0.5 + log(opt->constraint.range->max+1.0) / log(2.0)));
+ label = xsane_info_table_text_new(table, buf, 1, 2);
+ }
+- else if ((!xsane.xsane_channels > 1) && (xsane.scanner_gamma_gray)) /* gray gamma correction by scanner */
++ else if ((!(xsane.xsane_channels > 1)) && (xsane.scanner_gamma_gray)) /* gray gamma correction by scanner */
+ {
+ const SANE_Option_Descriptor *opt;
+
+@@ -3807,6 +3807,13 @@ static void xsane_close_fds_for_exec(signed int first_fd_to_leave_open, ...)
+
+ open_max = (int) sysconf (_SC_OPEN_MAX);
+
++ if (open_max < 0)
++ {
++ DBG(DBG_error, "xsane_close_fds_for_exec(): Can't determine maximum "
++ "number of open files.");
++ return;
++ }
++
+ close_fds = malloc (open_max);
+
+ memset (close_fds, 1, open_max);
+@@ -4147,7 +4154,7 @@ static GtkWidget *xsane_view_build_menu(void)
+ {
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+- g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_set_update_policy_callback, (void *) GTK_UPDATE_CONTINUOUS);
++ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_set_update_policy_callback, GINT_TO_POINTER(GTK_UPDATE_CONTINUOUS));
+ gtk_widget_show(subitem);
+ xsane.update_policy_continu = subitem;
+
+@@ -4157,7 +4164,7 @@ static GtkWidget *xsane_view_build_menu(void)
+ {
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+- g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_set_update_policy_callback, (void *) GTK_UPDATE_DISCONTINUOUS);
++ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_set_update_policy_callback, GINT_TO_POINTER(GTK_UPDATE_DISCONTINUOUS));
+ gtk_widget_show(subitem);
+ xsane.update_policy_discont = subitem;
+
+@@ -4167,7 +4174,7 @@ static GtkWidget *xsane_view_build_menu(void)
+ {
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem), TRUE);
+ }
+- g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_set_update_policy_callback, (void *) GTK_UPDATE_DELAYED);
++ g_signal_connect(GTK_OBJECT(subitem), "toggled", (GtkSignalFunc) xsane_set_update_policy_callback, GINT_TO_POINTER(GTK_UPDATE_DELAYED));
+ gtk_widget_show(subitem);
+ xsane.update_policy_delayed = subitem;
+
+@@ -5709,8 +5716,8 @@ static void xsane_choose_device(void)
+ gtk_widget_add_accelerator(button, "clicked", device_selection_accelerator_group, GDK_F1+i, 0, DEF_GTK_ACCEL_LOCKED);
+ }
+
+- g_signal_connect(GTK_OBJECT(button), "button_press_event", (GtkSignalFunc) xsane_select_device_by_mouse_callback, (void *) (long) i);
+- g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_select_device_by_key_callback, (void *) (long) i);
++ g_signal_connect(GTK_OBJECT(button), "button_press_event", (GtkSignalFunc) xsane_select_device_by_mouse_callback, GINT_TO_POINTER(i));
++ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_select_device_by_key_callback, GINT_TO_POINTER(i));
+ gtk_box_pack_start(GTK_BOX(device_vbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+ owner = gtk_radio_button_group(GTK_RADIO_BUTTON(button));;
+--
+1.9.0
+
diff --git a/xsane-0.999-lcms2.patch b/xsane-0.999-lcms2.patch
new file mode 100644
index 0000000..c3d696c
--- /dev/null
+++ b/xsane-0.999-lcms2.patch
@@ -0,0 +1,372 @@
+From 30af0e2edbf061b71bed9536d826894449f0390d Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Mon, 23 Sep 2013 16:11:31 +0200
+Subject: [PATCH] patch: lcms2
+
+Squashed commit of the following:
+
+commit f975accf7e1a08438b63580ea848457d373200f5
+Author: Nils Philippsen <nils at redhat.com>
+Date: Mon Sep 23 14:53:45 2013 +0200
+
+ Add support for lcms 2.x.
+---
+ configure.in | 22 ++++++++++++++----
+ include/config.h.in | 8 ++++++-
+ src/xsane-preview.c | 6 +++--
+ src/xsane-save.c | 38 ++++++++++++++++++++++++++-----
+ src/xsane-viewer.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++---
+ src/xsane.h | 8 ++++++-
+ 6 files changed, 130 insertions(+), 17 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index df7b114..3659c97 100644
+--- a/configure.in
++++ b/configure.in
+@@ -130,7 +130,17 @@ if test "${USE_TIFF}" = "yes"; then
+ fi
+
+ if test "${USE_LCMS}" = "yes"; then
+- AC_CHECK_LIB(lcms, cmsOpenProfileFromFile)
++ AC_SEARCH_LIBS(cmsOpenProfileFromFile, [lcms2 lcms])
++ if test "${ac_cv_search_cmsOpenProfileFromFile}" != "no"; then
++ AC_DEFINE(HAVE_LIBLCMS, 1, [Define if LCMS is to be used.])
++ fi
++ if test "${ac_cv_search_cmsOpenProfileFromFile}" == "-llcms2"; then
++ AC_DEFINE(HAVE_LIBLCMS2, 1, [Define if you have liblcms2.])
++ else
++ if test "${ac_cv_search_cmsOpenProfileFromFile}" == "-llcms"; then
++ AC_DEFINE(HAVE_LIBLCMS1, 1, [Define if you have liblcms.])
++ fi
++ fi
+ fi
+
+ dnl Checks for library functions.
+@@ -294,10 +304,14 @@ else
+ echo "* - PNG support deactivated *"
+ fi
+
+-if test "${ac_cv_lib_lcms_cmsOpenProfileFromFile}" = "yes"; then
+- echo "* - LCMS (color management) support activated *"
++if test "${ac_cv_search_cmsOpenProfileFromFile}" = "-llcms2"; then
++ echo "* - LCMS (color management) support activated (lcms2) *"
+ else
+- echo "* - LCMS (color management) support deactivated *"
++ if test "${ac_cv_search_cmsOpenProfileFromFile}" = "-llcms"; then
++ echo "* - LCMS (color management) support activated (lcms) *"
++ else
++ echo "* - LCMS (color management) support deactivated *"
++ fi
+ fi
+
+ echo "* *"
+diff --git a/include/config.h.in b/include/config.h.in
+index ecc9637..f9a3e40 100755
+--- a/include/config.h.in
++++ b/include/config.h.in
+@@ -290,9 +290,15 @@
+ /* Define if you have libtiff. */
+ #undef HAVE_LIBTIFF
+
+-/* Define if you have liblcms. */
++/* Define if LCMS is to be used. */
+ #undef HAVE_LIBLCMS
+
++/* Define if you have liblcms. */
++#undef HAVE_LIBLCMS1
++
++/* Define if you have liblcms2. */
++#undef HAVE_LIBLCMS2
++
+ #ifndef HAVE_STRNCASECMP
+ /* OS/2 needs this */
+ # define strncasecmp(a, b, c) strnicmp(a, b, c)
+diff --git a/src/xsane-preview.c b/src/xsane-preview.c
+index 6327ca7..6eaf687 100644
+--- a/src/xsane-preview.c
++++ b/src/xsane-preview.c
+@@ -6346,8 +6346,8 @@ int preview_do_color_correction(Preview *p)
+ cmsHPROFILE hOutProfile = NULL;
+ cmsHPROFILE hProofProfile = NULL;
+ cmsHTRANSFORM hTransform = NULL;
+- DWORD input_format, output_format;
+- DWORD cms_flags = 0;
++ cmsUInt32Number input_format, output_format;
++ cmsUInt32Number cms_flags = 0;
+ int proof = 0;
+ char *cms_proof_icm_profile = NULL;
+ int linesize = 0;
+@@ -6355,7 +6355,9 @@ int preview_do_color_correction(Preview *p)
+
+ DBG(DBG_proc, "preview_do_color_correction\n");
+
++#ifdef HAVE_LIBLCMS1
+ cmsErrorAction(LCMS_ERROR_SHOW);
++#endif
+
+ if (preferences.cms_bpc)
+ {
+diff --git a/src/xsane-save.c b/src/xsane-save.c
+index 75e0a63..2d0e44b 100644
+--- a/src/xsane-save.c
++++ b/src/xsane-save.c
+@@ -832,9 +832,9 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio
+ cmsHPROFILE hInProfile = NULL;
+ cmsHPROFILE hOutProfile = NULL;
+ cmsHTRANSFORM hTransform = NULL;
+- DWORD cms_input_format;
+- DWORD cms_output_format;
+- DWORD cms_flags = 0;
++ cmsUInt32Number cms_input_format;
++ cmsUInt32Number cms_output_format;
++ cmsUInt32Number cms_flags = 0;
+
+ if (cms_function == XSANE_CMS_FUNCTION_EMBED_SCANNER_ICM_PROFILE)
+ {
+@@ -843,7 +843,9 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio
+
+ DBG(DBG_info, "Prepare CMS transform\n");
+
++#ifdef HAVE_LIBLCMS1
+ cmsErrorAction(LCMS_ERROR_SHOW);
++#endif
+
+ if (cms_bpc)
+ {
+@@ -890,10 +892,18 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio
+ if (image_info->channels == 1) /* == 1 (grayscale) */
+ {
+ #if 1 /* xxx oli */
++# ifdef HAVE_LIBLCMS2
++ cmsToneCurve *Gamma = cmsBuildGamma(NULL, 2.2);
++# else
+ LPGAMMATABLE Gamma = cmsBuildGamma(256, 2.2);
++# endif
+
+ hOutProfile = cmsCreateGrayProfile(cmsD50_xyY(), Gamma);
++# ifdef HAVE_LIBLCMS2
++ cmsFreeToneCurve(Gamma);
++# else
+ cmsFreeGamma(Gamma);
++# endif
+ #endif
+ }
+ else
+@@ -2896,7 +2906,11 @@ static int xsane_write_CSA(FILE *outfile, char *input_profile, int intent)
+ return -1;
+ }
+
++#ifdef HAVE_LIBLCMS2
++ n = cmsGetPostScriptCSA(NULL, hProfile, intent, 0, NULL, 0);
++#else
+ n = cmsGetPostScriptCSA(hProfile, intent, NULL, 0);
++#endif
+ if (n == 0)
+ {
+ return -2;
+@@ -2908,7 +2922,11 @@ static int xsane_write_CSA(FILE *outfile, char *input_profile, int intent)
+ return -3;
+ }
+
++#ifdef HAVE_LIBLCMS2
++ cmsGetPostScriptCSA(NULL, hProfile, intent, 0, buffer, n);
++#else
+ cmsGetPostScriptCSA(hProfile, intent, buffer, n);
++#endif
+ buffer[n] = 0;
+
+ fprintf(outfile, "%s", buffer);
+@@ -2927,7 +2945,7 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int
+ cmsHPROFILE hProfile;
+ size_t n;
+ char* buffer;
+- DWORD flags = cmsFLAGS_NODEFAULTRESOURCEDEF;
++ cmsUInt32Number flags = cmsFLAGS_NODEFAULTRESOURCEDEF;
+
+ hProfile = cmsOpenProfileFromFile(output_profile, "r");
+ if (!hProfile)
+@@ -2940,7 +2958,11 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int
+ flags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
+ }
+
++#ifdef HAVE_LIBLCMS2
++ n = cmsGetPostScriptCRD(NULL, hProfile, intent, flags, NULL, 0);
++#else
+ n = cmsGetPostScriptCRDEx(hProfile, intent, flags, NULL, 0);
++#endif
+ if (n == 0)
+ {
+ return -2;
+@@ -2952,7 +2974,11 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int
+ return -3;
+ }
+
++#ifdef HAVE_LIBLCMS2
++ cmsGetPostScriptCRD(NULL, hProfile, intent, flags, buffer, n);
++#else
+ cmsGetPostScriptCRDEx(hProfile, intent, flags, buffer, n);
++#endif
+ buffer[n] = 0;
+
+ fprintf(outfile, "%s", buffer);
+@@ -4349,7 +4375,7 @@ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const
+ {
+ FILE *icm_profile;
+ size_t size, embed_len;
+- LPBYTE embed_buffer;
++ cmsUInt8Number *embed_buffer;
+
+ DBG(DBG_proc, "xsane_jpeg_embed_scanner_icm_profile(%s)\n", icm_filename);
+
+@@ -4363,7 +4389,7 @@ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const
+ size = ftell(icm_profile);
+ fseek(icm_profile, 0, SEEK_SET);
+
+- embed_buffer = (LPBYTE) malloc(size + 1);
++ embed_buffer = (cmsUInt8Number *) malloc(size + 1);
+ if (embed_buffer)
+ {
+ embed_len = fread(embed_buffer, 1, size, icm_profile);
+diff --git a/src/xsane-viewer.c b/src/xsane-viewer.c
+index 69a444d..844c077 100644
+--- a/src/xsane-viewer.c
++++ b/src/xsane-viewer.c
+@@ -1795,6 +1795,9 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g
+ {
+ Viewer *v = (Viewer *) data;
+ int val;
++#ifdef HAVE_LIBLCMS2
++ cmsUInt16Number alarm_codes[cmsMAXCHANNELS];
++#endif
+
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[0]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+ g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[1]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+@@ -1811,6 +1814,49 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g
+ v->cms_gamut_alarm_color = val;
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(v->cms_gamut_alarm_color_widget[v->cms_gamut_alarm_color]), TRUE);
+
++#ifdef HAVE_LIBLCMS2
++ switch(v->cms_gamut_alarm_color)
++ {
++ default:
++ case 0: /* black */
++ alarm_codes[0] = (cmsUInt16Number) 0;
++ alarm_codes[1] = (cmsUInt16Number) 0;
++ alarm_codes[2] = (cmsUInt16Number) 0;
++ break;
++
++ case 1: /* gray */
++ alarm_codes[0] = (cmsUInt16Number) 128;
++ alarm_codes[1] = (cmsUInt16Number) 128;
++ alarm_codes[2] = (cmsUInt16Number) 128;
++ break;
++
++ case 2: /* white */
++ alarm_codes[0] = (cmsUInt16Number) 255;
++ alarm_codes[1] = (cmsUInt16Number) 255;
++ alarm_codes[2] = (cmsUInt16Number) 255;
++ break;
++
++ case 3: /* red */
++ alarm_codes[0] = (cmsUInt16Number) 255;
++ alarm_codes[1] = (cmsUInt16Number) 0;
++ alarm_codes[2] = (cmsUInt16Number) 0;
++ break;
++
++ case 4: /* green */
++ alarm_codes[0] = (cmsUInt16Number) 0;
++ alarm_codes[1] = (cmsUInt16Number) 255;
++ alarm_codes[2] = (cmsUInt16Number) 0;
++ break;
++
++ case 5: /* blue */
++ alarm_codes[0] = (cmsUInt16Number) 0;
++ alarm_codes[1] = (cmsUInt16Number) 0;
++ alarm_codes[2] = (cmsUInt16Number) 255;
++ break;
++ }
++
++ cmsSetAlarmCodes(alarm_codes);
++#else
+ switch(v->cms_gamut_alarm_color)
+ {
+ default:
+@@ -1838,6 +1884,7 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g
+ cmsSetAlarmCodes(0, 0, 255);
+ break;
+ }
++#endif
+
+ g_signal_handlers_unblock_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[0]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+ g_signal_handlers_unblock_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[1]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v);
+@@ -2172,9 +2219,9 @@ static int xsane_viewer_read_image(Viewer *v)
+ cmsHTRANSFORM hTransform = NULL;
+ int proof = 0;
+ char *cms_proof_icm_profile = NULL;
+- DWORD cms_input_format;
+- DWORD cms_output_format;
+- DWORD cms_flags = 0;
++ cmsUInt32Number cms_input_format;
++ cmsUInt32Number cms_output_format;
++ cmsUInt32Number cms_flags = 0;
+ #endif
+
+ /* open imagefile */
+@@ -2203,7 +2250,9 @@ static int xsane_viewer_read_image(Viewer *v)
+
+ if ((v->enable_color_management) && (v->cms_enable))
+ {
++#ifdef HAVE_LIBLCMS1
+ cmsErrorAction(LCMS_ERROR_SHOW);
++#endif
+
+ if (v->cms_bpc)
+ {
+@@ -2801,6 +2850,9 @@ Viewer *xsane_viewer_new(char *filename, char *selection_filetype, int allow_red
+ GtkWidget *scrolled_window;
+ GtkWidget *zoom_option_menu, *zoom_menu, *zoom_menu_item;
+ int i, selection;
++#ifdef HAVE_LIBLCMS2
++ cmsUInt16Number alarm_codes[cmsMAXCHANNELS];
++#endif
+
+ DBG(DBG_proc, "viewer_new(%s)\n", filename);
+
+@@ -2830,8 +2882,15 @@ Viewer *xsane_viewer_new(char *filename, char *selection_filetype, int allow_red
+ v->cms_proofing_intent = INTENT_ABSOLUTE_COLORIMETRIC;
+ v->cms_gamut_check = 0;
+ v->cms_gamut_alarm_color = 3; /* red */
++#ifdef HAVE_LIBLCMS2
++ alarm_codes[0] = (cmsUInt16Number) 255;
++ alarm_codes[1] = (cmsUInt16Number) 0;
++ alarm_codes[2] = (cmsUInt16Number) 0;
++ cmsSetAlarmCodes(alarm_codes);
++#else
+ cmsSetAlarmCodes(255, 0, 0);
+ #endif
++#endif
+ if (selection_filetype)
+ {
+ v->selection_filetype = strdup(selection_filetype);
+diff --git a/src/xsane.h b/src/xsane.h
+index 4067d61..adcc0ed 100644
+--- a/src/xsane.h
++++ b/src/xsane.h
+@@ -70,7 +70,13 @@
+ #include <gtk/gtk.h>
+
+ #ifdef HAVE_LIBLCMS
+-# include "lcms.h"
++# ifdef HAVE_LIBLCMS2
++# include "lcms2.h"
++# else
++# include "lcms.h"
++typedef BYTE cmsUInt8Number;
++typedef DWORD cmsUInt32Number;
++# endif
+ #else
+ # define cmsHTRANSFORM void *
+ #endif
+--
+1.8.3.1
+
diff --git a/xsane-0.999-man-page.patch b/xsane-0.999-man-page.patch
new file mode 100644
index 0000000..169dad3
--- /dev/null
+++ b/xsane-0.999-man-page.patch
@@ -0,0 +1,109 @@
+From 2dbbd80a5fb80741729c7cd5027af058b9c08c2c Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Mon, 8 Jul 2013 17:46:06 +0200
+Subject: [PATCH] patch: man-page
+
+Squashed commit of the following:
+
+commit e1915d50b677458127a8ad1c7953ee1d2e2ce250
+Author: Nils Philippsen <nils at redhat.com>
+Date: Mon Jul 8 17:44:26 2013 +0200
+
+ xsane.man: update command line options
+---
+ doc/xsane.man | 29 ++++++++++++++++++++++++-----
+ 1 file changed, 24 insertions(+), 5 deletions(-)
+
+diff --git a/doc/xsane.man b/doc/xsane.man
+index ee363a8..38b453d 100644
+--- a/doc/xsane.man
++++ b/doc/xsane.man
+@@ -4,6 +4,7 @@
+ xsane - scanner frontend for SANE
+ .SH SYNOPSIS
+ .B xsane
++.RB [ --help | -h ]
+ .RB [ --version | -v ]
+ .RB [ --license | -l ]
+ .RB [ --device-settings
+@@ -13,8 +14,9 @@ xsane - scanner frontend for SANE
+ .RB [ --viewer | -V ]
+ .RB [ --save | -s ]
+ .RB [ --copy | -c ]
++.RB [ --multipage | -m ]
+ .RB [ --fax | -f ]
+-.RB [ --mail | -m ]
++.RB [ --email | -e ]
+ .RB [ --no-mode-selection | -n ]
+ .RB [ --Fixed | -F ]
+ .RB [ --Resizable | -R ]
+@@ -25,6 +27,7 @@ xsane - scanner frontend for SANE
+ .IR name ]
+ .RB [ --display
+ .IR d ]
++.RB [ --no-xshm ]
+ .RB [ --sync ]
+ .RI [ devicename ]
+ .SH DESCRIPTION
+@@ -121,6 +124,12 @@ and
+ .SH OPTIONS
+ .PP
+ If the
++.B --help
++or
++.B -h
++flag is given xsane displays a short help message and exits.
++.PP
++If the
+ .B --version
+ or
+ .B -v
+@@ -128,7 +137,7 @@ flag is given xsane prints a version information, some
+ information about gtk+ and gimp version it is compiled
+ against and lists the supported file formats, then it exits.
+ .PP
+-when the
++If the
+ .B --license
+ or
+ .B -l
+@@ -161,16 +170,22 @@ or
+ flag forces xsane to start in copy mode.
+ .PP
+ The
++.B --multipage
++or
++.B -m
++flag forces xsane to start in multipage mode.
++.PP
++The
+ .B --fax
+ or
+ .B -f
+ flag forces xsane to start in fax mode.
+ .PP
+ The
+-.B --mail
++.B --email
+ or
+-.B -m
+-flag forces xsane to start in mail mode.
++.B -e
++flag forces xsane to start in e-mail mode.
+ .PP
+ The
+ .B --no-mode-selection
+@@ -217,6 +232,10 @@ flag selects the X11 display used to present the graphical user-interface
+ for details).
+ .PP
+ The
++.B --no-xshm
++flag forces xsane not to use shared memory images.
++.PP
++The
+ .B --sync
+ flag requests a synchronous connection with the X11 server. This is for
+ debugging purposes only.
+--
+1.8.3.1
+
diff --git a/xsane-0.999-no-file-selected.patch b/xsane-0.999-no-file-selected.patch
new file mode 100644
index 0000000..5550c4c
--- /dev/null
+++ b/xsane-0.999-no-file-selected.patch
@@ -0,0 +1,91 @@
+From 2f7abcaa7ad39f118b2f49fdcba9c90b37b3d972 Mon Sep 17 00:00:00 2001
+From: Nils Philippsen <nils at redhat.com>
+Date: Fri, 5 Jul 2013 16:15:55 +0200
+Subject: [PATCH] patch: no-file-selected
+
+Squashed commit of the following:
+
+commit f887550276e324151947960292a7266c71aeb573
+Author: Pavel Polischouk <pavel.polischouk at gmail.com>
+Date: Fri Nov 25 23:55:49 2011 -0500
+
+ fix changing working directory (#621778)
+
+ The patch checks the value returned by xsane_back_gtk_get_filename. In
+ most places it will check the result properly (taking 0 for success),
+ except one case where it takes 0 for an error, and this happens in
+ xsane_browse_filename_callback (xsane-front-gtk.c). The new code would
+ abort copying the filename into preferences structure if 0 was returned,
+ and that's the OK case. I'm very curious how wonderfully it would blow
+ up if an actual error was returned, but that's a different story.
+
+commit 2c02ddd8282fa231107d8860aee4d92bdb5cb8e8
+Author: Nils Philippsen <nils at redhat.com>
+Date: Fri Nov 19 12:25:54 2010 +0100
+
+ don't crash if no files are selected (#608047)
+---
+ src/xsane-back-gtk.c | 20 ++++++++++++++++----
+ src/xsane-front-gtk.c | 6 +++++-
+ 2 files changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/src/xsane-back-gtk.c b/src/xsane-back-gtk.c
+index bca9eb2..6ef1506 100644
+--- a/src/xsane-back-gtk.c
++++ b/src/xsane-back-gtk.c
+@@ -1111,6 +1111,11 @@ static void xsane_back_gtk_filetype2_callback(GtkWidget *widget, gpointer data)
+
+ chooser_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
+
++ if (!chooser_filename)
++ {
++ return;
++ }
++
+ if ((new_filetype) && (*new_filetype))
+ {
+ extension = strrchr(chooser_filename, '.');
+@@ -1505,12 +1510,19 @@ int xsane_back_gtk_get_filename(const char *label, const char *default_name, siz
+ #endif
+
+ chooser_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
+- strncpy(filename, chooser_filename, max_len - 1);
+- g_free(chooser_filename);
++ if (chooser_filename)
++ {
++ strncpy(filename, chooser_filename, max_len - 1);
++ g_free(chooser_filename);
+
+- filename[max_len - 1] = '\0';
<Skipped 1758 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/xsane.git/commitdiff/12d07cfb268091dbd27b39699b117be334af888a
More information about the pld-cvs-commit
mailing list