Package: odt2txt
Version: 0.4-1
Severity: normal
Tags: patch, security
User: [email protected]
Usertags: origin-ubuntu jaunty ubuntu-patch

Hello!

I noticed that odt2txt uses an embedded version of a ZIP unpacker.  It
would be much safer to link against the system libzip libraries so that if
security issues are found, odt2txt would be covered automatically by
updates to those libraries.

Attached patch (while a little brute-force in the Makefile) solves this
issue.

Thanks!

-Kees

-- 
Kees Cook                                            @debian.org
diff -u odt2txt-0.4/debian/control odt2txt-0.4/debian/control
--- odt2txt-0.4/debian/control
+++ odt2txt-0.4/debian/control
@@ -2,7 +2,7 @@
 Section: text
 Priority: optional
 Maintainer: Nelson A. de Oliveira <[email protected]>
-Build-Depends: cdbs, debhelper (>= 7), zlib1g-dev
+Build-Depends: cdbs, debhelper (>= 7), zlib1g-dev, libzip-dev
 Standards-Version: 3.8.0
 Homepage: http://stosberg.net/odt2txt/
 
--- odt2txt-0.4.orig/Makefile
+++ odt2txt-0.4/Makefile
@@ -20,6 +20,10 @@
 LIBS = -lz
 ALL_OBJ = $(OBJ) $(TEST_OBJ)
 
+KUNZIP_OBJS =
+override CFLAGS += -DHAVE_LIBZIP
+LIBS += -lzip
+
 INSTALL = install
 GROFF   = groff
 
only in patch2:
unchanged:
--- odt2txt-0.4.orig/odt2txt.c
+++ odt2txt-0.4/odt2txt.c
@@ -36,7 +36,11 @@
 #include "mem.h"
 #include "regex.h"
 #include "strbuf.h"
-#include "kunzip/kunzip.h"
+#ifdef HAVE_LIBZIP
+# include <zip.h>
+#else
+# include "kunzip/kunzip.h"
+#endif
 
 #define VERSION "0.4"
 
@@ -167,7 +171,9 @@
 {
 	printf("odt2txt %s\n"
 	       "Copyright (c) 2006,2007 Dennis Stosberg <[email protected]>\n"
+#ifndef HAVE_LIBZIP
 	       "Uses the kunzip library, Copyright 2005,2006 by Michael Kohn\n"
+#endif
 	       "\n"
 	       "This program is free software; you can redistribute it and/or\n"
 	       "modify it under the terms of the GNU General Public License,\n"
@@ -375,10 +381,27 @@
 
 static STRBUF *read_from_zip(const char *zipfile, const char *filename)
 {
-	int r;
-	STRBUF *content;
+	int r = 0;
+	STRBUF *content = NULL;
 
+#ifdef HAVE_LIBZIP
+	int zip_error;
+	struct zip *zip = NULL;
+	struct zip_stat stat;
+	struct zip_file *unzipped = NULL;
+	char *buf = NULL;
+
+	if ( !(zip = zip_open(zipfile, 0, &zip_error)) ||
+	     (r = zip_name_locate(zip, filename, ZIP_FL_NOCASE)) < 0 ||
+	     (zip_stat_index(zip, r, ZIP_FL_UNCHANGED, &stat)<0) ||
+	     !(unzipped = zip_fopen_index(zip, r, ZIP_FL_UNCHANGED)) ) {
+		if (unzipped) zip_fclose(unzipped);
+		if (zip) zip_close(zip);
+		r = -1;
+	}
+#else
 	r = kunzip_get_offset_by_name((char*)zipfile, (char*)filename, 3, -1);
+#endif
 
 	if(-1 == r) {
 		fprintf(stderr,
@@ -386,7 +409,18 @@
 		exit(EXIT_FAILURE);
 	}
 
+#ifdef HAVE_LIBZIP
+	if ( !(buf = ymalloc(stat.size + 1)) ||
+	     (zip_fread(unzipped, buf, stat.size) != stat.size) ||
+	     !(content = strbuf_slurp_n(buf, stat.size)) ) {
+		if (buf) yfree(buf);
+		content = NULL;
+	}
+	zip_fclose(unzipped);
+	zip_close(zip);
+#else
 	content = kunzip_next_tobuf((char*)zipfile, r);
+#endif
 
 	if (!content) {
 		fprintf(stderr,

Reply via email to