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