[systemd-commits] 4 commits - src/bootchart src/core src/journal src/libsystemd src/shared
Zbigniew Jędrzejewski-Szmek
zbyszek at kemper.freedesktop.org
Mon Mar 9 19:27:43 PDT 2015
src/bootchart/bootchart.c | 14 +++++++-------
src/core/automount.c | 10 +++-------
src/core/machine-id-setup.c | 15 +++++++--------
src/journal/compress.c | 25 ++++++++++---------------
src/journal/journalctl.c | 8 +++-----
src/libsystemd/sd-id128/sd-id128.c | 27 ++++++++++-----------------
src/shared/audit.h | 2 ++
src/shared/efivars.c | 2 +-
src/shared/log.h | 1 +
src/shared/logs-show.c | 4 ++--
src/shared/util.c | 28 ++++++++++++++++------------
src/shared/util.h | 1 +
12 files changed, 63 insertions(+), 74 deletions(-)
New commits:
commit a6dcc7e5924f9c27d3e9c6560a448b02ec28b65f
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 21:23:53 2015 -0400
Introduce loop_read_exact helper
Usually when using loop_read(), we want to read the full buffer.
Add a helper that mirrors loop_write(), and returns 0 when full buffer
was read, and an error otherwise.
Use -ENODATA for the short read, to distinguish it from a read error.
diff --git a/src/core/automount.c b/src/core/automount.c
index 0539fbb..cec90cb 100644
--- a/src/core/automount.c
+++ b/src/core/automount.c
@@ -725,7 +725,6 @@ static bool automount_check_gc(Unit *u) {
static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, void *userdata) {
union autofs_v5_packet_union packet;
Automount *a = AUTOMOUNT(userdata);
- ssize_t l;
int r;
assert(a);
@@ -736,12 +735,9 @@ static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, vo
goto fail;
}
- l = loop_read(a->pipe_fd, &packet, sizeof(packet), true);
- if (l != sizeof(packet)) {
- if (l < 0)
- log_unit_error_errno(UNIT(a)->id, l, "Invalid read from pipe: %m");
- else
- log_unit_error(UNIT(a)->id, "Invalid read from pipe: short read");
+ r = loop_read_exact(a->pipe_fd, &packet, sizeof(packet), true);
+ if (r < 0) {
+ log_unit_error_errno(UNIT(a)->id, r, "Invalid read from pipe: %m");
goto fail;
}
diff --git a/src/core/machine-id-setup.c b/src/core/machine-id-setup.c
index 063f705..623dffd 100644
--- a/src/core/machine-id-setup.c
+++ b/src/core/machine-id-setup.c
@@ -64,7 +64,6 @@ static int generate(char id[34], const char *root) {
unsigned char *p;
sd_id128_t buf;
char *q;
- ssize_t k;
const char *vm_id, *dbus_machine_id;
assert(id);
@@ -77,11 +76,10 @@ static int generate(char id[34], const char *root) {
/* First, try reading the D-Bus machine id, unless it is a symlink */
fd = open(dbus_machine_id, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
if (fd >= 0) {
- k = loop_read(fd, id, 33, false);
+ r = loop_read_exact(fd, id, 33, false);
safe_close(fd);
- if (k == 33 && id[32] == '\n') {
-
+ if (r >= 0 && id[32] == '\n') {
id[32] = 0;
if (id128_is_valid(id)) {
id[32] = '\n';
@@ -119,14 +117,14 @@ static int generate(char id[34], const char *root) {
r = detect_vm(&vm_id);
if (r > 0 && streq(vm_id, "kvm")) {
- char uuid[37];
+ char uuid[36];
fd = open("/sys/class/dmi/id/product_uuid", O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
if (fd >= 0) {
- k = loop_read(fd, uuid, 36, false);
+ r = loop_read_exact(fd, uuid, 36, false);
safe_close(fd);
- if (k >= 36) {
+ if (r >= 0) {
r = shorten_uuid(id, uuid);
if (r >= 0) {
log_info("Initializing machine ID from KVM UUID.");
@@ -162,7 +160,8 @@ static int get_valid_machine_id(int fd, char id[34]) {
assert(fd >= 0);
assert(id);
- if (loop_read(fd, id_to_validate, 33, false) == 33 && id_to_validate[32] == '\n') {
+ if (loop_read_exact(fd, id_to_validate, 33, false) >= 0 &&
+ id_to_validate[32] == '\n') {
id_to_validate[32] = 0;
if (id128_is_valid(id_to_validate)) {
diff --git a/src/journal/compress.c b/src/journal/compress.c
index 4232206..383f6a6 100644
--- a/src/journal/compress.c
+++ b/src/journal/compress.c
@@ -589,14 +589,12 @@ int decompress_stream_lz4(int fdf, int fdt, off_t max_bytes) {
return log_oom();
for (;;) {
- ssize_t n, m;
+ ssize_t m;
int r;
- n = read(fdf, &header, sizeof(header));
- if (n < 0)
- return -errno;
- if (n != sizeof(header))
- return errno ? -errno : -EIO;
+ r = loop_read_exact(fdf, &header, sizeof(header), false);
+ if (r < 0)
+ return r;
m = le32toh(header);
if (m == 0)
@@ -618,12 +616,9 @@ int decompress_stream_lz4(int fdf, int fdt, off_t max_bytes) {
if (!GREEDY_REALLOC(buf, buf_size, m))
return log_oom();
- errno = 0;
- n = loop_read(fdf, buf, m, false);
- if (n < 0)
- return n;
- if (n != m)
- return errno ? -errno : -EIO;
+ r = loop_read_exact(fdf, buf, m, false);
+ if (r < 0)
+ return r;
r = LZ4_decompress_safe_continue(&lz4_data, buf, out, m, 4*LZ4_BUFSIZE);
if (r <= 0)
@@ -636,9 +631,9 @@ int decompress_stream_lz4(int fdf, int fdt, off_t max_bytes) {
return -EFBIG;
}
- n = loop_write(fdt, out, r, false);
- if (n < 0)
- return n;
+ r = loop_write(fdt, out, r, false);
+ if (r < 0)
+ return r;
}
log_debug("LZ4 decompression finished (%zu -> %zu bytes, %.1f%%)",
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index f0f03b0..4d45f5a 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -1286,7 +1286,6 @@ static int setup_keys(void) {
#ifdef HAVE_GCRYPT
size_t mpk_size, seed_size, state_size, i;
uint8_t *mpk, *seed, *state;
- ssize_t l;
int fd = -1, r;
sd_id128_t machine, boot;
char *p = NULL, *k = NULL;
@@ -1351,10 +1350,9 @@ static int setup_keys(void) {
}
log_info("Generating seed...");
- l = loop_read(fd, seed, seed_size, true);
- if (l < 0 || (size_t) l != seed_size) {
- log_error_errno(EIO, "Failed to read random seed: %m");
- r = -EIO;
+ r = loop_read_exact(fd, seed, seed_size, true);
+ if (r < 0) {
+ log_error_errno(r, "Failed to read random seed: %m");
goto finish;
}
diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c
index c876f6e..f0ffedc 100644
--- a/src/libsystemd/sd-id128/sd-id128.c
+++ b/src/libsystemd/sd-id128/sd-id128.c
@@ -108,9 +108,9 @@ _public_ int sd_id128_get_machine(sd_id128_t *ret) {
static thread_local bool saved_machine_id_valid = false;
_cleanup_close_ int fd = -1;
char buf[33];
- ssize_t k;
unsigned j;
sd_id128_t t;
+ int r;
assert_return(ret, -EINVAL);
@@ -123,13 +123,9 @@ _public_ int sd_id128_get_machine(sd_id128_t *ret) {
if (fd < 0)
return -errno;
- k = loop_read(fd, buf, 33, false);
- if (k < 0)
- return (int) k;
-
- if (k != 33)
- return -EIO;
-
+ r = loop_read_exact(fd, buf, 33, false);
+ if (r < 0)
+ return r;
if (buf[32] !='\n')
return -EIO;
@@ -157,10 +153,10 @@ _public_ int sd_id128_get_boot(sd_id128_t *ret) {
static thread_local bool saved_boot_id_valid = false;
_cleanup_close_ int fd = -1;
char buf[36];
- ssize_t k;
unsigned j;
sd_id128_t t;
char *p;
+ int r;
assert_return(ret, -EINVAL);
@@ -173,22 +169,19 @@ _public_ int sd_id128_get_boot(sd_id128_t *ret) {
if (fd < 0)
return -errno;
- k = loop_read(fd, buf, 36, false);
- if (k < 0)
- return (int) k;
-
- if (k != 36)
- return -EIO;
+ r = loop_read_exact(fd, buf, 36, false);
+ if (r < 0)
+ return r;
for (j = 0, p = buf; j < 16; j++) {
int a, b;
- if (p >= buf + k - 1)
+ if (p >= buf + 35)
return -EIO;
if (*p == '-') {
p++;
- if (p >= buf + k - 1)
+ if (p >= buf + 35)
return -EIO;
}
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
index 944d685..d3ee139 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -1163,9 +1163,9 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) {
if (fd < 0)
_exit(EXIT_FAILURE);
- k = loop_read(fd, buf, 36, false);
+ r = loop_read_exact(fd, buf, 36, false);
safe_close(fd);
- if (k != 36)
+ if (k < 0)
_exit(EXIT_FAILURE);
k = send(pair[1], buf, 36, MSG_NOSIGNAL);
diff --git a/src/shared/util.c b/src/shared/util.c
index 74f2994..a13819e 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -2326,6 +2326,17 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
return n;
}
+int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll) {
+ ssize_t n;
+
+ n = loop_read(fd, buf, nbytes, do_poll);
+ if (n < 0)
+ return n;
+ if ((size_t) n != nbytes)
+ return -EIO;
+ return 0;
+}
+
int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
const uint8_t *p = buf;
@@ -2580,8 +2591,9 @@ char* dirname_malloc(const char *path) {
int dev_urandom(void *p, size_t n) {
static int have_syscall = -1;
- int r, fd;
- ssize_t k;
+
+ _cleanup_close_ fd = -1;
+ int r;
/* Gathers some randomness from the kernel. This call will
* never block, and will always return some data from the
@@ -2616,22 +2628,14 @@ int dev_urandom(void *p, size_t n) {
return -errno;
} else
/* too short read? */
- return -EIO;
+ return -ENODATA;
}
fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY);
if (fd < 0)
return errno == ENOENT ? -ENOSYS : -errno;
- k = loop_read(fd, p, n, true);
- safe_close(fd);
-
- if (k < 0)
- return (int) k;
- if ((size_t) k != n)
- return -EIO;
-
- return 0;
+ return loop_read_exact(fd, p, n, true);
}
void initialize_srand(void) {
diff --git a/src/shared/util.h b/src/shared/util.h
index 2de654f..d2da3e2 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -432,6 +432,7 @@ int sigaction_many(const struct sigaction *sa, ...);
int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
+int loop_read_exact(int fd, void *buf, size_t nbytes, bool do_poll);
int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
bool is_device_path(const char *path);
commit ad7bcf526d5ec54838bc9411a0e09a293845a015
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 20:41:00 2015 -0400
efivars: itialize variable
Introduced a few commits ago.
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index d3bec50..20067c6 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -105,7 +105,7 @@ int efi_get_variable(
uint32_t a;
ssize_t n;
struct stat st;
- _cleanup_free_ void *buf;
+ _cleanup_free_ void *buf = NULL;
assert(name);
assert(value);
commit d92f98b4f6750419e40642f647e2c7ce4a9528ed
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 20:11:25 2015 -0400
bootchart: use _cleanup_
diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
index 607ec42..158f8a9 100644
--- a/src/bootchart/bootchart.c
+++ b/src/bootchart/bootchart.c
@@ -268,10 +268,11 @@ static int parse_argv(int argc, char *argv[]) {
static void do_journal_append(char *file) {
struct iovec iovec[5];
- int r, f, j = 0;
+ int r, j = 0;
ssize_t n;
_cleanup_free_ char *bootchart_file = NULL, *bootchart_message = NULL,
*p = NULL;
+ _cleanup_close_ fd = -1;
bootchart_file = strappend("BOOTCHART_FILE=", file);
if (bootchart_file)
@@ -291,18 +292,17 @@ static void do_journal_append(char *file) {
memcpy(p, "BOOTCHART=", 10);
- f = open(file, O_RDONLY|O_CLOEXEC);
- if (f < 0) {
- log_error_errno(errno, "Failed to read bootchart data: %m");
+ fd = open(file, O_RDONLY|O_CLOEXEC);
+ if (fd < 0) {
+ log_error_errno(errno, "Failed to open bootchart data \"%s\": %m", file);
return;
}
- n = loop_read(f, p + 10, BOOTCHART_MAX, false);
+
+ n = loop_read(fd, p + 10, BOOTCHART_MAX, false);
if (n < 0) {
log_error_errno(n, "Failed to read bootchart data: %m");
- close(f);
return;
}
- close(f);
iovec[j].iov_base = p;
iovec[j].iov_len = 10 + n;
commit 6410074b4f8f06a7fce32fa200f6c9f5d97fec45
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 20:02:59 2015 -0400
Add missing includes
audit.h uses uint32_t and bool.
log.h uses abs.
diff --git a/src/shared/audit.h b/src/shared/audit.h
index 7e9c929..781866a 100644
--- a/src/shared/audit.h
+++ b/src/shared/audit.h
@@ -21,6 +21,8 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
+#include <stdint.h>
+#include <stdbool.h>
#include <sys/types.h>
diff --git a/src/shared/log.h b/src/shared/log.h
index 2dedfa3..d6061c0 100644
--- a/src/shared/log.h
+++ b/src/shared/log.h
@@ -23,6 +23,7 @@
#include <stdbool.h>
#include <stdarg.h>
+#include <stdlib.h>
#include <syslog.h>
#include <sys/signalfd.h>
#include <errno.h>
More information about the systemd-commits
mailing list