1
0
mirror of https://github.com/systemd/systemd synced 2025-10-06 20:24:45 +02:00

Compare commits

..

2 Commits

Author SHA1 Message Date
Yu Watanabe
8013beb4a2 Revert "test: skip one test case when running on coverage"
This reverts commit 2cc6c651ee2df408b2cc72c000d7f7f08c8932ac.

The issue was fixed by b955051244ce72ec5879d49e76dbf2b5ea0edeee.

Closes #38163.
2025-07-16 10:50:36 +01:00
Mike Yuan
f11e882721 journalctl: track more closely whether we're within --until= range
Follow-up for 81fb5375b3b3bfc22d023d7908ad9eee4b3c1ffb

The offending commit fails to account for the case where
we have fewer lines before --until= than what's specified
in --lines=. Aside from that, if --grep= + --lines=+N are used,
we might also seek forward in the middle of the loop,
breaking the --until= boundary.

Let's turn the logic around then. Context.until_safe will
be set iff we're certain that there's enough to output,
and it gets reset whenever we seek forward.

Fixes #38121
Replaces #38122
2025-07-16 17:01:25 +09:00
2 changed files with 29 additions and 18 deletions

View File

@ -29,6 +29,7 @@ typedef struct Context {
bool has_cursor; bool has_cursor;
bool need_seek; bool need_seek;
bool since_seeked; bool since_seeked;
bool until_safe;
bool ellipsized; bool ellipsized;
bool previous_boot_id_valid; bool previous_boot_id_valid;
sd_id128_t previous_boot_id; sd_id128_t previous_boot_id;
@ -117,10 +118,15 @@ static int seek_journal(Context *c) {
return log_error_errno(r, "Failed to seek to tail: %m"); return log_error_errno(r, "Failed to seek to tail: %m");
} }
if (arg_reverse) if (arg_reverse) {
r = sd_journal_previous(j); r = sd_journal_previous(j);
else /* arg_lines_needs_seek_end */ c->until_safe = true; /* can't possibly go beyond --until= if --reverse */
} else { /* arg_lines_needs_seek_end() */
r = sd_journal_previous_skip(j, arg_lines); r = sd_journal_previous_skip(j, arg_lines);
c->until_safe = r >= arg_lines; /* We have enough lines to output before --until= is hit.
No need to check timestamp of each journal entry */
}
} else if (arg_since_set) { } else if (arg_since_set) {
/* This is placed after arg_reverse and arg_lines. If --since is used without /* This is placed after arg_reverse and arg_lines. If --since is used without
@ -174,11 +180,10 @@ static int show(Context *c) {
break; break;
} }
if (arg_until_set && !arg_reverse && (arg_lines < 0 || arg_since_set || c->has_cursor)) { if (arg_until_set && !c->until_safe) {
/* If --lines= is set, we usually rely on the n_shown to tell us when to stop. /* If --lines= is set, we usually rely on the n_shown to tell us when to stop.
* However, if --since= or one of the cursor argument is set too, we may end up * However, in the case where we may have less than --lines= to output let's check
* having less than --lines= to output. In this case let's also check if the entry * whether the individual entries are in range. */
* is in range. */
usec_t usec; usec_t usec;
@ -207,6 +212,11 @@ static int show(Context *c) {
return log_error_errno(r, "Failed to seek to date: %m"); return log_error_errno(r, "Failed to seek to date: %m");
c->since_seeked = true; c->since_seeked = true;
/* We just jumped forward, meaning there might suddenly be less than
* --lines= to show within the --until= range, hence keep a close eye on
* timestamps from now on. */
c->until_safe = false;
c->need_seek = true; c->need_seek = true;
continue; continue;
} }
@ -235,6 +245,12 @@ static int show(Context *c) {
r = sd_journal_get_data(j, "MESSAGE", &message, &len); r = sd_journal_get_data(j, "MESSAGE", &message, &len);
if (r < 0) { if (r < 0) {
if (r == -ENOENT) { if (r == -ENOENT) {
/* We will skip some entries forward, meaning there might suddenly
* be less than --lines= to show within the --until= range, hence
* keep a close eye on timestamps from now on. */
if (!arg_reverse)
c->until_safe = false;
c->need_seek = true; c->need_seek = true;
continue; continue;
} }
@ -249,6 +265,12 @@ static int show(Context *c) {
if (r < 0) if (r < 0)
return r; return r;
if (r == 0) { if (r == 0) {
/* We will skip some entries forward, meaning there might suddenly
* be less than --lines= to show within the --until= range, hence
* keep a close eye on timestamps from now on. */
if (!arg_reverse)
c->until_safe = false;
c->need_seek = true; c->need_seek = true;
continue; continue;
} }

View File

@ -1422,18 +1422,7 @@ testcase_unpriv_dir() {
# Use an image owned by the foreign UID range first via direct mapping, and than via the managed uid logic # Use an image owned by the foreign UID range first via direct mapping, and than via the managed uid logic
systemd-dissect --shift "$root" foreign systemd-dissect --shift "$root" foreign
assert_eq "$(systemd-nspawn --pipe --register=no -D "$root" --private-users=pick --private-users-ownership=foreign bash -c 'echo foobar')" "foobar" assert_eq "$(systemd-nspawn --pipe --register=no -D "$root" --private-users=pick --private-users-ownership=foreign bash -c 'echo foobar')" "foobar"
# FIXME:
# Since 90fa161b5ba29d58953e9f08ddca49121b51efe6, --bind= or Bind= settings for coverage directory does
# not work with managed mode:
# ========
# [ 158.105361] systemd-nspawn[3718]: Failed to open tree and set mount attributes: Operation not permitted
# [ 158.105364] systemd-nspawn[3718]: Failed to clone /coverage: Operation not permitted
# [ 158.118655] systemd-nspawn[3707]: (sd-namespace) failed with exit status 1.
# ========
# Let's tentatively skip the test case when running on coverage.
if [[ -z "${COVERAGE_BUILD_DIR:-}" ]]; then
assert_eq "$(systemd-nspawn --pipe --register=no -D "$root" --private-users=managed --private-network bash -c 'echo foobar')" "foobar" assert_eq "$(systemd-nspawn --pipe --register=no -D "$root" --private-users=managed --private-network bash -c 'echo foobar')" "foobar"
fi
# Test unprivileged operation # Test unprivileged operation
chown testuser:testuser "$root/.." chown testuser:testuser "$root/.."