diff options
| -rw-r--r-- | NEWS | 14 | ||||
| -rw-r--r-- | catalog/systemd.pl.catalog.in | 73 | ||||
| -rw-r--r-- | po/pl.po | 58 | ||||
| -rw-r--r-- | src/hwdb/hwdb.c | 56 | ||||
| -rw-r--r-- | src/journal/journald-rate-limit.c | 2 | ||||
| -rw-r--r-- | src/libsystemd/sd-hwdb/hwdb-internal.h | 8 | ||||
| -rw-r--r-- | src/libsystemd/sd-hwdb/sd-hwdb.c | 58 | ||||
| -rw-r--r-- | src/network/networkd-link.c | 7 | ||||
| -rw-r--r-- | units/systemd-udevd.service.in | 2 | 
9 files changed, 165 insertions, 113 deletions
| @@ -21,20 +21,6 @@ CHANGES WITH 232 in spe            ProtectKernelTunables=yes, ProtectControlGroups=yes,            RestrictAddressFamilies=. -          In particular, systemd-udevd.service is now run in a Seccomp-based -          sandbox that prohibits access to AF_INET and AF_INET6 sockets and -          thus access to the network. This might break code that runs from udev -          rules that tries to talk to the network. Doing that is generally a -          bad idea and unsafe due to a variety of reasons. It's also racy as -          device management would race against network configuration. It is -          recommended to rework such rules to use the SYSTEMD_WANTS property on -          the relevant devices to pull in a proper systemd service (which can -          be sandboxed differently and ordered correctly after the network -          having come up). If that's not possible consider reverting this -          sandboxing feature locally by removing the RestrictAddressFamilies= -          setting from the systemd-udevd.service unit file, or adding AF_INET -          and AF_INET6 to it. -          * Support for dynamically creating users for the lifetime of a service            has been added. If DynamicUser=yes is specified, user and group IDs            will be allocated from the range 61184..65519 for the lifetime of the diff --git a/catalog/systemd.pl.catalog.in b/catalog/systemd.pl.catalog.in index 33c2122974..5eead5c92c 100644 --- a/catalog/systemd.pl.catalog.in +++ b/catalog/systemd.pl.catalog.in @@ -1,7 +1,7 @@  #  This file is part of systemd.  #  #  Copyright 2012 Lennart Poettering -#  Copyright 2014, 2015, 2016 Piotr Drąg +#  Copyright 2014-2016 Piotr Drąg  #  #  systemd is free software; you can redistribute it and/or modify it  #  under the terms of the GNU Lesser General Public License as published by @@ -29,15 +29,15 @@ Subject: Uruchomiono dziennik  Defined-By: systemd  Support: %SUPPORT_URL% -Systemowy proces dziennika został uruchomiony, otworzył pliki dziennika do -zapisu i jest gotowy do przetwarzania żądań. +Systemowy proces dziennika został uruchomiony, otworzył pliki dziennika +do zapisu i jest gotowy do przetwarzania żądań.  -- d93fb3c9c24d451a97cea615ce59c00b  Subject: Zatrzymano dziennik  Defined-By: systemd  Support: %SUPPORT_URL% -Systemowy proces dziennika został wyłączony i zamknął wszystkie obecnie +Systemowy proces dziennika został wyłączony i zamknął wszystkie obecnie  aktywne pliki dziennika.  -- ec387f577b844b8fa948f33cad9a75e6 @@ -48,28 +48,28 @@ Support: %SUPPORT_URL%  @JOURNAL_NAME@ (@JOURNAL_PATH@) obecnie używa @CURRENT_USE_PRETTY@.  Maksymalnie może używać @MAX_USE_PRETTY@.  Zostawianie co najmniej @DISK_KEEP_FREE_PRETTY@ wolnego (z obecnie dostępnego @DISK_AVAILABLE_PRETTY@ miejsca na dysku). -Wymuszone ograniczenie użycia wynosi więc @LIMIT_PRETTY@, z czego @AVAILABLE_PRETTY@ jest nadal dostępne. +Wymuszone ograniczenie użycia wynosi więc @LIMIT_PRETTY@, z czego @AVAILABLE_PRETTY@ jest nadal dostępne.  Ograniczenia kontrolujące ilość miejsca na dysku używanego przez dziennik  można konfigurować za pomocą ustawień SystemMaxUse=, SystemKeepFree=,  SystemMaxFileSize=, RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize= -w pliku /etc/systemd/journald.conf. Strona journald.conf(5) zawiera więcej +w pliku /etc/systemd/journald.conf. Strona journald.conf(5) zawiera więcej  informacji.  -- a596d6fe7bfa4994828e72309e95d61e -Subject: Ograniczono komunikaty z usługi +Subject: Ograniczono komunikaty z usługi  Defined-By: systemd  Support: %SUPPORT_URL%  Documentation: man:journald.conf(5) -Usługa zapisała za dużo komunikatów w określonym czasie. Komunikaty z usługi -zostały pominięte. +Usługa zapisała za dużo komunikatów w określonym czasie. +Komunikaty z usługi zostały pominięte. -Proszę zauważyć, że tylko komunikaty z danej usługi zostały pominięte. Nie ma -to wpływu na komunikaty innych usług. +Proszę zauważyć, że tylko komunikaty z danej usługi zostały pominięte. +Nie ma to wpływu na komunikaty innych usług.  Ograniczenia kontrolujące pomijanie komunikatów mogą być konfigurowane -za pomocą opcji RateLimitIntervalSec= i RateLimitBurst= w pliku +za pomocą opcji RateLimitIntervalSec= i RateLimitBurst= w pliku  /etc/systemd/journald.conf. Strona journald.conf(5) zawiera więcej informacji.  -- e9bf28e6e834481bb6f48f548ad13606 @@ -86,18 +86,29 @@ Defined-By: systemd  Support: %SUPPORT_URL%  Documentation: man:core(5) -Proces @COREDUMP_PID@ (@COREDUMP_COMM@) uległ awarii i zrzucił plik core. +Proces @COREDUMP_PID@ (@COREDUMP_COMM@) uległ awarii i zrzucił plik core. -Zwykle wskazuje to na błąd programistyczny w danym programie i powinno zostać +Zwykle wskazuje to na błąd programistyczny w danym programie i powinno zostać  zgłoszone jego producentowi jako błąd. +-- 5aadd8e954dc4b1a8c954d63fd9e1137 +Subject: Plik core został skrócony do @SIZE_LIMIT@ B. +Defined-By: systemd +Support: %SUPPORT_URL% +Documentation: man:coredump.conf(5) + +Proces miał więcej zmapowanej pamięci niż maksimum dla przetwarzania i miejsca +skonfigurowane przez systemd-coredump(8). Tylko pierwsze @SIZE_LIMIT@ B +zostało zapisanych. Ten plik core może nadal być używalny, ale narzędzia typu +gdb(1) będą ostrzegały o skróceniu pliku. +  -- 8d45620c1a4348dbb17410da57c60c66  Subject: Utworzono nową sesję @SESSION_ID@ dla użytkownika @USER_ID@  Defined-By: systemd  Support: %SUPPORT_URL%  Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat -Nowa sesja o identyfikatorze @SESSION_ID@ została utworzona dla użytkownika +Nowa sesja o identyfikatorze @SESSION_ID@ została utworzona dla użytkownika  @USER_ID@.  Proces prowadzący sesji: @LEADER@. @@ -108,7 +119,7 @@ Defined-By: systemd  Support: %SUPPORT_URL%  Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat -Sesja o identyfikatorze @SESSION_ID@ została zakończona. +Sesja o identyfikatorze @SESSION_ID@ została zakończona.  -- fcbefc5da23d428093f97c82a9290f7b  Subject: Dostępne jest nowe stanowisko @SEAT_ID@ @@ -116,7 +127,7 @@ Defined-By: systemd  Support: %SUPPORT_URL%  Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat -Nowe stanowisko @SEAT_ID@ zostało skonfigurowane i jest teraz dostępne. +Nowe stanowisko @SEAT_ID@ zostało skonfigurowane i jest teraz dostępne.  -- e7852bfe46784ed0accde04bc864c2d5  Subject: Usunięto stanowisko @SEAT_ID@ @@ -124,7 +135,7 @@ Defined-By: systemd  Support: %SUPPORT_URL%  Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat -Stanowisko @SEAT_ID@ zostało usunięte i nie jest już dostępne. +Stanowisko @SEAT_ID@ zostało usunięte i nie jest już dostępne.  -- c7a787079b354eaaa9e77b371893cd27  Subject: Zmiana czasu @@ -175,8 +186,8 @@ Subject: Zainicjowano wyłączenie systemu  Defined-By: systemd  Support: %SUPPORT_URL% -Zainicjowano wyłączenie systemd. Wyłączenie zostało rozpoczęte i wszystkie -usługi systemowe zostały zakończone, a wszystkie systemy plików odmontowane. +Zainicjowano wyłączenie systemd. Wyłączenie zostało rozpoczęte i wszystkie +usługi systemowe zostały zakończone, a wszystkie systemy plików odmontowane.  -- 7d4958e842da4a758f6c1cdc7b36dcc5  Subject: Rozpoczęto uruchamianie jednostki @UNIT@ @@ -238,7 +249,7 @@ Subject: Nie można wykonać procesu @EXECUTABLE@  Defined-By: systemd  Support: %SUPPORT_URL% -Proces @EXECUTABLE@ nie mógł zostać wykonany i się nie powiódł. +Proces @EXECUTABLE@ nie mógł zostać wykonany i się nie powiódł.  Numer błędu zwrócony przez ten proces: @ERRNO@. @@ -249,25 +260,25 @@ Support: %SUPPORT_URL%  Jeden lub więcej komunikatów nie może zostać przekazanych do usługi syslog  uruchomionej obok journald. Zwykle oznacza to, że implementacja syslog nie -jest w stanie nadążyć za prędkością kolejki komunikatów. +jest w stanie nadążyć za prędkością kolejki komunikatów.  -- 1dee0369c7fc4736b7099b38ecb46ee7  Subject: Punkt montowania nie jest pusty  Defined-By: systemd  Support: %SUPPORT_URL% -Katalog @WHERE@ został podany jako punkt montowania (drugie pole w pliku -/etc/fstab lub pole Where= w pliku jednostki systemd) i nie jest pusty. Nie -wpływa to na montowanie, ale wcześniej istniejące pliki w tym katalogu stają +Katalog @WHERE@ został podany jako punkt montowania (drugie pole w pliku +/etc/fstab lub pole Where= w pliku jednostki systemd) i nie jest pusty. Nie +wpływa to na montowanie, ale wcześniej istniejące pliki w tym katalogu stają  się niedostępne. Aby zobaczyć te pliki, proszę ręcznie zamontować system -plików w innym położeniu. +plików w innym położeniu.  -- 24d8d4452573402496068381a6312df2  Subject: Uruchomiono maszynę wirtualną lub kontener  Defined-By: systemd  Support: %SUPPORT_URL% -Maszyna wirtualna @NAME@ (PID prowadzący @LEADER@) została uruchomiona i jest +Maszyna wirtualna @NAME@ (PID prowadzący @LEADER@) została uruchomiona i jest  gotowa do użycia.  -- 58432bd3bace477cb514b56381b8a758 @@ -284,15 +295,15 @@ Support: %SUPPORT_URL%  Documentation: man:systemd-resolved.service(8) resolved.conf(5)  Usługa resolver (systemd-resolved.service) wykryła, że skonfigurowany serwer -DNS nie obsługuje DNSSEC, w wyniku czego walidacja DNSSEC została wyłączona. +DNS nie obsługuje DNSSEC, w wyniku czego walidacja DNSSEC została wyłączona.  To zdarzenie będzie miało miejsce, jeśli skonfigurowano DNSSEC=allow-downgrade -w pliku resolved.conf, a skonfigurowany serwer DNS jest niezgodny z DNSSEC. +w pliku resolved.conf, a skonfigurowany serwer DNS jest niezgodny z DNSSEC.  Proszę zauważyć, że używanie tego trybu umożliwia ataki wyłączające DNSSEC,  ponieważ atakujący będzie mógł wyłączyć walidację DNSSEC na komputerze przez -umieszczenie odpowiednich odpowiedzi DNS w kanale komunikacji. +umieszczenie odpowiednich odpowiedzi DNS w kanale komunikacji. -To zdarzenie może wskazywać, że serwer DNS jest faktycznie niezgodny z DNSSEC, +To zdarzenie może wskazywać, że serwer DNS jest faktycznie niezgodny z DNSSEC,  albo że atakującemu udało się upozorować atak tego typu.  -- 1675d7f172174098b1108bf8c7dc8f5d @@ -1,13 +1,15 @@ -# translation of pl.po to Polish -# Piotr Drąg <piotrdrag@gmail.com>, 2011, 2013, 2014, 2015, 2016. +# Polish translation for systemd. +# Copyright © 2011-2016 the systemd authors. +# This file is distributed under the same license as the systemd package. +# Piotr Drąg <piotrdrag@gmail.com>, 2011, 2013-2016.  # Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>, 2011.  #  msgid ""  msgstr ""  "Project-Id-Version: systemd\n"  "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-23 14:24+0200\n" -"PO-Revision-Date: 2016-04-23 14:25+0200\n" +"POT-Creation-Date: 2016-10-05 19:01+0200\n" +"PO-Revision-Date: 2016-10-05 19:02+0200\n"  "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"  "Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"  "Language: pl\n" @@ -19,13 +21,13 @@ msgstr ""  #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1  msgid "Send passphrase back to system" -msgstr "Wysłanie hasła z powrotem do systemu" +msgstr "Wysłanie hasła z powrotem do systemu"  #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:2  msgid ""  "Authentication is required to send the entered passphrase back to the system."  msgstr "" -"Wymagane jest uwierzytelnienie, aby wysłać podane hasło z powrotem do " +"Wymagane jest uwierzytelnienie, aby wysłać podane hasło z powrotem do "  "systemu."  #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:3 @@ -51,7 +53,7 @@ msgstr ""  #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:7  msgid "Set or unset system and service manager environment variables"  msgstr "" -"Ustawienie lub usunięcie zmiennych środowiskowych menedżera systemu i usług" +"Ustawienie lub usunięcie zmiennych środowiskowych menedżera systemu i usług"  #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:8  msgid "" @@ -59,7 +61,7 @@ msgid ""  "environment variables."  msgstr ""  "Wymagane jest uwierzytelnienie, aby ustawić lub usunąć zmienne środowiskowe " -"menedżera systemu i usług." +"menedżera systemu i usług."  #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:9  msgid "Reload the systemd state" @@ -87,16 +89,16 @@ msgid ""  "as well as the pretty host name."  msgstr ""  "Wymagane jest uwierzytelnienie, aby ustawić statycznie skonfigurowaną nazwę " -"lokalnego komputera, a także jego ładną nazwę." +"lokalnego komputera, a także jego ładną nazwę."  #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:5  msgid "Set machine information" -msgstr "Ustawienie informacji o komputerze" +msgstr "Ustawienie informacji o komputerze"  #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:6  msgid "Authentication is required to set local machine information."  msgstr "" -"Wymagane jest uwierzytelnienie, aby ustawić informacje o lokalnym komputerze." +"Wymagane jest uwierzytelnienie, aby ustawić informacje o lokalnym komputerze."  #: ../src/import/org.freedesktop.import1.policy.in.h:1  msgid "Import a VM or container image" @@ -410,14 +412,14 @@ msgstr ""  #: ../src/login/org.freedesktop.login1.policy.in.h:51  msgid "Manage active sessions, users and seats" -msgstr "Zarządzanie aktywnymi sesjami, użytkownikami i stanowiskami" +msgstr "Zarządzanie aktywnymi sesjami, użytkownikami i stanowiskami"  #: ../src/login/org.freedesktop.login1.policy.in.h:52  msgid ""  "Authentication is required for managing active sessions, users and seats."  msgstr ""  "Wymagane jest uwierzytelnienie, aby zarządzać aktywnymi sesjami, " -"użytkownikami i stanowiskami." +"użytkownikami i stanowiskami."  #: ../src/login/org.freedesktop.login1.policy.in.h:53  msgid "Lock or unlock active sessions" @@ -468,12 +470,12 @@ msgstr ""  #: ../src/machine/org.freedesktop.machine1.policy.in.h:5  msgid "Acquire a shell in a local container" -msgstr "Uzyskanie powłoki w lokalnym kontenerze" +msgstr "Uzyskanie powłoki w lokalnym kontenerze"  #: ../src/machine/org.freedesktop.machine1.policy.in.h:6  msgid "Authentication is required to acquire a shell in a local container."  msgstr "" -"Wymagane jest uwierzytelnienie, aby uzyskać powłokę w lokalnym kontenerze." +"Wymagane jest uwierzytelnienie, aby uzyskać powłokę w lokalnym kontenerze."  #: ../src/machine/org.freedesktop.machine1.policy.in.h:7  msgid "Acquire a shell on the local host" @@ -486,13 +488,13 @@ msgstr ""  #: ../src/machine/org.freedesktop.machine1.policy.in.h:9  msgid "Acquire a pseudo TTY in a local container" -msgstr "Uzyskanie pseudo-TTY w lokalnym kontenerze" +msgstr "Uzyskanie pseudo-TTY w lokalnym kontenerze"  #: ../src/machine/org.freedesktop.machine1.policy.in.h:10  msgid ""  "Authentication is required to acquire a pseudo TTY in a local container."  msgstr "" -"Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY w lokalnym kontenerze." +"Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY w lokalnym kontenerze."  #: ../src/machine/org.freedesktop.machine1.policy.in.h:11  msgid "Acquire a pseudo TTY on the local host" @@ -506,18 +508,18 @@ msgstr ""  #: ../src/machine/org.freedesktop.machine1.policy.in.h:13  msgid "Manage local virtual machines and containers" -msgstr "Zarządzanie lokalnymi maszynami wirtualnymi i kontenerami" +msgstr "Zarządzanie lokalnymi maszynami wirtualnymi i kontenerami"  #: ../src/machine/org.freedesktop.machine1.policy.in.h:14  msgid ""  "Authentication is required to manage local virtual machines and containers."  msgstr ""  "Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi maszynami " -"wirtualnymi i kontenerami." +"wirtualnymi i kontenerami."  #: ../src/machine/org.freedesktop.machine1.policy.in.h:15  msgid "Manage local virtual machine and container images" -msgstr "Zarządzanie lokalnymi obrazami maszyn wirtualnych i kontenerów" +msgstr "Zarządzanie lokalnymi obrazami maszyn wirtualnych i kontenerów"  #: ../src/machine/org.freedesktop.machine1.policy.in.h:16  msgid "" @@ -525,7 +527,7 @@ msgid ""  "images."  msgstr ""  "Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi obrazami maszyn " -"wirtualnych i kontenerów." +"wirtualnych i kontenerów."  #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:1  msgid "Set system time" @@ -567,36 +569,36 @@ msgstr ""  "Wymagane jest uwierzytelnienie, aby kontrolować, czy włączyć synchronizację "  "czasu przez sieć." -#: ../src/core/dbus-unit.c:450 +#: ../src/core/dbus-unit.c:459  msgid "Authentication is required to start '$(unit)'."  msgstr "Wymagane jest uwierzytelnienie, aby uruchomić jednostkę „$(unit)”." -#: ../src/core/dbus-unit.c:451 +#: ../src/core/dbus-unit.c:460  msgid "Authentication is required to stop '$(unit)'."  msgstr "Wymagane jest uwierzytelnienie, aby zatrzymać jednostkę „$(unit)”." -#: ../src/core/dbus-unit.c:452 +#: ../src/core/dbus-unit.c:461  msgid "Authentication is required to reload '$(unit)'."  msgstr ""  "Wymagane jest uwierzytelnienie, aby ponownie wczytać jednostkę „$(unit)”." -#: ../src/core/dbus-unit.c:453 ../src/core/dbus-unit.c:454 +#: ../src/core/dbus-unit.c:462 ../src/core/dbus-unit.c:463  msgid "Authentication is required to restart '$(unit)'."  msgstr ""  "Wymagane jest uwierzytelnienie, aby ponownie uruchomić jednostkę „$(unit)”." -#: ../src/core/dbus-unit.c:560 +#: ../src/core/dbus-unit.c:570  msgid "Authentication is required to kill '$(unit)'."  msgstr ""  "Wymagane jest uwierzytelnienie, aby wymusić wyłączenie jednostki „$(unit)”." -#: ../src/core/dbus-unit.c:590 +#: ../src/core/dbus-unit.c:601  msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."  msgstr ""  "Wymagane jest uwierzytelnienie, aby przywrócić stan „failed” (niepowodzenia) "  "jednostki „$(unit)”." -#: ../src/core/dbus-unit.c:622 +#: ../src/core/dbus-unit.c:634  msgid "Authentication is required to set properties on '$(unit)'."  msgstr ""  "Wymagane jest uwierzytelnienie, aby ustawić właściwości jednostki „$(unit)”." diff --git a/src/hwdb/hwdb.c b/src/hwdb/hwdb.c index e12cd93d1c..be4ef5f9e9 100644 --- a/src/hwdb/hwdb.c +++ b/src/hwdb/hwdb.c @@ -85,6 +85,8 @@ struct trie_child_entry {  struct trie_value_entry {          size_t key_off;          size_t value_off; +        size_t filename_off; +        size_t line_number;  };  static int trie_children_cmp(const void *v1, const void *v2) { @@ -157,9 +159,11 @@ static int trie_values_cmp(const void *v1, const void *v2, void *arg) {  }  static int trie_node_add_value(struct trie *trie, struct trie_node *node, -                          const char *key, const char *value) { -        ssize_t k, v; +                               const char *key, const char *value, +                               const char *filename, size_t line_number) { +        ssize_t k, v, fn;          struct trie_value_entry *val; +        int r;          k = strbuf_add_string(trie->strings, key, strlen(key));          if (k < 0) @@ -167,6 +171,9 @@ static int trie_node_add_value(struct trie *trie, struct trie_node *node,          v = strbuf_add_string(trie->strings, value, strlen(value));          if (v < 0)                  return v; +        fn = strbuf_add_string(trie->strings, filename, strlen(filename)); +        if (v < 0) +                return v;          if (node->values_count) {                  struct trie_value_entry search = { @@ -176,8 +183,20 @@ static int trie_node_add_value(struct trie *trie, struct trie_node *node,                  val = xbsearch_r(&search, node->values, node->values_count, sizeof(struct trie_value_entry), trie_values_cmp, trie);                  if (val) { +                        /* +                         * At this point we have 2 identical properties on the same match-string. We +                         * strictly order them by filename+line-number, since we know the dynamic +                         * runtime lookup does the same for multiple matching nodes. +                         */ +                        r = strcmp(filename, trie->strings->buf + val->filename_off); +                        if (r < 0 || +                            (r == 0 && line_number < val->line_number)) +                                return 0; +                          /* replace existing earlier key with new value */                          val->value_off = v; +                        val->filename_off = fn; +                        val->line_number = line_number;                          return 0;                  }          } @@ -190,13 +209,16 @@ static int trie_node_add_value(struct trie *trie, struct trie_node *node,          node->values = val;          node->values[node->values_count].key_off = k;          node->values[node->values_count].value_off = v; +        node->values[node->values_count].filename_off = fn; +        node->values[node->values_count].line_number = line_number;          node->values_count++;          qsort_r(node->values, node->values_count, sizeof(struct trie_value_entry), trie_values_cmp, trie);          return 0;  }  static int trie_insert(struct trie *trie, struct trie_node *node, const char *search, -                       const char *key, const char *value) { +                       const char *key, const char *value, +                       const char *filename, uint64_t line_number) {          size_t i = 0;          int err = 0; @@ -250,7 +272,7 @@ static int trie_insert(struct trie *trie, struct trie_node *node, const char *se                  c = search[i];                  if (c == '\0') -                        return trie_node_add_value(trie, node, key, value); +                        return trie_node_add_value(trie, node, key, value, filename, line_number);                  child = node_lookup(node, c);                  if (!child) { @@ -274,7 +296,7 @@ static int trie_insert(struct trie *trie, struct trie_node *node, const char *se                                  return err;                          } -                        return trie_node_add_value(trie, child, key, value); +                        return trie_node_add_value(trie, child, key, value, filename, line_number);                  }                  node = child; @@ -303,7 +325,7 @@ static void trie_store_nodes_size(struct trie_f *trie, struct trie_node *node) {          for (i = 0; i < node->children_count; i++)                  trie->strings_off += sizeof(struct trie_child_entry_f);          for (i = 0; i < node->values_count; i++) -                trie->strings_off += sizeof(struct trie_value_entry_f); +                trie->strings_off += sizeof(struct trie_value_entry2_f);  }  static int64_t trie_store_nodes(struct trie_f *trie, struct trie_node *node) { @@ -349,12 +371,14 @@ static int64_t trie_store_nodes(struct trie_f *trie, struct trie_node *node) {          /* append values array */          for (i = 0; i < node->values_count; i++) { -                struct trie_value_entry_f v = { +                struct trie_value_entry2_f v = {                          .key_off = htole64(trie->strings_off + node->values[i].key_off),                          .value_off = htole64(trie->strings_off + node->values[i].value_off), +                        .filename_off = htole64(trie->strings_off + node->values[i].filename_off), +                        .line_number = htole64(node->values[i].line_number),                  }; -                fwrite(&v, sizeof(struct trie_value_entry_f), 1, trie->f); +                fwrite(&v, sizeof(struct trie_value_entry2_f), 1, trie->f);                  trie->values_count++;          } @@ -375,7 +399,7 @@ static int trie_store(struct trie *trie, const char *filename) {                  .header_size = htole64(sizeof(struct trie_header_f)),                  .node_size = htole64(sizeof(struct trie_node_f)),                  .child_entry_size = htole64(sizeof(struct trie_child_entry_f)), -                .value_entry_size = htole64(sizeof(struct trie_value_entry_f)), +                .value_entry_size = htole64(sizeof(struct trie_value_entry2_f)),          };          int err; @@ -431,14 +455,15 @@ static int trie_store(struct trie *trie, const char *filename) {          log_debug("child pointers:   %8"PRIu64" bytes (%8"PRIu64")",                    t.children_count * sizeof(struct trie_child_entry_f), t.children_count);          log_debug("value pointers:   %8"PRIu64" bytes (%8"PRIu64")", -                  t.values_count * sizeof(struct trie_value_entry_f), t.values_count); +                  t.values_count * sizeof(struct trie_value_entry2_f), t.values_count);          log_debug("string store:     %8zu bytes", trie->strings->len);          log_debug("strings start:    %8"PRIu64, t.strings_off);          return 0;  } -static int insert_data(struct trie *trie, char **match_list, char *line, const char *filename) { +static int insert_data(struct trie *trie, char **match_list, char *line, +                       const char *filename, size_t line_number) {          char *value, **entry;          value = strchr(line, '='); @@ -460,7 +485,7 @@ static int insert_data(struct trie *trie, char **match_list, char *line, const c          }          STRV_FOREACH(entry, match_list) -                trie_insert(trie, trie->root, *entry, line, value); +                trie_insert(trie, trie->root, *entry, line, value, filename, line_number);          return 0;  } @@ -474,6 +499,7 @@ static int import_file(struct trie *trie, const char *filename) {          _cleanup_fclose_ FILE *f = NULL;          char line[LINE_MAX];          _cleanup_strv_free_ char **match_list = NULL; +        size_t line_number = 0;          char *match = NULL;          int r; @@ -485,6 +511,8 @@ static int import_file(struct trie *trie, const char *filename) {                  size_t len;                  char *pos; +                ++line_number; +                  /* comment line */                  if (line[0] == '#')                          continue; @@ -546,7 +574,7 @@ static int import_file(struct trie *trie, const char *filename) {                          /* first data */                          state = HW_DATA; -                        insert_data(trie, match_list, line, filename); +                        insert_data(trie, match_list, line, filename, line_number);                          break;                  case HW_DATA: @@ -564,7 +592,7 @@ static int import_file(struct trie *trie, const char *filename) {                                  break;                          } -                        insert_data(trie, match_list, line, filename); +                        insert_data(trie, match_list, line, filename, line_number);                          break;                  };          } diff --git a/src/journal/journald-rate-limit.c b/src/journal/journald-rate-limit.c index d30bf92cec..f48639cf58 100644 --- a/src/journal/journald-rate-limit.c +++ b/src/journal/journald-rate-limit.c @@ -261,7 +261,7 @@ int journal_rate_limit_test(JournalRateLimit *r, const char *id, int priority, u                  return 1 + s;          } -        if (p->num <= burst) { +        if (p->num < burst) {                  p->num++;                  return 1;          } diff --git a/src/libsystemd/sd-hwdb/hwdb-internal.h b/src/libsystemd/sd-hwdb/hwdb-internal.h index 8ffb5e5c74..4fff94ec76 100644 --- a/src/libsystemd/sd-hwdb/hwdb-internal.h +++ b/src/libsystemd/sd-hwdb/hwdb-internal.h @@ -70,3 +70,11 @@ struct trie_value_entry_f {          le64_t key_off;          le64_t value_off;  } _packed_; + +/* v2 extends v1 with filename and line-number */ +struct trie_value_entry2_f { +        le64_t key_off; +        le64_t value_off; +        le64_t filename_off; +        le64_t line_number; +} _packed_; diff --git a/src/libsystemd/sd-hwdb/sd-hwdb.c b/src/libsystemd/sd-hwdb/sd-hwdb.c index 062fa97b17..488e101ea8 100644 --- a/src/libsystemd/sd-hwdb/sd-hwdb.c +++ b/src/libsystemd/sd-hwdb/sd-hwdb.c @@ -97,15 +97,20 @@ static void linebuf_rem_char(struct linebuf *buf) {          linebuf_rem(buf, 1);  } -static const struct trie_child_entry_f *trie_node_children(sd_hwdb *hwdb, const struct trie_node_f *node) { -        return (const struct trie_child_entry_f *)((const char *)node + le64toh(hwdb->head->node_size)); +static const struct trie_child_entry_f *trie_node_child(sd_hwdb *hwdb, const struct trie_node_f *node, size_t idx) { +        const char *base = (const char *)node; + +        base += le64toh(hwdb->head->node_size); +        base += idx * le64toh(hwdb->head->child_entry_size); +        return (const struct trie_child_entry_f *)base;  } -static const struct trie_value_entry_f *trie_node_values(sd_hwdb *hwdb, const struct trie_node_f *node) { +static const struct trie_value_entry_f *trie_node_value(sd_hwdb *hwdb, const struct trie_node_f *node, size_t idx) {          const char *base = (const char *)node;          base += le64toh(hwdb->head->node_size);          base += node->children_count * le64toh(hwdb->head->child_entry_size); +        base += idx * le64toh(hwdb->head->value_entry_size);          return (const struct trie_value_entry_f *)base;  } @@ -129,19 +134,20 @@ static const struct trie_node_f *node_lookup_f(sd_hwdb *hwdb, const struct trie_          struct trie_child_entry_f search;          search.c = c; -        child = bsearch(&search, trie_node_children(hwdb, node), node->children_count, +        child = bsearch(&search, (const char *)node + le64toh(hwdb->head->node_size), node->children_count,                          le64toh(hwdb->head->child_entry_size), trie_children_cmp_f);          if (child)                  return trie_node_from_off(hwdb, child->child_off);          return NULL;  } -static int hwdb_add_property(sd_hwdb *hwdb, const char *key, const char *value) { +static int hwdb_add_property(sd_hwdb *hwdb, const struct trie_value_entry_f *entry) { +        const char *key;          int r;          assert(hwdb); -        assert(key); -        assert(value); + +        key = trie_string(hwdb, entry->key_off);          /*           * Silently ignore all properties which do not start with a @@ -152,11 +158,25 @@ static int hwdb_add_property(sd_hwdb *hwdb, const char *key, const char *value)          key++; +        if (le64toh(hwdb->head->value_entry_size) >= sizeof(struct trie_value_entry2_f)) { +                const struct trie_value_entry2_f *old, *entry2; + +                entry2 = (const struct trie_value_entry2_f *)entry; +                old = ordered_hashmap_get(hwdb->properties, key); +                if (old) { +                        /* on duplicates, we order by filename and line-number */ +                        r = strcmp(trie_string(hwdb, entry2->filename_off), trie_string(hwdb, old->filename_off)); +                        if (r < 0 || +                            (r == 0 && entry2->line_number < old->line_number)) +                                return 0; +                } +        } +          r = ordered_hashmap_ensure_allocated(&hwdb->properties, &string_hash_ops);          if (r < 0)                  return r; -        r = ordered_hashmap_replace(hwdb->properties, key, (char*)value); +        r = ordered_hashmap_replace(hwdb->properties, key, (void *)entry);          if (r < 0)                  return r; @@ -177,7 +197,7 @@ static int trie_fnmatch_f(sd_hwdb *hwdb, const struct trie_node_f *node, size_t          linebuf_add(buf, prefix + p, len);          for (i = 0; i < node->children_count; i++) { -                const struct trie_child_entry_f *child = &trie_node_children(hwdb, node)[i]; +                const struct trie_child_entry_f *child = trie_node_child(hwdb, node, i);                  linebuf_add_char(buf, child->c);                  err = trie_fnmatch_f(hwdb, trie_node_from_off(hwdb, child->child_off), 0, buf, search); @@ -188,8 +208,7 @@ static int trie_fnmatch_f(sd_hwdb *hwdb, const struct trie_node_f *node, size_t          if (le64toh(node->values_count) && fnmatch(linebuf_get(buf), search, 0) == 0)                  for (i = 0; i < le64toh(node->values_count); i++) { -                        err = hwdb_add_property(hwdb, trie_string(hwdb, trie_node_values(hwdb, node)[i].key_off), -                                                trie_string(hwdb, trie_node_values(hwdb, node)[i].value_off)); +                        err = hwdb_add_property(hwdb, trie_node_value(hwdb, node, i));                          if (err < 0)                                  return err;                  } @@ -254,8 +273,7 @@ static int trie_search_f(sd_hwdb *hwdb, const char *search) {                          size_t n;                          for (n = 0; n < le64toh(node->values_count); n++) { -                                err = hwdb_add_property(hwdb, trie_string(hwdb, trie_node_values(hwdb, node)[n].key_off), -                                                        trie_string(hwdb, trie_node_values(hwdb, node)[n].value_off)); +                                err = hwdb_add_property(hwdb, trie_node_value(hwdb, node, n));                                  if (err < 0)                                          return err;                          } @@ -410,7 +428,7 @@ static int properties_prepare(sd_hwdb *hwdb, const char *modalias) {  }  _public_ int sd_hwdb_get(sd_hwdb *hwdb, const char *modalias, const char *key, const char **_value) { -        const char *value; +        const struct trie_value_entry_f *entry;          int r;          assert_return(hwdb, -EINVAL); @@ -422,11 +440,11 @@ _public_ int sd_hwdb_get(sd_hwdb *hwdb, const char *modalias, const char *key, c          if (r < 0)                  return r; -        value = ordered_hashmap_get(hwdb->properties, key); -        if (!value) +        entry = ordered_hashmap_get(hwdb->properties, key); +        if (!entry)                  return -ENOENT; -        *_value = value; +        *_value = trie_string(hwdb, entry->value_off);          return 0;  } @@ -449,8 +467,8 @@ _public_ int sd_hwdb_seek(sd_hwdb *hwdb, const char *modalias) {  }  _public_ int sd_hwdb_enumerate(sd_hwdb *hwdb, const char **key, const char **value) { +        const struct trie_value_entry_f *entry;          const void *k; -        void *v;          assert_return(hwdb, -EINVAL);          assert_return(key, -EINVAL); @@ -459,12 +477,12 @@ _public_ int sd_hwdb_enumerate(sd_hwdb *hwdb, const char **key, const char **val          if (hwdb->properties_modified)                  return -EAGAIN; -        ordered_hashmap_iterate(hwdb->properties, &hwdb->properties_iterator, &v, &k); +        ordered_hashmap_iterate(hwdb->properties, &hwdb->properties_iterator, (void **)&entry, &k);          if (!k)                  return 0;          *key = k; -        *value = v; +        *value = trie_string(hwdb, entry->value_off);          return 1;  } diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 25f46c093e..d9e060b6cf 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -944,16 +944,15 @@ static int link_push_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {  static int link_set_bridge_fdb(Link *link) {          FdbEntry *fdb_entry; -        int r = 0; +        int r;          LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {                  r = fdb_entry_configure(link, fdb_entry); -                if (r < 0) { +                if (r < 0)                          return log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m"); -                }          } -        return r; +        return 0;  }  static int link_enter_set_addresses(Link *link) { diff --git a/units/systemd-udevd.service.in b/units/systemd-udevd.service.in index cb2d8ba775..46d637883b 100644 --- a/units/systemd-udevd.service.in +++ b/units/systemd-udevd.service.in @@ -27,4 +27,4 @@ TasksMax=infinity  MountFlags=slave  MemoryDenyWriteExecute=yes  RestrictRealtime=yes -RestrictAddressFamilies=AF_UNIX AF_NETLINK +RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6 | 
