pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/pkgtools/pkg_install/files/lib pkg_install-20080219:
details: https://anonhg.NetBSD.org/pkgsrc/rev/0ac79ecb51e2
branches: trunk
changeset: 538795:0ac79ecb51e2
user: joerg <joerg%pkgsrc.org@localhost>
date: Tue Feb 19 15:16:24 2008 +0000
description:
pkg_install-20080219:
Add new parser for pkg_vulnerabilities, that handles decompress
transparently and internally. Preliminary tests with a modified
audit-packages show a speed increase by 2 for common operations
like listening all vulnerable installed packages.
diffstat:
pkgtools/pkg_install/files/lib/Makefile.in | 15 +-
pkgtools/pkg_install/files/lib/decompress.c | 190 +++++++
pkgtools/pkg_install/files/lib/lib.h | 19 +-
pkgtools/pkg_install/files/lib/version.h | 4 +-
pkgtools/pkg_install/files/lib/vulnerabilities-file.c | 483 ++++++++++++++++++
5 files changed, 704 insertions(+), 7 deletions(-)
diffs (truncated from 777 to 300 lines):
diff -r 662e8e47a151 -r 0ac79ecb51e2 pkgtools/pkg_install/files/lib/Makefile.in
--- a/pkgtools/pkg_install/files/lib/Makefile.in Tue Feb 19 14:13:45 2008 +0000
+++ b/pkgtools/pkg_install/files/lib/Makefile.in Tue Feb 19 15:16:24 2008 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.in,v 1.17 2007/11/30 00:30:40 rillig Exp $
+# $NetBSD: Makefile.in,v 1.18 2008/02/19 15:16:24 joerg Exp $
srcdir= @srcdir@
@@ -13,6 +13,8 @@
tar= @tar@
ftp= @ftp@
+BOOTSTRAP= @bootstrap@
+
RANLIB= @RANLIB@
AR= @AR@
CC= @CC@
@@ -24,9 +26,14 @@
LIB= libinstall.a
-OBJS= automatic.o conflicts.o dewey.o fexec.o file.o ftpio.o global.o iterate.o \
- lpkg.o opattern.o path.o pen.o pexec.o pkgdb.o plist.o \
- str.o var.o version.o
+OBJS= automatic.o conflicts.o decompress.o dewey.o fexec.o file.o \
+ ftpio.o global.o iterate.o lpkg.o opattern.o \
+ path.o pen.o pexec.o pkgdb.o plist.o \
+ str.o var.o version.o vulnerabilities-file.o
+
+.if !empty(BOOTSTRAP)
+CPPFLAGS+= -DBOOTSTRAP
+.endif
all: $(LIB)
diff -r 662e8e47a151 -r 0ac79ecb51e2 pkgtools/pkg_install/files/lib/decompress.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pkgtools/pkg_install/files/lib/decompress.c Tue Feb 19 15:16:24 2008 +0000
@@ -0,0 +1,190 @@
+/*-
+ * Copyright (c) 2008 Joerg Sonnenberger <joerg%NetBSD.org@localhost>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <nbcompat.h>
+
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+
+__RCSID("$NetBSD: decompress.c,v 1.1 2008/02/19 15:16:24 joerg Exp $");
+
+#ifdef BOOTSTRAP
+#include "lib.h"
+
+int
+decompress_buffer(const char *input, size_t input_len, char **output,
+ size_t *output_len)
+{
+ return 0;
+}
+
+#else
+
+#include <bzlib.h>
+#if HAVE_ERR_H
+#include <err.h>
+#endif
+#include <limits.h>
+#include <stdlib.h>
+#include <zlib.h>
+
+#include "lib.h"
+
+static void
+decompress_bzip2(const char *in, size_t in_len, char **out, size_t *out_len)
+{
+ bz_stream stream;
+ size_t output_produced;
+
+ if (in_len < SSIZE_MAX / 10)
+ *out_len = in_len * 10;
+ else
+ *out_len = in_len;
+ if ((*out = malloc(*out_len + 1)) == NULL)
+ err(EXIT_FAILURE, "malloc failed");
+
+ stream.next_in = (char *)in;
+ stream.avail_in = in_len;
+ stream.next_out = *out;
+ stream.avail_out = *out_len;
+ output_produced = 0;
+ stream.bzalloc = NULL;
+ stream.bzfree = NULL;
+ stream.opaque = NULL;
+
+ if (BZ2_bzDecompressInit(&stream, 0, 0) != BZ_OK)
+ errx(EXIT_FAILURE, "BZ2_bzDecompressInit failed");
+
+ for (;;) {
+ switch (BZ2_bzDecompress(&stream)) {
+ case BZ_STREAM_END:
+ if (BZ2_bzDecompressEnd(&stream) != Z_OK)
+ errx(EXIT_FAILURE, "inflateEnd failed");
+ output_produced = *out_len - stream.avail_out;
+ *out = realloc(*out, output_produced + 1);
+ if (*out == NULL)
+ err(EXIT_FAILURE, "realloc failed");
+ *out_len = output_produced;
+ (*out)[*out_len] = '\0';
+ return;
+ case BZ_OK:
+ output_produced = *out_len - stream.avail_out;
+ if (*out_len <= SSIZE_MAX / 2)
+ *out_len *= 2;
+ else
+ errx(EXIT_FAILURE, "input too large");
+ *out = realloc(*out, *out_len + 1);
+ stream.next_out = *out + output_produced;
+ stream.avail_out = *out_len - output_produced;
+ break;
+ default:
+ errx(EXIT_FAILURE, "inflate failed");
+ }
+ }
+}
+
+static void
+decompress_zlib(const char *in, size_t in_len, char **out, size_t *out_len)
+{
+ z_stream stream;
+ size_t output_produced;
+
+ if (in_len < SSIZE_MAX / 10)
+ *out_len = in_len * 10;
+ else
+ *out_len = in_len;
+ if ((*out = malloc(*out_len + 1)) == NULL)
+ err(EXIT_FAILURE, "malloc failed");
+
+ stream.next_in = (unsigned char *)in;
+ stream.avail_in = in_len;
+ stream.next_out = (unsigned char *)*out;
+ stream.avail_out = *out_len;
+ output_produced = 0;
+ stream.zalloc = Z_NULL;
+ stream.zfree = Z_NULL;
+ stream.opaque = NULL;
+
+ if (inflateInit2(&stream, 47) != Z_OK)
+ errx(EXIT_FAILURE, "inflateInit failed");
+
+ for (;;) {
+ switch (inflate(&stream, Z_FINISH)) {
+ case Z_STREAM_END:
+ if (inflateEnd(&stream) != Z_OK)
+ errx(EXIT_FAILURE, "inflateEnd failed");
+ output_produced = *out_len - stream.avail_out;
+ *out = realloc(*out, output_produced + 1);
+ if (*out == NULL)
+ err(EXIT_FAILURE, "realloc failed");
+ *out_len = output_produced;
+ (*out)[*out_len] = '\0';
+ return;
+ case Z_OK:
+ output_produced = *out_len - stream.avail_out;
+ if (*out_len < SSIZE_MAX / 2)
+ *out_len *= 2;
+ else if (*out_len == SSIZE_MAX - 1)
+ errx(EXIT_FAILURE, "input too large");
+ else
+ *out_len = SSIZE_MAX - 1;
+ *out = realloc(*out, *out_len + 1);
+ stream.next_out = (unsigned char *)*out + output_produced;
+ stream.avail_out = *out_len - output_produced;
+ break;
+ default:
+ errx(EXIT_FAILURE, "inflate failed");
+ }
+ }
+}
+
+int
+decompress_buffer(const char *input, size_t input_len, char **output,
+ size_t *output_len)
+{
+ if (input_len < 4)
+ return 0;
+ if (input[0] == 'B' && input[1] == 'Z' && input[2] == 'h' &&
+ input[3] >= '1' && input[3] <= '9') {
+ /* Normal bzip2. */
+ decompress_bzip2(input, input_len, output, output_len);
+ } else if (input[0] == 037 && (unsigned char)input[1] == 139 &&
+ input[2] == 8 && (input[3] & 0xe0) == 0) {
+ /* gzip header with Deflate method */
+ decompress_zlib(input, input_len, output, output_len);
+ } else /* plain text */
+ return 0;
+ return 1;
+}
+#endif /* BOOTSTRAP */
diff -r 662e8e47a151 -r 0ac79ecb51e2 pkgtools/pkg_install/files/lib/lib.h
--- a/pkgtools/pkg_install/files/lib/lib.h Tue Feb 19 14:13:45 2008 +0000
+++ b/pkgtools/pkg_install/files/lib/lib.h Tue Feb 19 15:16:24 2008 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lib.h,v 1.39 2008/02/02 16:21:45 joerg Exp $ */
+/* $NetBSD: lib.h,v 1.40 2008/02/19 15:16:24 joerg Exp $ */
/* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
@@ -281,6 +281,13 @@
void (*cleanup)(void); /* called on non-zero child exit status */
} pipe_to_system_t;
+struct pkg_vulnerabilities {
+ size_t entries;
+ char **vulnerability;
+ char **classification;
+ char **advisory;
+};
+
/* If URLlength()>0, then there is a ftp:// or http:// in the string,
* and this must be an URL. Hide this behind a more obvious name. */
#define IS_URL(str) (URLlength(str) > 0)
@@ -416,9 +423,19 @@
lpkg_t *find_on_queue(lpkg_head_t *, const char *);
void free_lpkg(lpkg_t *);
+/* Extract input if compressed to NUL terminated buffer (not counted) */
+int decompress_buffer(const char *, size_t, char **, size_t *);
+
+/* Parse NUL terminated inputed, argument is strlen of the input */
+struct pkg_vulnerabilities *parse_pkg_vulnerabilities(const char *, size_t, int);
+/* Read pkg_vulnerabilities from file */
+struct pkg_vulnerabilities *read_pkg_vulnerabilities(const char *, int, int);
+void free_pkg_vulnerabilities(struct pkg_vulnerabilities *);
+
/* Externs */
extern Boolean Verbose;
extern Boolean Fake;
extern Boolean Force;
+extern const char *gpg_cmd;
#endif /* _INST_LIB_LIB_H_ */
diff -r 662e8e47a151 -r 0ac79ecb51e2 pkgtools/pkg_install/files/lib/version.h
--- a/pkgtools/pkg_install/files/lib/version.h Tue Feb 19 14:13:45 2008 +0000
+++ b/pkgtools/pkg_install/files/lib/version.h Tue Feb 19 15:16:24 2008 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: version.h,v 1.91 2008/02/07 23:40:52 joerg Exp $ */
+/* $NetBSD: version.h,v 1.92 2008/02/19 15:16:24 joerg Exp $ */
/*
* Copyright (c) 2001 Thomas Klausner. All rights reserved.
@@ -33,6 +33,6 @@
#ifndef _INST_LIB_VERSION_H_
#define _INST_LIB_VERSION_H_
-#define PKGTOOLS_VERSION "20080208"
+#define PKGTOOLS_VERSION "20080219"
#endif /* _INST_LIB_VERSION_H_ */
diff -r 662e8e47a151 -r 0ac79ecb51e2 pkgtools/pkg_install/files/lib/vulnerabilities-file.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pkgtools/pkg_install/files/lib/vulnerabilities-file.c Tue Feb 19 15:16:24 2008 +0000
@@ -0,0 +1,483 @@
+/*-
+ * Copyright (c) 2008 Joerg Sonnenberger <joerg%NetBSD.org@localhost>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
Home |
Main Index |
Thread Index |
Old Index