--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: unblock: goiardi/0.11.2-2
- From: Jordi Mallach <jordi@debian.org>
- Date: Thu, 30 Mar 2017 02:59:26 +0200
- Message-id: <149083556633.9973.18229591995623266365.reportbug@penyagolosa>
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package goiardi
It includes a backported fix for a server crash when handling objects with
duplicate array items. It also removes the logs on purge, a change that
should have been uploaded before the freeze but apparently didn't happen.
unblock goiardi/0.11.2-2
The debdiff is as follows:
+goiardi (0.11.2-2) unstable; urgency=medium
+
+ * Remove /var/log/goiardi on purge as well (really closes: #847354).
+ * Add databag_duplicate_field_crash.patch: cherrypick a fix for a server
+ crash when handling objects with duplicate items in an array.
+
+ -- Jordi Mallach <jordi@debian.org> Thu, 30 Mar 2017 02:51:02 +0200
+
goiardi (0.11.2-1) unstable; urgency=medium
* New upstream release.
diff -Nru goiardi-0.11.2/debian/patches/databag_duplicate_field_crash.patch goiardi-0.11.2/debian/patches/databag_duplicate_field_crash.patch
--- goiardi-0.11.2/debian/patches/databag_duplicate_field_crash.patch 1970-01-01 01:00:00.000000000 +0100
+++ goiardi-0.11.2/debian/patches/databag_duplicate_field_crash.patch 2017-03-30 02:50:08.000000000 +0200
@@ -0,0 +1,173 @@
+Index: goiardi/CHANGELOG
+===================================================================
+--- goiardi.orig/CHANGELOG
++++ goiardi/CHANGELOG
+@@ -4,6 +4,8 @@
+ Does require rebuilding the search index.
+ * Allow using 'novault' as a build tag to avoid having to have the vault api
+ present when building goiardi. Not relevant to most people.
++* Backport fix for duplicate items in arrays in indexed objects crashing the
++ server when saving.
+
+
+ 0.11.1
+Index: goiardi/circle.yml
+===================================================================
+--- goiardi.orig/circle.yml
++++ goiardi/circle.yml
+@@ -1,6 +1,6 @@
+ machine:
+ environment:
+- GODIST: "go1.7.3.linux-amd64.tar.gz"
++ GODIST: "go1.7.4.linux-amd64.tar.gz"
+ dependencies:
+ pre:
+ - mkdir -p download
+Index: goiardi/indexer/postgres_indexer.go
+===================================================================
+--- goiardi.orig/indexer/postgres_indexer.go
++++ goiardi/indexer/postgres_indexer.go
+@@ -21,6 +21,7 @@ import (
+ "github.com/ctdk/goiardi/datastore"
+ "github.com/ctdk/goiardi/util"
+ "github.com/lib/pq"
++ "sort"
+ "strings"
+ )
+
+@@ -146,6 +147,11 @@ func (p *PostgresIndex) SaveItem(obj Ind
+ return err
+ }
+ case []string:
++ // remove dupes from slices of strings like we're doing
++ // now with the trie index, both to reduce ambiguity and
++ // to maybe make the indexes just a little bit smaller
++ sort.Strings(v)
++ v = util.RemoveDupStrings(v)
+ for _, w := range v {
+ w = util.IndexEscapeStr(w)
+ w = strings.Replace(w, "\n", "\\n", -1)
+Index: goiardi/search/search_test.go
+===================================================================
+--- goiardi.orig/search/search_test.go
++++ goiardi/search/search_test.go
+@@ -258,6 +258,14 @@ func TestSearchBasicQueryEscaped(t *test
+ }
+ }
+
++func TestIndexDupes(t *testing.T) {
++ r, _ := role.New("idx_role")
++ r.Default["foo"] = "bar"
++ r.Default["notdupe"] = []string{"I", "am", "good"}
++ r.Default["dupes"] = []string{"I", "", "will", "", "cause", "problems", "I", ""}
++ r.Save()
++}
++
+ // Probably don't want this as an always test, but it's handy to have available.
+ /*
+ func TestEmbiggenSearch(t *testing.T) {
+Index: goiardi/util/string_test.go
+===================================================================
+--- /dev/null
++++ goiardi/util/string_test.go
+@@ -0,0 +1,37 @@
++/*
++ * Copyright (c) 2013-2016, Jeremy Bingham (<jeremy@goiardi.gl>)
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++package util
++
++import (
++ "sort"
++ "testing"
++)
++
++func TestDupRemoval(t *testing.T) {
++ strs := []string{"This", "", "has", "", "some", "", "some", "dupes"}
++ sort.Strings(strs)
++ strs = RemoveDupStrings(strs)
++ chkmap := make(map[string]uint8)
++ for _, v := range strs {
++ chkmap[v]++
++ }
++ for k, v := range chkmap {
++ if v > 1 {
++ t.Errorf("string '%s' had %d elements, should have had 1", k, v)
++ }
++ }
++}
+Index: goiardi/util/strings.go
+===================================================================
+--- goiardi.orig/util/strings.go
++++ goiardi/util/strings.go
+@@ -84,3 +84,45 @@ func parseArray(array string) []string {
+ }
+ return results
+ }
++
++// RemoveDupStrings removes duplicates from a slice of strings. The slice of
++// strings must be sorted before it's used with this function.
++func RemoveDupStrings(strs []string) []string {
++ for i, v := range strs {
++ // catches the case where we've sliced off all the duplicates,
++ // but if we don't break here checking the last element will
++ // needlessly keep marching down the remainder of the slice for
++ // no effect
++ if i > len(strs) {
++ break
++ }
++ j := 1
++ s := 0
++ for {
++ if i+j >= len(strs) {
++ break
++ }
++ if v == strs[i+j] {
++ j++
++ s++
++ } else {
++ break
++ }
++ }
++ if s == 0 {
++ continue
++ }
++ strs = delTwoPosElements(i+1, s, strs)
++ }
++ return strs
++}
++
++// DelSliceElement removes an element from a slice of strings.
++func DelSliceElement(pos int, strs []string) []string {
++ return delTwoPosElements(pos, 1, strs)
++}
++
++func delTwoPosElements(pos int, skip int, strs []string) []string {
++ strs = append(strs[:pos], strs[pos+skip:]...)
++ return strs
++}
+Index: goiardi/util/util.go
+===================================================================
+--- goiardi.orig/util/util.go
++++ goiardi/util/util.go
+@@ -175,6 +175,8 @@ func Indexify(flattened map[string]inter
+ line := fmt.Sprintf("%s:%s", k, v)
+ readyToIndex = append(readyToIndex, line)
+ case []string:
++ sort.Strings(v)
++ v = RemoveDupStrings(v)
+ for _, w := range v {
+ //w = IndexEscapeStr(w)
+ line := fmt.Sprintf("%s:%s", k, w)
diff -Nru goiardi-0.11.2/debian/patches/series goiardi-0.11.2/debian/patches/series
--- goiardi-0.11.2/debian/patches/series 2017-01-17 11:11:34.000000000 +0100
+++ goiardi-0.11.2/debian/patches/series 2017-03-30 02:47:01.000000000 +0200
@@ -1 +1,2 @@
avoid_vault_import.patch
+databag_duplicate_field_crash.patch
diff -Nru goiardi-0.11.2/debian/postrm goiardi-0.11.2/debian/postrm
--- goiardi-0.11.2/debian/postrm 2016-12-21 18:07:33.000000000 +0100
+++ goiardi-0.11.2/debian/postrm 2017-01-18 09:22:10.000000000 +0100
@@ -11,6 +11,7 @@
# Get rid of cruft
rm -rf /var/lib/goiardi
+ rm -rf /var/log/goiardi
rm -f /etc/goiardi/admin.pem \
/etc/goiardi/chef-validator.pem \
/etc/goiardi/chef-webui.pem
-- System Information:
Debian Release: 9.0
APT prefers unstable-debug
APT policy: (500, 'unstable-debug'), (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 4.9.0-1-amd64 (SMP w/4 CPU cores)
Locale: LANG=ca_ES.UTF-8, LC_CTYPE=ca_ES.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
--- End Message ---