From db38be64094b10636c6554ccd727083b9a0f0336 Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Oct 13 2014 14:21:01 +0000 Subject: More patches --- diff --git a/0578-bus-proxyd-fix-compatibility-with-old-dbus-1.patch b/0578-bus-proxyd-fix-compatibility-with-old-dbus-1.patch new file mode 100644 index 0000000..c51666c --- /dev/null +++ b/0578-bus-proxyd-fix-compatibility-with-old-dbus-1.patch @@ -0,0 +1,38 @@ +From 547e849b722e597d70ba069e2cb8931317d66e00 Mon Sep 17 00:00:00 2001 +From: Lukasz Skalski +Date: Fri, 10 Oct 2014 16:42:19 +0200 +Subject: [PATCH] bus-proxyd: fix compatibility with old dbus-1 + +'ListQueuedOwners' method should return 'NameHasNoOwner' error +if chosen name is not available on bus. +--- + src/bus-proxyd/bus-proxyd.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/bus-proxyd/bus-proxyd.c b/src/bus-proxyd/bus-proxyd.c +index 4f44825679..52498f33d2 100644 +--- a/src/bus-proxyd/bus-proxyd.c ++++ b/src/bus-proxyd/bus-proxyd.c +@@ -733,6 +733,7 @@ static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) { + struct kdbus_cmd_free cmd_free; + struct kdbus_cmd_name *name; + _cleanup_strv_free_ char **owners = NULL; ++ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; + char *arg0; + int err = 0; + +@@ -743,6 +744,14 @@ static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) { + if (!service_name_is_valid(arg0)) + return synthetic_reply_method_errno(m, -EINVAL, NULL); + ++ r = sd_bus_get_owner(a, arg0, 0, NULL); ++ if (r == -ESRCH || r == -ENXIO) { ++ sd_bus_error_setf(&error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Could not get owners of name '%s': no such name.", arg0); ++ return synthetic_reply_method_errno(m, r, &error); ++ } ++ if (r < 0) ++ return synthetic_reply_method_errno(m, r, NULL); ++ + cmd.flags = KDBUS_NAME_LIST_QUEUED; + r = ioctl(a->input_fd, KDBUS_CMD_NAME_LIST, &cmd); + if (r < 0) diff --git a/0579-Report-aa_change_onexec-error-code.patch b/0579-Report-aa_change_onexec-error-code.patch new file mode 100644 index 0000000..eba8e04 --- /dev/null +++ b/0579-Report-aa_change_onexec-error-code.patch @@ -0,0 +1,26 @@ +From 5482192e5774f52f2af0665a3b58539295e9c0a4 Mon Sep 17 00:00:00 2001 +From: Michael Scherer +Date: Sat, 11 Oct 2014 04:13:43 -0400 +Subject: [PATCH] Report aa_change_onexec error code + +Since aa_change_onexec return the error code in errno, and return +-1, the current code do not give any useful information when +something fail. This make apparmor easier to debug, as seen on +https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=760526 +--- + src/core/execute.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/core/execute.c b/src/core/execute.c +index 8b9bb27137..b165b33af0 100644 +--- a/src/core/execute.c ++++ b/src/core/execute.c +@@ -1698,7 +1698,7 @@ static int exec_child(ExecCommand *command, + err = aa_change_onexec(context->apparmor_profile); + if (err < 0 && !context->apparmor_profile_ignore) { + *error = EXIT_APPARMOR_PROFILE; +- return err; ++ return -errno; + } + } + #endif diff --git a/0580-sd-dhcp-client-support-non-Ethernet-hardware-address.patch b/0580-sd-dhcp-client-support-non-Ethernet-hardware-address.patch new file mode 100644 index 0000000..ff2278c --- /dev/null +++ b/0580-sd-dhcp-client-support-non-Ethernet-hardware-address.patch @@ -0,0 +1,636 @@ +From 76253e73f9c9c24fec755e485516f3b55d0707b4 Mon Sep 17 00:00:00 2001 +From: Dan Williams +Date: Wed, 8 Oct 2014 14:15:45 -0500 +Subject: [PATCH] sd-dhcp-client: support non-Ethernet hardware addresses + +Like Infiniband. See RFC 4390 section 2.1 for details on DHCP +and Infiniband; chaddr is zeroed, hlen is set to 0, and htype +is set to ARPHRD_INFINIBAND because IB hardware addresses +are 20 bytes in length. +--- + src/libsystemd-network/dhcp-internal.h | 10 ++-- + src/libsystemd-network/dhcp-network.c | 54 ++++++++++++++++++---- + src/libsystemd-network/dhcp-packet.c | 8 ++-- + src/libsystemd-network/sd-dhcp-client.c | 74 +++++++++++++++++++++++------- + src/libsystemd-network/sd-dhcp-server.c | 8 ++-- + src/libsystemd-network/sd-dhcp6-client.c | 36 +++++++++++---- + src/libsystemd-network/test-dhcp-client.c | 14 ++++-- + src/libsystemd-network/test-dhcp-option.c | 2 +- + src/libsystemd-network/test-dhcp6-client.c | 8 +++- + src/network/networkd-dhcp4.c | 4 +- + src/network/networkd-link.c | 12 +++-- + src/systemd/sd-dhcp-client.h | 4 +- + src/systemd/sd-dhcp6-client.h | 4 +- + 13 files changed, 179 insertions(+), 59 deletions(-) + +diff --git a/src/libsystemd-network/dhcp-internal.h b/src/libsystemd-network/dhcp-internal.h +index 1069c8a03b..d358a49307 100644 +--- a/src/libsystemd-network/dhcp-internal.h ++++ b/src/libsystemd-network/dhcp-internal.h +@@ -24,6 +24,7 @@ + + #include + #include ++#include + #include + + #include "socket-util.h" +@@ -31,7 +32,9 @@ + #include "sd-dhcp-client.h" + #include "dhcp-protocol.h" + +-int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, uint32_t xid, struct ether_addr mac_addr); ++int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, ++ uint32_t xid, const uint8_t *mac_addr, ++ size_t mac_addr_len, uint16_t arp_type); + int dhcp_network_bind_udp_socket(be32_t address, uint16_t port); + int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, + const void *packet, size_t len); +@@ -47,8 +50,9 @@ typedef int (*dhcp_option_cb_t)(uint8_t code, uint8_t len, + int dhcp_option_parse(DHCPMessage *message, size_t len, + dhcp_option_cb_t cb, void *user_data); + +-int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid, uint8_t type, +- size_t optlen, size_t *optoffset); ++int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid, ++ uint8_t type, uint16_t arp_type, size_t optlen, ++ size_t *optoffset); + + uint16_t dhcp_packet_checksum(uint8_t *buf, size_t len); + +diff --git a/src/libsystemd-network/dhcp-network.c b/src/libsystemd-network/dhcp-network.c +index 1ced5cf292..29e9993f66 100644 +--- a/src/libsystemd-network/dhcp-network.c ++++ b/src/libsystemd-network/dhcp-network.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -32,9 +33,12 @@ + + #include "dhcp-internal.h" + +-int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, +- uint32_t xid, struct ether_addr mac_addr) { +- ++static int _bind_raw_socket(int ifindex, union sockaddr_union *link, ++ uint32_t xid, const uint8_t *mac_addr, ++ size_t mac_addr_len, ++ const uint8_t *bcast_addr, ++ const struct ether_addr *eth_mac, ++ uint16_t arp_type, uint8_t dhcp_hlen) { + struct sock_filter filter[] = { + BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0), /* A <- packet length */ + BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(DHCPPacket), 1, 0), /* packet >= DHCPPacket ? */ +@@ -57,21 +61,21 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, BOOTREPLY, 1, 0), /* op == BOOTREPLY ? */ + BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */ + BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.htype)), /* A <- DHCP header type */ +- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPHRD_ETHER, 1, 0), /* header type == ARPHRD_ETHER ? */ ++ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arp_type, 1, 0), /* header type == arp_type ? */ + BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */ + BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.hlen)), /* A <- mac address length */ +- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHER_ADDR_LEN, 1, 0), /* address length == ETHER_ADDR_LEN ? */ ++ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, dhcp_hlen, 1, 0), /* address length == dhcp_hlen ? */ + BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */ + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.xid)), /* A <- client identifier */ + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, xid, 1, 0), /* client identifier == xid ? */ + BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */ +- BPF_STMT(BPF_LD + BPF_IMM, htobe32(*((unsigned int *) &mac_addr))), /* A <- 4 bytes of client's MAC */ ++ BPF_STMT(BPF_LD + BPF_IMM, htobe32(*((unsigned int *) eth_mac))), /* A <- 4 bytes of client's MAC */ + BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */ + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr)), /* A <- 4 bytes of MAC from dhcp.chaddr */ + BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */ + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0), /* A == 0 ? */ + BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */ +- BPF_STMT(BPF_LD + BPF_IMM, htobe16(*((unsigned short *) (((char *) &mac_addr) + 4)))), /* A <- remainder of client's MAC */ ++ BPF_STMT(BPF_LD + BPF_IMM, htobe16(*((unsigned short *) (((char *) eth_mac) + 4)))), /* A <- remainder of client's MAC */ + BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */ + BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr) + 4), /* A <- remainder of MAC from dhcp.chaddr */ + BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */ +@@ -107,8 +111,9 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, + link->ll.sll_family = AF_PACKET; + link->ll.sll_protocol = htons(ETH_P_IP); + link->ll.sll_ifindex = ifindex; +- link->ll.sll_halen = ETH_ALEN; +- memset(link->ll.sll_addr, 0xff, ETH_ALEN); ++ link->ll.sll_hatype = htons(arp_type); ++ link->ll.sll_halen = mac_addr_len; ++ memcpy(link->ll.sll_addr, bcast_addr, mac_addr_len); + + r = bind(s, &link->sa, sizeof(link->ll)); + if (r < 0) +@@ -120,6 +125,37 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, + return r; + } + ++int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link, ++ uint32_t xid, const uint8_t *mac_addr, ++ size_t mac_addr_len, uint16_t arp_type) { ++ static const uint8_t eth_bcast[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; ++ /* Default broadcast address for IPoIB */ ++ static const uint8_t ib_bcast[] = { ++ 0x00, 0xff, 0xff, 0xff, 0xff, 0x12, 0x40, 0x1b, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xff, 0xff, 0xff, 0xff ++ }; ++ struct ether_addr eth_mac = { { 0, 0, 0, 0, 0, 0 } }; ++ const uint8_t *bcast_addr = NULL; ++ uint8_t dhcp_hlen = 0; ++ ++ assert_return(mac_addr_len > 0, -EINVAL); ++ ++ if (arp_type == ARPHRD_ETHER) { ++ assert_return(mac_addr_len == ETH_ALEN, -EINVAL); ++ memcpy(ð_mac, mac_addr, ETH_ALEN); ++ bcast_addr = eth_bcast; ++ dhcp_hlen = ETH_ALEN; ++ } else if (arp_type == ARPHRD_INFINIBAND) { ++ assert_return(mac_addr_len == INFINIBAND_ALEN, -EINVAL); ++ bcast_addr = ib_bcast; ++ } else ++ return -EINVAL; ++ ++ return _bind_raw_socket(ifindex, link, xid, mac_addr, mac_addr_len, ++ bcast_addr, ð_mac, arp_type, dhcp_hlen); ++} ++ + int dhcp_network_bind_udp_socket(be32_t address, uint16_t port) { + union sockaddr_union src = { + .in.sin_family = AF_INET, +diff --git a/src/libsystemd-network/dhcp-packet.c b/src/libsystemd-network/dhcp-packet.c +index 9f850fdebb..7581daeeeb 100644 +--- a/src/libsystemd-network/dhcp-packet.c ++++ b/src/libsystemd-network/dhcp-packet.c +@@ -38,15 +38,17 @@ + #define DHCP_CLIENT_MIN_OPTIONS_SIZE 312 + + int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid, +- uint8_t type, size_t optlen, size_t *optoffset) { ++ uint8_t type, uint16_t arp_type, size_t optlen, ++ size_t *optoffset) { + size_t offset = 0; + int r; + + assert(op == BOOTREQUEST || op == BOOTREPLY); ++ assert(arp_type == ARPHRD_ETHER || arp_type == ARPHRD_INFINIBAND); + + message->op = op; +- message->htype = ARPHRD_ETHER; +- message->hlen = ETHER_ADDR_LEN; ++ message->htype = arp_type; ++ message->hlen = (arp_type == ARPHRD_ETHER) ? ETHER_ADDR_LEN : 0; + message->xid = htobe32(xid); + message->magic = htobe32(DHCP_MAGIC_COOKIE); + +diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c +index 2f94c16078..0eba4c379d 100644 +--- a/src/libsystemd-network/sd-dhcp-client.c ++++ b/src/libsystemd-network/sd-dhcp-client.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -37,6 +38,8 @@ + #include "dhcp-lease-internal.h" + #include "sd-dhcp-client.h" + ++#define MAX_MAC_ADDR_LEN INFINIBAND_ALEN ++ + struct sd_dhcp_client { + RefCount n_ref; + +@@ -57,6 +60,9 @@ struct sd_dhcp_client { + uint8_t type; + struct ether_addr mac_addr; + } _packed_ client_id; ++ uint8_t mac_addr[MAX_MAC_ADDR_LEN]; ++ size_t mac_addr_len; ++ uint16_t arp_type; + char *hostname; + char *vendor_class_identifier; + uint32_t mtu; +@@ -163,15 +169,25 @@ int sd_dhcp_client_set_index(sd_dhcp_client *client, int interface_index) { + return 0; + } + +-int sd_dhcp_client_set_mac(sd_dhcp_client *client, +- const struct ether_addr *addr) { ++int sd_dhcp_client_set_mac(sd_dhcp_client *client, const uint8_t *addr, ++ size_t addr_len, uint16_t arp_type) { + DHCP_CLIENT_DONT_DESTROY(client); + bool need_restart = false; + + assert_return(client, -EINVAL); + assert_return(addr, -EINVAL); ++ assert_return(addr_len > 0 && addr_len <= MAX_MAC_ADDR_LEN, -EINVAL); ++ assert_return(arp_type > 0, -EINVAL); ++ ++ if (arp_type == ARPHRD_ETHER) ++ assert_return(addr_len == ETH_ALEN, -EINVAL); ++ else if (arp_type == ARPHRD_INFINIBAND) ++ assert_return(addr_len == INFINIBAND_ALEN, -EINVAL); ++ else ++ return -EINVAL; + +- if (memcmp(&client->client_id.mac_addr, addr, ETH_ALEN) == 0) ++ if (client->mac_addr_len == addr_len && ++ memcmp(&client->mac_addr, addr, addr_len) == 0) + return 0; + + if (!IN_SET(client->state, DHCP_STATE_INIT, DHCP_STATE_STOPPED)) { +@@ -181,6 +197,10 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client, + client_stop(client, DHCP_EVENT_STOP); + } + ++ memcpy(&client->mac_addr, addr, addr_len); ++ client->mac_addr_len = addr_len; ++ client->arp_type = arp_type; ++ + memcpy(&client->client_id.mac_addr, addr, ETH_ALEN); + client->client_id.type = 0x01; + +@@ -318,7 +338,7 @@ static int client_message_init(sd_dhcp_client *client, DHCPPacket **ret, + return -ENOMEM; + + r = dhcp_message_init(&packet->dhcp, BOOTREQUEST, client->xid, type, +- optlen, &optoffset); ++ client->arp_type, optlen, &optoffset); + if (r < 0) + return r; + +@@ -337,14 +357,17 @@ static int client_message_init(sd_dhcp_client *client, DHCPPacket **ret, + Note: some interfaces needs this to be enabled, but some networks + needs this to be disabled as broadcasts are filteretd, so this + needs to be configurable */ +- if (client->request_broadcast) ++ if (client->request_broadcast || client->arp_type != ARPHRD_ETHER) + packet->dhcp.flags = htobe16(0x8000); + + /* RFC2132 section 4.1.1: + The client MUST include its hardware address in the ’chaddr’ field, if +- necessary for delivery of DHCP reply messages. ++ necessary for delivery of DHCP reply messages. Non-Ethernet ++ interfaces will leave 'chaddr' empty and use the client identifier ++ instead (eg, RFC 4390 section 2.1). + */ +- memcpy(&packet->dhcp.chaddr, &client->client_id.mac_addr, ETH_ALEN); ++ if (client->arp_type == ARPHRD_ETHER) ++ memcpy(&packet->dhcp.chaddr, &client->mac_addr, ETH_ALEN); + + /* Some DHCP servers will refuse to issue an DHCP lease if the Client + Identifier option is not set */ +@@ -843,7 +866,9 @@ static int client_start(sd_dhcp_client *client) { + + client->xid = random_u32(); + +- r = dhcp_network_bind_raw_socket(client->index, &client->link, client->xid, client->client_id.mac_addr); ++ r = dhcp_network_bind_raw_socket(client->index, &client->link, ++ client->xid, client->mac_addr, ++ client->mac_addr_len, client->arp_type); + if (r < 0) { + client_stop(client, r); + return r; +@@ -887,7 +912,9 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata) + client->state = DHCP_STATE_REBINDING; + client->attempt = 1; + +- r = dhcp_network_bind_raw_socket(client->index, &client->link, client->xid, client->client_id.mac_addr); ++ r = dhcp_network_bind_raw_socket(client->index, &client->link, ++ client->xid, client->mac_addr, ++ client->mac_addr_len, client->arp_type); + if (r < 0) { + client_stop(client, r); + return 0; +@@ -1331,6 +1358,9 @@ static int client_receive_message_udp(sd_event_source *s, int fd, + sd_dhcp_client *client = userdata; + _cleanup_free_ DHCPMessage *message = NULL; + int buflen = 0, len, r; ++ const struct ether_addr zero_mac = { { 0, 0, 0, 0, 0, 0 } }; ++ const struct ether_addr *expected_chaddr = NULL; ++ uint8_t expected_hlen = 0; + + assert(s); + assert(client); +@@ -1367,13 +1397,26 @@ static int client_receive_message_udp(sd_event_source *s, int fd, + return 0; + } + +- if (message->htype != ARPHRD_ETHER || message->hlen != ETHER_ADDR_LEN) { +- log_dhcp_client(client, "not an ethernet packet"); ++ if (message->htype != client->arp_type) { ++ log_dhcp_client(client, "packet type does not match client type"); ++ return 0; ++ } ++ ++ if (client->arp_type == ARPHRD_ETHER) { ++ expected_hlen = ETH_ALEN; ++ expected_chaddr = (const struct ether_addr *) &client->mac_addr; ++ } else { ++ /* Non-ethernet links expect zero chaddr */ ++ expected_hlen = 0; ++ expected_chaddr = &zero_mac; ++ } ++ ++ if (message->hlen != expected_hlen) { ++ log_dhcp_client(client, "unexpected packet hlen %d", message->hlen); + return 0; + } + +- if (memcmp(&message->chaddr[0], &client->client_id.mac_addr, +- ETH_ALEN)) { ++ if (memcmp(&message->chaddr[0], expected_chaddr, ETH_ALEN)) { + log_dhcp_client(client, "received chaddr does not match " + "expected: ignoring"); + return 0; +@@ -1455,7 +1498,6 @@ static int client_receive_message_raw(sd_event_source *s, int fd, + } + + int sd_dhcp_client_start(sd_dhcp_client *client) { +- char buffer[ETHER_ADDR_TO_STRING_MAX]; + int r; + + assert_return(client, -EINVAL); +@@ -1469,9 +1511,7 @@ int sd_dhcp_client_start(sd_dhcp_client *client) { + + r = client_start(client); + if (r >= 0) +- log_dhcp_client(client, "STARTED on ifindex %u with address %s", +- client->index, +- ether_addr_to_string(&client->client_id.mac_addr, buffer)); ++ log_dhcp_client(client, "STARTED on ifindex %u", client->index); + + return r; + } +diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c +index a6d6178e72..24fedd2375 100644 +--- a/src/libsystemd-network/sd-dhcp-server.c ++++ b/src/libsystemd-network/sd-dhcp-server.c +@@ -392,8 +392,8 @@ static int server_message_init(sd_dhcp_server *server, DHCPPacket **ret, + return -ENOMEM; + + r = dhcp_message_init(&packet->dhcp, BOOTREPLY, +- be32toh(req->message->xid), type, req->max_optlen, +- &optoffset); ++ be32toh(req->message->xid), type, ARPHRD_ETHER, ++ req->max_optlen, &optoffset); + if (r < 0) + return r; + +@@ -513,8 +513,8 @@ static int server_send_forcerenew(sd_dhcp_server *server, be32_t address, + return -ENOMEM; + + r = dhcp_message_init(&packet->dhcp, BOOTREPLY, 0, +- DHCP_FORCERENEW, DHCP_MIN_OPTIONS_SIZE, +- &optoffset); ++ DHCP_FORCERENEW, ARPHRD_ETHER, ++ DHCP_MIN_OPTIONS_SIZE, &optoffset); + if (r < 0) + return r; + +diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c +index 6ea68c915f..fa4f9b5dc2 100644 +--- a/src/libsystemd-network/sd-dhcp6-client.c ++++ b/src/libsystemd-network/sd-dhcp6-client.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include "udev.h" + #include "udev-util.h" +@@ -44,6 +45,8 @@ + */ + #define MAX_DUID_LEN 128 + ++#define MAX_MAC_ADDR_LEN INFINIBAND_ALEN ++ + struct sd_dhcp6_client { + RefCount n_ref; + +@@ -51,7 +54,9 @@ struct sd_dhcp6_client { + sd_event *event; + int event_priority; + int index; +- struct ether_addr mac_addr; ++ uint8_t mac_addr[MAX_MAC_ADDR_LEN]; ++ size_t mac_addr_len; ++ uint16_t arp_type; + DHCP6IA ia_na; + be32_t transaction_id; + usec_t transaction_start; +@@ -160,15 +165,28 @@ int sd_dhcp6_client_set_index(sd_dhcp6_client *client, int interface_index) + return 0; + } + +-int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, +- const struct ether_addr *mac_addr) ++int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, const uint8_t *addr, ++ size_t addr_len, uint16_t arp_type) + { + assert_return(client, -EINVAL); +- +- if (mac_addr) +- memcpy(&client->mac_addr, mac_addr, sizeof(client->mac_addr)); ++ assert_return(addr, -EINVAL); ++ assert_return(addr_len > 0 && addr_len <= MAX_MAC_ADDR_LEN, -EINVAL); ++ assert_return(arp_type > 0, -EINVAL); ++ ++ if (arp_type == ARPHRD_ETHER) ++ assert_return(addr_len == ETH_ALEN, -EINVAL); ++ else if (arp_type == ARPHRD_INFINIBAND) ++ assert_return(addr_len == INFINIBAND_ALEN, -EINVAL); + else +- memset(&client->mac_addr, 0x00, sizeof(client->mac_addr)); ++ return -EINVAL; ++ ++ if (client->mac_addr_len == addr_len && ++ memcmp(&client->mac_addr, addr, addr_len) == 0) ++ return 0; ++ ++ memcpy(&client->mac_addr, addr, addr_len); ++ client->mac_addr_len = addr_len; ++ client->arp_type = arp_type; + + return 0; + } +@@ -646,8 +664,8 @@ static int client_ensure_iaid(sd_dhcp6_client *client) { + siphash24((uint8_t*)&id, name, strlen(name), HASH_KEY.bytes); + else + /* fall back to mac address if no predictable name available */ +- siphash24((uint8_t*)&id, &client->mac_addr, ETH_ALEN, +- HASH_KEY.bytes); ++ siphash24((uint8_t*)&id, &client->mac_addr, ++ client->mac_addr_len, HASH_KEY.bytes); + + /* fold into 32 bits */ + client->ia_na.id = (id & 0xffffffff) ^ (id >> 32); +diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c +index c48aa04b8d..7dab97de2f 100644 +--- a/src/libsystemd-network/test-dhcp-client.c ++++ b/src/libsystemd-network/test-dhcp-client.c +@@ -196,7 +196,9 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, + return 575; + } + +-int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, uint32_t id, struct ether_addr mac) ++int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link, ++ uint32_t id, const uint8_t *addr, ++ size_t addr_len, uint16_t arp_type) + { + if (socketpair(AF_UNIX, SOCK_STREAM, 0, test_fd) < 0) + return -errno; +@@ -244,7 +246,10 @@ static void test_discover_message(sd_event *e) + assert_se(r >= 0); + + assert_se(sd_dhcp_client_set_index(client, 42) >= 0); +- assert_se(sd_dhcp_client_set_mac(client, &mac_addr) >= 0); ++ assert_se(sd_dhcp_client_set_mac(client, ++ (const uint8_t *) &mac_addr, ++ sizeof (mac_addr), ++ ARPHRD_ETHER) >= 0); + + assert_se(sd_dhcp_client_set_request_option(client, 248) >= 0); + +@@ -462,7 +467,10 @@ static void test_addr_acq(sd_event *e) { + assert_se(r >= 0); + + assert_se(sd_dhcp_client_set_index(client, 42) >= 0); +- assert_se(sd_dhcp_client_set_mac(client, &mac_addr) >= 0); ++ assert_se(sd_dhcp_client_set_mac(client, ++ (const uint8_t *) &mac_addr, ++ sizeof (mac_addr), ++ ARPHRD_ETHER) >= 0); + + assert_se(sd_dhcp_client_set_callback(client, test_addr_acq_acquired, e) + >= 0); +diff --git a/src/libsystemd-network/test-dhcp-option.c b/src/libsystemd-network/test-dhcp-option.c +index 63cdc7aa06..eac3844f96 100644 +--- a/src/libsystemd-network/test-dhcp-option.c ++++ b/src/libsystemd-network/test-dhcp-option.c +@@ -92,7 +92,7 @@ static void test_message_init(void) + message = malloc0(len); + + assert_se(dhcp_message_init(message, BOOTREQUEST, 0x12345678, +- DHCP_DISCOVER, optlen, &optoffset) >= 0); ++ DHCP_DISCOVER, ARPHRD_ETHER, optlen, &optoffset) >= 0); + + assert_se(message->xid == htobe32(0x12345678)); + assert_se(message->op == BOOTREQUEST); +diff --git a/src/libsystemd-network/test-dhcp6-client.c b/src/libsystemd-network/test-dhcp6-client.c +index 37ddfc2cfa..26b28a20e8 100644 +--- a/src/libsystemd-network/test-dhcp6-client.c ++++ b/src/libsystemd-network/test-dhcp6-client.c +@@ -66,7 +66,9 @@ static int test_client_basic(sd_event *e) { + assert_se(sd_dhcp6_client_set_index(client, -1) == 0); + assert_se(sd_dhcp6_client_set_index(client, 42) >= 0); + +- assert_se(sd_dhcp6_client_set_mac(client, &mac_addr) >= 0); ++ assert_se(sd_dhcp6_client_set_mac(client, (const uint8_t *) &mac_addr, ++ sizeof (mac_addr), ++ ARPHRD_ETHER) >= 0); + + assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_CLIENTID) == -EINVAL); + assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DNS_SERVERS) == -EEXIST); +@@ -572,7 +574,9 @@ static int test_client_solicit(sd_event *e) { + assert_se(sd_dhcp6_client_attach_event(client, e, 0) >= 0); + + assert_se(sd_dhcp6_client_set_index(client, test_index) == 0); +- assert_se(sd_dhcp6_client_set_mac(client, &mac_addr) >= 0); ++ assert_se(sd_dhcp6_client_set_mac(client, (const uint8_t *) &mac_addr, ++ sizeof (mac_addr), ++ ARPHRD_ETHER) >= 0); + + assert_se(sd_dhcp6_client_set_callback(client, + test_client_solicit_cb, e) >= 0); +diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c +index e451af8643..63bfa86f99 100644 +--- a/src/network/networkd-dhcp4.c ++++ b/src/network/networkd-dhcp4.c +@@ -599,7 +599,9 @@ int dhcp4_configure(Link *link) { + if (r < 0) + return r; + +- r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac); ++ r = sd_dhcp_client_set_mac(link->dhcp_client, ++ (const uint8_t *) &link->mac, ++ sizeof (link->mac), ARPHRD_ETHER); + if (r < 0) + return r; + +diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c +index dcbe38a90a..c6e173fbc6 100644 +--- a/src/network/networkd-link.c ++++ b/src/network/networkd-link.c +@@ -909,7 +909,9 @@ static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) { + return; + } + +- r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac); ++ r = sd_dhcp6_client_set_mac(link->dhcp6_client, ++ (const uint8_t *) &link->mac, ++ sizeof (link->mac), ARPHRD_ETHER); + if (r < 0) { + link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client); + return; +@@ -1647,7 +1649,9 @@ int link_update(Link *link, sd_rtnl_message *m) { + + if (link->dhcp_client) { + r = sd_dhcp_client_set_mac(link->dhcp_client, +- &link->mac); ++ (const uint8_t *) &link->mac, ++ sizeof (link->mac), ++ ARPHRD_ETHER); + if (r < 0) { + log_warning_link(link, + "Could not update MAC address in DHCP client: %s", +@@ -1658,7 +1662,9 @@ int link_update(Link *link, sd_rtnl_message *m) { + + if (link->dhcp6_client) { + r = sd_dhcp6_client_set_mac(link->dhcp6_client, +- &link->mac); ++ (const uint8_t *) &link->mac, ++ sizeof (link->mac), ++ ARPHRD_ETHER); + if (r < 0) { + log_warning_link(link, + "Could not update MAC address in DHCPv6 client: %s", +diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h +index 98c67829b7..7416f82193 100644 +--- a/src/systemd/sd-dhcp-client.h ++++ b/src/systemd/sd-dhcp-client.h +@@ -49,8 +49,8 @@ int sd_dhcp_client_set_request_address(sd_dhcp_client *client, + const struct in_addr *last_address); + int sd_dhcp_client_set_request_broadcast(sd_dhcp_client *client, int broadcast); + int sd_dhcp_client_set_index(sd_dhcp_client *client, int interface_index); +-int sd_dhcp_client_set_mac(sd_dhcp_client *client, +- const struct ether_addr *addr); ++int sd_dhcp_client_set_mac(sd_dhcp_client *client, const uint8_t *addr, ++ size_t addr_len, uint16_t arp_type); + int sd_dhcp_client_set_mtu(sd_dhcp_client *client, uint32_t mtu); + int sd_dhcp_client_set_hostname(sd_dhcp_client *client, const char *hostname); + int sd_dhcp_client_set_vendor_class_identifier(sd_dhcp_client *client, const char *vci); +diff --git a/src/systemd/sd-dhcp6-client.h b/src/systemd/sd-dhcp6-client.h +index a4409e8d4e..c7f168fe21 100644 +--- a/src/systemd/sd-dhcp6-client.h ++++ b/src/systemd/sd-dhcp6-client.h +@@ -43,8 +43,8 @@ int sd_dhcp6_client_set_callback(sd_dhcp6_client *client, + sd_dhcp6_client_cb_t cb, void *userdata); + + int sd_dhcp6_client_set_index(sd_dhcp6_client *client, int interface_index); +-int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, +- const struct ether_addr *mac_addr); ++int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, const uint8_t *addr, ++ size_t addr_len, uint16_t arp_type); + int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint16_t type, uint8_t *duid, + size_t duid_len); + int sd_dhcp6_client_set_request_option(sd_dhcp6_client *client, diff --git a/0581-terminal-grdrm-force-deep-modeset-on-enter.patch b/0581-terminal-grdrm-force-deep-modeset-on-enter.patch new file mode 100644 index 0000000..0aff9cb --- /dev/null +++ b/0581-terminal-grdrm-force-deep-modeset-on-enter.patch @@ -0,0 +1,46 @@ +From f08f302732c0597c83ec6b8022aa82faffb116f9 Mon Sep 17 00:00:00 2001 +From: David Herrmann +Date: Sat, 11 Oct 2014 18:49:20 +0200 +Subject: [PATCH] terminal/grdrm: force deep modeset on enter + +Usually, when our session is activated (or re-configurated) we should be +able to try a page-flip to our buffer. The kernel driver should reject it +if it is incompatible. As it turns out, drivers don't do this. Therefore, +we now force a deep modeset if we're not sure what mode is set. + +This has the side-effect that we might get glitches on session-switches +(depending on driver behavior). However, there's no way around this and it +is what everyone does so far. Most drivers still detect if we keep the +mode and so don't touch the clocks. Therefore, we just get a regular async +flip. +--- + src/libsystemd-terminal/grdev-drm.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c +index 232321c0e2..dba6db2691 100644 +--- a/src/libsystemd-terminal/grdev-drm.c ++++ b/src/libsystemd-terminal/grdev-drm.c +@@ -1158,8 +1158,21 @@ static int grdrm_crtc_commit_flip(grdrm_crtc *crtc, grdev_fb *basefb) { + assert(basefb); + assert(pipe); + +- if (!crtc->applied && !grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode)) ++ if (!crtc->applied) { ++ if (!grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode)) ++ return 0; ++ ++ /* TODO: Theoretically, we should be able to page-flip to our ++ * framebuffer here. We didn't perform any deep modeset, but the ++ * DRM driver is really supposed to reject our page-flip in case ++ * the FB is not compatible. We then properly fall back to a ++ * deep modeset. ++ * As it turns out, drivers don't to this. Therefore, we need to ++ * perform a full modeset on enter now. We might avoid this in ++ * the future with fixed drivers.. */ ++ + return 0; ++ } + + fb = fb_from_base(basefb); + diff --git a/0582-NEWS-don-t-mention-noinst_-debug-programs.patch b/0582-NEWS-don-t-mention-noinst_-debug-programs.patch new file mode 100644 index 0000000..3847999 --- /dev/null +++ b/0582-NEWS-don-t-mention-noinst_-debug-programs.patch @@ -0,0 +1,31 @@ +From 4623e36006c1428e876c9a326b43f713cfec658e Mon Sep 17 00:00:00 2001 +From: David Herrmann +Date: Sat, 11 Oct 2014 18:53:26 +0200 +Subject: [PATCH] NEWS: don't mention noinst_* debug programs + +systemd-evcat and systemd-modeset are not installed systemd wide and +should really just be used by developers to test the libsystemd-terminal +features. No reason to mention it in NEWS.. despite the undulating +rainbows.. +--- + NEWS | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/NEWS b/NEWS +index 6d93787bf8..c18ceaac5e 100644 +--- a/NEWS ++++ b/NEWS +@@ -37,13 +37,6 @@ CHANGES WITH 217: + generator will parse the resume= option on the kernel + command-line to trigger resume. + +- * systemd-evcat input debugging tool has been added. It will +- print keys read for the input system and show modifier +- status. +- +- * systemd-modeset graphics debugging tool will show undulating +- rainbows on all connected displays. +- + * A user console daemon systemd-consoled has been added. It is + a preview, and will so far open a single terminal on each + session of the user marked as Desktop=SYSTEMD-CONSOLE. diff --git a/0583-Modernization.patch b/0583-Modernization.patch new file mode 100644 index 0000000..6d4819d --- /dev/null +++ b/0583-Modernization.patch @@ -0,0 +1,90 @@ +From b1389b0d0805392570085acc7cb10eafcf885405 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Sat, 11 Oct 2014 11:37:37 -0400 +Subject: [PATCH] Modernization + +--- + src/core/load-fragment.c | 14 ++++++-------- + src/journal/journald-server.c | 5 ++--- + 2 files changed, 8 insertions(+), 11 deletions(-) + +diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c +index 0620882b4e..6b6f9908b5 100644 +--- a/src/core/load-fragment.c ++++ b/src/core/load-fragment.c +@@ -288,7 +288,8 @@ int config_parse_socket_listen(const char *unit, + void *data, + void *userdata) { + +- SocketPort *p, *tail; ++ _cleanup_free_ SocketPort *p = NULL; ++ SocketPort *tail; + Socket *s; + int r; + +@@ -315,10 +316,9 @@ int config_parse_socket_listen(const char *unit, + r = unit_full_printf(UNIT(s), rvalue, &p->path); + if (r < 0) { + p->path = strdup(rvalue); +- if (!p->path) { +- free(p); ++ if (!p->path) + return log_oom(); +- } else ++ else + log_syntax(unit, LOG_ERR, filename, line, -r, + "Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r)); + } +@@ -334,11 +334,10 @@ int config_parse_socket_listen(const char *unit, + log_syntax(unit, LOG_ERR, filename, line, -r, + "Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r)); + +- r = socket_address_parse_netlink(&p->address, k ? k : rvalue); ++ r = socket_address_parse_netlink(&p->address, k ?: rvalue); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, -r, + "Failed to parse address value, ignoring: %s", rvalue); +- free(p); + return 0; + } + +@@ -355,7 +354,6 @@ int config_parse_socket_listen(const char *unit, + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, -r, + "Failed to parse address value, ignoring: %s", rvalue); +- free(p); + return 0; + } + +@@ -371,7 +369,6 @@ int config_parse_socket_listen(const char *unit, + if (socket_address_family(&p->address) != AF_LOCAL && p->address.type == SOCK_SEQPACKET) { + log_syntax(unit, LOG_ERR, filename, line, ENOTSUP, + "Address family not supported, ignoring: %s", rvalue); +- free(p); + return 0; + } + } +@@ -384,6 +381,7 @@ int config_parse_socket_listen(const char *unit, + LIST_INSERT_AFTER(port, s->ports, tail, p); + } else + LIST_PREPEND(port, s->ports, p); ++ p = NULL; + + return 0; + } +diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c +index 3df7416397..52111f75a0 100644 +--- a/src/journal/journald-server.c ++++ b/src/journal/journald-server.c +@@ -1475,9 +1475,8 @@ int server_init(Server *s) { + server_parse_config_file(s); + server_parse_proc_cmdline(s); + if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) { +- log_debug("Setting both rate limit interval and burst from %llu,%u to 0,0", +- (long long unsigned) s->rate_limit_interval, +- s->rate_limit_burst); ++ log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0", ++ s->rate_limit_interval, s->rate_limit_burst); + s->rate_limit_interval = s->rate_limit_burst = 0; + } + diff --git a/0584-Set-NOTIFY_SOCKET-for-control-procs-if-NotifyAccess-.patch b/0584-Set-NOTIFY_SOCKET-for-control-procs-if-NotifyAccess-.patch new file mode 100644 index 0000000..38685aa --- /dev/null +++ b/0584-Set-NOTIFY_SOCKET-for-control-procs-if-NotifyAccess-.patch @@ -0,0 +1,108 @@ +From a158dbf156acc8899806fe07daa295464e82b52b Mon Sep 17 00:00:00 2001 +From: Brandon L Black +Date: Sat, 11 Oct 2014 23:36:06 +0000 +Subject: [PATCH] Set $NOTIFY_SOCKET for control procs if NotifyAccess=all + +--- + TODO | 2 -- + src/core/service.c | 11 +---------- + 2 files changed, 1 insertion(+), 12 deletions(-) + +diff --git a/TODO b/TODO +index 69ed60eaff..05a61a3953 100644 +--- a/TODO ++++ b/TODO +@@ -167,8 +167,6 @@ Features: + + * journalctl: add the ability to look for the most recent process of a binary. journalctl /usr/bin/X11 --pid=-1 or so... + +-* set NOTIFY_SOCKET also for control processes +- + * mount_cgroup_controllers(): symlinks need to get the label applied + + * For timer units: add some mechanisms so that timer units that trigger immediately on boot do not have the services +diff --git a/src/core/service.c b/src/core/service.c +index f551061366..76763441b0 100644 +--- a/src/core/service.c ++++ b/src/core/service.c +@@ -883,7 +883,6 @@ static int service_spawn( + bool apply_permissions, + bool apply_chroot, + bool apply_tty_stdin, +- bool set_notify_socket, + bool is_control, + pid_t *_pid) { + +@@ -948,7 +947,7 @@ static int service_spawn( + goto fail; + } + +- if (set_notify_socket) ++ if (is_control ? s->notify_access == NOTIFY_ALL : s->notify_access != NOTIFY_NONE) + if (asprintf(our_env + n_env++, "NOTIFY_SOCKET=%s", UNIT(s)->manager->notify_socket) < 0) { + r = -ENOMEM; + goto fail; +@@ -1153,7 +1152,6 @@ static void service_enter_stop_post(Service *s, ServiceResult f) { + !s->permissions_start_only, + !s->root_directory_start_only, + true, +- false, + true, + &s->control_pid); + if (r < 0) +@@ -1253,7 +1251,6 @@ static void service_enter_stop(Service *s, ServiceResult f) { + !s->permissions_start_only, + !s->root_directory_start_only, + false, +- false, + true, + &s->control_pid); + if (r < 0) +@@ -1316,7 +1313,6 @@ static void service_enter_start_post(Service *s) { + !s->permissions_start_only, + !s->root_directory_start_only, + false, +- false, + true, + &s->control_pid); + if (r < 0) +@@ -1383,7 +1379,6 @@ static void service_enter_start(Service *s) { + true, + true, + true, +- s->notify_access != NOTIFY_NONE, + false, + &pid); + if (r < 0) +@@ -1449,7 +1444,6 @@ static void service_enter_start_pre(Service *s) { + !s->permissions_start_only, + !s->root_directory_start_only, + true, +- false, + true, + &s->control_pid); + if (r < 0) +@@ -1530,7 +1524,6 @@ static void service_enter_reload(Service *s) { + !s->permissions_start_only, + !s->root_directory_start_only, + false, +- false, + true, + &s->control_pid); + if (r < 0) +@@ -1568,7 +1561,6 @@ static void service_run_next_control(Service *s) { + !s->root_directory_start_only, + s->control_command_id == SERVICE_EXEC_START_PRE || + s->control_command_id == SERVICE_EXEC_STOP_POST, +- false, + true, + &s->control_pid); + if (r < 0) +@@ -1611,7 +1603,6 @@ static void service_run_next_main(Service *s) { + true, + true, + true, +- s->notify_access != NOTIFY_NONE, + false, + &pid); + if (r < 0) diff --git a/0585-tests-fix-some-tests-to-pass-in-koji.patch b/0585-tests-fix-some-tests-to-pass-in-koji.patch new file mode 100644 index 0000000..ca9637a --- /dev/null +++ b/0585-tests-fix-some-tests-to-pass-in-koji.patch @@ -0,0 +1,98 @@ +From 8d1d1bf20a1a6175decff979f6b95d831e0b3fc8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Sun, 12 Oct 2014 16:05:49 -0400 +Subject: [PATCH] tests: fix some tests to pass in koji + +FAIL: test-engine +================= +Cannot find cgroup mount point: No such file or directory +Assertion 'r >= 0' failed at ../src/test/test-engine.c:46, function main(). Aborting. + +FAIL: test-sched-prio +===================== +Cannot find cgroup mount point: No such file or directory +Assertion 'r >= 0' failed at ../src/test/test-sched-prio.c:42, function main(). Aborting. + +FAIL: test-bus-cleanup +====================== +Assertion 'sd_bus_open_system(&bus) >= 0' failed at ../src/libsystemd/sd-bus/test-bus-cleanup.c:40, function test_bus_open(). Aborting. +after new: refcount 1 +--- + src/libsystemd/sd-bus/test-bus-cleanup.c | 22 +++++++++++++++++++--- + src/test/test-engine.c | 2 +- + src/test/test-sched-prio.c | 2 +- + 3 files changed, 21 insertions(+), 5 deletions(-) + +diff --git a/src/libsystemd/sd-bus/test-bus-cleanup.c b/src/libsystemd/sd-bus/test-bus-cleanup.c +index e36a69f0d1..f586880593 100644 +--- a/src/libsystemd/sd-bus/test-bus-cleanup.c ++++ b/src/libsystemd/sd-bus/test-bus-cleanup.c +@@ -34,11 +34,18 @@ static void test_bus_new(void) { + printf("after new: refcount %u\n", REFCNT_GET(bus->n_ref)); + } + +-static void test_bus_open(void) { ++static int test_bus_open(void) { + _cleanup_bus_unref_ sd_bus *bus = NULL; ++ int r; + +- assert_se(sd_bus_open_system(&bus) >= 0); ++ r = sd_bus_open_system(&bus); ++ if (r == -ECONNREFUSED || r == -ENOENT) ++ return r; ++ ++ assert_se(r >= 0); + printf("after open: refcount %u\n", REFCNT_GET(bus->n_ref)); ++ ++ return 0; + } + + static void test_bus_new_method_call(void) { +@@ -70,11 +77,20 @@ static void test_bus_new_signal(void) { + } + + int main(int argc, char **argv) { ++ int r; ++ + log_parse_environment(); + log_open(); + + test_bus_new(); +- test_bus_open(); ++ r = test_bus_open(); ++ if (r < 0) { ++ log_info("Failed to connect to bus, skipping tests."); ++ return EXIT_TEST_SKIP; ++ } ++ + test_bus_new_method_call(); + test_bus_new_signal(); ++ ++ return EXIT_SUCCESS; + } +diff --git a/src/test/test-engine.c b/src/test/test-engine.c +index 1b71416a04..6acd394c67 100644 +--- a/src/test/test-engine.c ++++ b/src/test/test-engine.c +@@ -39,7 +39,7 @@ int main(int argc, char *argv[]) { + /* prepare the test */ + assert_se(set_unit_path(TEST_DIR) >= 0); + r = manager_new(SYSTEMD_USER, true, &m); +- if (r == -EPERM || r == -EACCES || r == -EADDRINUSE || r == -EHOSTDOWN) { ++ if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT)) { + printf("Skipping test: manager_new: %s", strerror(-r)); + return EXIT_TEST_SKIP; + } +diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c +index 2f559b0413..6b3128d3b7 100644 +--- a/src/test/test-sched-prio.c ++++ b/src/test/test-sched-prio.c +@@ -35,7 +35,7 @@ int main(int argc, char *argv[]) { + /* prepare the test */ + assert_se(set_unit_path(TEST_DIR) >= 0); + r = manager_new(SYSTEMD_USER, true, &m); +- if (r == -EPERM || r == -EACCES || r == -EADDRINUSE || r == -EHOSTDOWN) { ++ if (IN_SET(r, -EPERM, -EACCES, -EADDRINUSE, -EHOSTDOWN, -ENOENT)) { + printf("Skipping test: manager_new: %s", strerror(-r)); + return EXIT_TEST_SKIP; + } diff --git a/0586-man-join-tables-in-systemd-detect-virt-1.patch b/0586-man-join-tables-in-systemd-detect-virt-1.patch new file mode 100644 index 0000000..a2a93b3 --- /dev/null +++ b/0586-man-join-tables-in-systemd-detect-virt-1.patch @@ -0,0 +1,87 @@ +From 654c2d478f50ffbb367dbdc3745f795fcc34574b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Sun, 12 Oct 2014 17:27:53 -0500 +Subject: [PATCH] man: join tables in systemd-detect-virt(1) + +I think it is more readable and nicer if everything is in +one table. + +Also, describe what the return value, since it seems awkward to +describe the change in behaviour with --quiet before describing +what the default is. +--- + man/systemd-detect-virt.xml | 37 +++++++++++++++++-------------------- + 1 file changed, 17 insertions(+), 20 deletions(-) + +diff --git a/man/systemd-detect-virt.xml b/man/systemd-detect-virt.xml +index eed0fe0ce9..d8e881cf2e 100644 +--- a/man/systemd-detect-virt.xml ++++ b/man/systemd-detect-virt.xml +@@ -61,7 +61,14 @@ + execution in a virtualized environment. It identifies + the virtualization technology and can distinguish full + VM virtualization from container +- virtualization. ++ virtualization. systemd-detect-virt ++ exits with a return value of 0 (success) if a ++ virtualization technology is detected, and non-zero ++ (error) otherwise. By default any type of ++ virtualization is detected, and the options ++ and ++ can be used to limit what types of virtualization are ++ detected. + + When executed without + will print a short identifier for the detected +@@ -69,18 +76,23 @@ + are currently identified: + + +- Known VM virtualization technologies (i.e. full hardware virtualization) +- ++ Known virtualization technologies (both ++ VM, i.e. full hardware virtualization, ++ and container, i.e. shared kernel virtualization) ++ ++ + + + + ++ Type + ID +- VM Product ++ Product + + + + ++ VM + qemu + QEMU software virtualization + +@@ -125,23 +137,8 @@ + User-mode Linux + + +- +- +-
+- +- +- Known container virtualization technologies (i.e. shared kernel virtualization) +- +- +- +- +- +- ID +- Container Product +- +- +- + ++ container + openvz + OpenVZ/Virtuozzo + diff --git a/0587-tmpfiles-compare-return-against-correct-errno.patch b/0587-tmpfiles-compare-return-against-correct-errno.patch new file mode 100644 index 0000000..a6e09b0 --- /dev/null +++ b/0587-tmpfiles-compare-return-against-correct-errno.patch @@ -0,0 +1,23 @@ +From e7aab5412829ed6b50d109f670bd0b1b365838a7 Mon Sep 17 00:00:00 2001 +From: Dave Reisner +Date: Sat, 11 Oct 2014 20:35:06 -0400 +Subject: [PATCH] tmpfiles: compare return against correct errno + +name_to_handle_at returns -EOPNOTSUPP, not -ENOTSUP. +--- + src/tmpfiles/tmpfiles.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c +index dafb9aee2f..8108b43042 100644 +--- a/src/tmpfiles/tmpfiles.c ++++ b/src/tmpfiles/tmpfiles.c +@@ -259,7 +259,7 @@ static int dir_is_mount_point(DIR *d, const char *subdir) { + + /* got only one handle; assume different mount points if one + * of both queries was not supported by the filesystem */ +- if (r_p == -ENOSYS || r_p == -ENOTSUP || r == -ENOSYS || r == -ENOTSUP) ++ if (r_p == -ENOSYS || r_p == -EOPNOTSUPP || r == -ENOSYS || r == -EOPNOTSUPP) + return true; + + /* return error */ diff --git a/0588-test-dhcp-client-add-more-asserts.patch b/0588-test-dhcp-client-add-more-asserts.patch new file mode 100644 index 0000000..937889e --- /dev/null +++ b/0588-test-dhcp-client-add-more-asserts.patch @@ -0,0 +1,29 @@ +From fc292b5f5854f83379301affe97d909c7c18d702 Mon Sep 17 00:00:00 2001 +From: Tom Gundersen +Date: Mon, 13 Oct 2014 10:07:05 +0200 +Subject: [PATCH] test-dhcp-client: add more asserts + +--- + src/libsystemd-network/test-dhcp-client.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c +index 7dab97de2f..0515440e4e 100644 +--- a/src/libsystemd-network/test-dhcp-client.c ++++ b/src/libsystemd-network/test-dhcp-client.c +@@ -485,12 +485,12 @@ static void test_addr_acq(sd_event *e) { + res = sd_dhcp_client_start(client); + assert_se(res == 0 || res == -EINPROGRESS); + +- sd_event_loop(e); ++ assert_se(sd_event_loop(e) >= 0); + + test_hangcheck = sd_event_source_unref(test_hangcheck); + +- sd_dhcp_client_set_callback(client, NULL, NULL); +- sd_dhcp_client_stop(client); ++ assert_se(sd_dhcp_client_set_callback(client, NULL, NULL) >= 0); ++ assert_se(sd_dhcp_client_stop(client) >= 0); + sd_dhcp_client_unref(client); + + test_fd[1] = safe_close(test_fd[1]); diff --git a/0589-fi-latin1-console-keymap-is-no-more.patch b/0589-fi-latin1-console-keymap-is-no-more.patch new file mode 100644 index 0000000..1361a25 --- /dev/null +++ b/0589-fi-latin1-console-keymap-is-no-more.patch @@ -0,0 +1,22 @@ +From 70ae006b4380ed6a72211ff8aa70aac2ff381a42 Mon Sep 17 00:00:00 2001 +From: Marko Myllynen +Date: Mon, 13 Oct 2014 10:45:00 +0300 +Subject: [PATCH] fi-latin1 console keymap is no more + +http://git.altlinux.org/people/legion/packages/kbd.git?p=kbd.git;a=commitdiff;h=a88711232f3216debbb02d0171187442863ccedb +--- + src/locale/kbd-model-map | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/src/locale/kbd-model-map b/src/locale/kbd-model-map +index 322c0a9bc2..f39d991179 100644 +--- a/src/locale/kbd-model-map ++++ b/src/locale/kbd-model-map +@@ -16,7 +16,6 @@ slovene si pc105 - terminate:ctrl_alt_bksp + hu101 hu pc105 qwerty terminate:ctrl_alt_bksp + jp106 jp jp106 - terminate:ctrl_alt_bksp + croat hr pc105 - terminate:ctrl_alt_bksp +-fi-latin1 fi pc105 - terminate:ctrl_alt_bksp + it2 it pc105 - terminate:ctrl_alt_bksp + hu hu pc105 - terminate:ctrl_alt_bksp + sr-latin rs pc105 latin terminate:ctrl_alt_bksp diff --git a/systemd.spec b/systemd.spec index 797e8bf..25d821f 100644 --- a/systemd.spec +++ b/systemd.spec @@ -616,6 +616,19 @@ Patch0574: 0574-man-reference-table-in-systemd-detect-virt-1-from-Co.patch Patch0575: 0575-kdbus-fix-buffer-overflow-in-bus_get_owner_kdbus-fun.patch Patch0576: 0576-fstab-generator-Honor-mount.usr-on-kernel-command-li.patch Patch0577: 0577-mount-setup-skip-relabelling-when-SELinux-and-SMACK-.patch +Patch0578: 0578-bus-proxyd-fix-compatibility-with-old-dbus-1.patch +Patch0579: 0579-Report-aa_change_onexec-error-code.patch +Patch0580: 0580-sd-dhcp-client-support-non-Ethernet-hardware-address.patch +Patch0581: 0581-terminal-grdrm-force-deep-modeset-on-enter.patch +Patch0582: 0582-NEWS-don-t-mention-noinst_-debug-programs.patch +Patch0583: 0583-Modernization.patch +Patch0584: 0584-Set-NOTIFY_SOCKET-for-control-procs-if-NotifyAccess-.patch +Patch0585: 0585-tests-fix-some-tests-to-pass-in-koji.patch +Patch0586: 0586-man-join-tables-in-systemd-detect-virt-1.patch +Patch0587: 0587-tmpfiles-compare-return-against-correct-errno.patch +Patch0588: 0588-test-dhcp-client-add-more-asserts.patch +Patch0589: 0589-fi-latin1-console-keymap-is-no-more.patch + Patch0998: fedora-disable-resolv.conf-symlink.patch Patch0999: fedora-add-bridge-sysctl-configuration.patch