sd-journal: make sure sd_journal_add_match() also accepts SIZE_MAX as size

In many of our internal functions that take a pointer + a size we have
introduced the rule that SIZE_MAX as size means: take strlen().

sd_journal_add_match() has something similar, but the special value is
0, not SIZE_MAX. This is a bit ugly, since a zero size data block is
theoretically fine. The only reason sd_journal_add_match() gets away
with using this special value is because valid matches must consist of
at least 2 chars, hence cannot be zero.

But let's make this more robust and less surprising when compared to the
rest of our code, and *also* accept SIZE_MAX to mean strlen().

No actual code changes, just some clean-up.
This commit is contained in:
Lennart Poettering
2024-04-09 17:51:54 +02:00
committed by Yu Watanabe
parent 7072777163
commit e1771c8ee6
8 changed files with 49 additions and 45 deletions

View File

@@ -95,7 +95,7 @@ static int add_match(sd_journal *j, const char *match) {
if (field)
r = journal_add_match_pair(j, field, match);
else
r = sd_journal_add_match(j, match, 0);
r = sd_journal_add_match(j, match, SIZE_MAX);
if (r < 0)
return log_error_errno(r, "Failed to add match \"%s%s%s\": %m",
strempty(field), field ? "=" : "", match);
@@ -106,11 +106,11 @@ static int add_match(sd_journal *j, const char *match) {
static int add_matches(sd_journal *j, char **matches) {
int r;
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR, 0);
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR, SIZE_MAX);
if (r < 0)
return log_error_errno(r, "Failed to add match \"%s\": %m", "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR, 0);
r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR, SIZE_MAX);
if (r < 0)
return log_error_errno(r, "Failed to add match \"%s\": %m", "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR);

View File

@@ -75,12 +75,12 @@ static int acquire_first_emergency_log_message(char **ret) {
if (r < 0)
return log_error_errno(r, "Failed to add boot ID filter: %m");
r = sd_journal_add_match(j, "_UID=0", 0);
r = sd_journal_add_match(j, "_UID=0", SIZE_MAX);
if (r < 0)
return log_error_errno(r, "Failed to add User ID filter: %m");
assert_cc(0 == LOG_EMERG);
r = sd_journal_add_match(j, "PRIORITY=0", 0);
r = sd_journal_add_match(j, "PRIORITY=0", SIZE_MAX);
if (r < 0)
return log_error_errno(r, "Failed to add Emergency filter: %m");

View File

@@ -69,7 +69,7 @@ static int add_dmesg(sd_journal *j) {
if (!arg_dmesg)
return 0;
r = sd_journal_add_match(j, "_TRANSPORT=kernel", 0);
r = sd_journal_add_match(j, "_TRANSPORT=kernel", SIZE_MAX);
if (r < 0)
return r;
@@ -440,7 +440,7 @@ static int add_matches(sd_journal *j, char **args) {
have_term = true;
} else {
r = sd_journal_add_match(j, *i, 0);
r = sd_journal_add_match(j, *i, SIZE_MAX);
if (r < 0)
return log_error_errno(r, "Failed to add match '%s': %m", *i);
have_term = true;

View File

@@ -233,7 +233,11 @@ _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size)
assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(data, -EINVAL);
if (size == 0)
/* If the size is unspecified, assume it's a string. Note: 0 is the public value we document for
* this, for historical reasons. Internally, we pretty widely started using SIZE_MAX for this in
* similar cases however, hence accept that too. And internally we actually prefer it, to make things
* less surprising. */
if (IN_SET(size, 0, SIZE_MAX))
size = strlen(data);
if (!match_is_valid(data, size))
@@ -336,7 +340,7 @@ int journal_add_match_pair(sd_journal *j, const char *field, const char *value)
if (!s)
return -ENOMEM;
return sd_journal_add_match(j, s, 0);
return sd_journal_add_match(j, s, SIZE_MAX);
}
int journal_add_matchf(sd_journal *j, const char *format, ...) {
@@ -353,7 +357,7 @@ int journal_add_matchf(sd_journal *j, const char *format, ...) {
if (r < 0)
return -ENOMEM;
return sd_journal_add_match(j, s, 0);
return sd_journal_add_match(j, s, SIZE_MAX);
}
_public_ int sd_journal_add_conjunction(sd_journal *j) {

View File

@@ -17,8 +17,8 @@ int main(int argc, char *argv[]) {
assert_se(sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY | SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
assert_se(sd_journal_add_match(j, "_TRANSPORT=syslog", 0) >= 0);
assert_se(sd_journal_add_match(j, "_UID=0", 0) >= 0);
assert_se(sd_journal_add_match(j, "_TRANSPORT=syslog", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "_UID=0", SIZE_MAX) >= 0);
SD_JOURNAL_FOREACH_BACKWARDS(j) {
const void *d;

View File

@@ -18,38 +18,38 @@ int main(int argc, char *argv[]) {
assert_se(sd_journal_open(&j, SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
assert_se(sd_journal_add_match(j, "foobar", 0) < 0);
assert_se(sd_journal_add_match(j, "foobar=waldo", 0) < 0);
assert_se(sd_journal_add_match(j, "", 0) < 0);
assert_se(sd_journal_add_match(j, "=", 0) < 0);
assert_se(sd_journal_add_match(j, "=xxxxx", 0) < 0);
assert_se(sd_journal_add_match(j, "foobar", SIZE_MAX) < 0);
assert_se(sd_journal_add_match(j, "foobar=waldo", SIZE_MAX) < 0);
assert_se(sd_journal_add_match(j, "", SIZE_MAX) < 0);
assert_se(sd_journal_add_match(j, "=", SIZE_MAX) < 0);
assert_se(sd_journal_add_match(j, "=xxxxx", SIZE_MAX) < 0);
assert_se(sd_journal_add_match(j, (uint8_t[4]){'A', '=', '\1', '\2'}, 4) >= 0);
assert_se(sd_journal_add_match(j, (uint8_t[5]){'B', '=', 'C', '\0', 'D'}, 5) >= 0);
assert_se(sd_journal_add_match(j, "HALLO=WALDO", 0) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=mmmm", 0) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", 0) >= 0);
assert_se(sd_journal_add_match(j, "HALLO=", 0) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", 0) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=yyyyy", 0) >= 0);
assert_se(sd_journal_add_match(j, "PIFF=paff", 0) >= 0);
assert_se(sd_journal_add_match(j, "HALLO=WALDO", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=mmmm", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "HALLO=", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=xxxxx", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "QUUX=yyyyy", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "PIFF=paff", SIZE_MAX) >= 0);
assert_se(sd_journal_add_disjunction(j) >= 0);
assert_se(sd_journal_add_match(j, "ONE=one", 0) >= 0);
assert_se(sd_journal_add_match(j, "ONE=two", 0) >= 0);
assert_se(sd_journal_add_match(j, "TWO=two", 0) >= 0);
assert_se(sd_journal_add_match(j, "ONE=one", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "ONE=two", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "TWO=two", SIZE_MAX) >= 0);
assert_se(sd_journal_add_conjunction(j) >= 0);
assert_se(sd_journal_add_match(j, "L4_1=yes", 0) >= 0);
assert_se(sd_journal_add_match(j, "L4_1=ok", 0) >= 0);
assert_se(sd_journal_add_match(j, "L4_2=yes", 0) >= 0);
assert_se(sd_journal_add_match(j, "L4_2=ok", 0) >= 0);
assert_se(sd_journal_add_match(j, "L4_1=yes", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "L4_1=ok", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "L4_2=yes", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "L4_2=ok", SIZE_MAX) >= 0);
assert_se(sd_journal_add_disjunction(j) >= 0);
assert_se(sd_journal_add_match(j, "L3=yes", 0) >= 0);
assert_se(sd_journal_add_match(j, "L3=ok", 0) >= 0);
assert_se(sd_journal_add_match(j, "L3=yes", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "L3=ok", SIZE_MAX) >= 0);
assert_se(t = journal_make_match_string(j));

View File

@@ -121,7 +121,7 @@ static void run_test(void) {
assert_se(sd_journal_open_directory(&j, t, SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
assert_se(sd_journal_add_match(j, "MAGIC=quux", SIZE_MAX) >= 0);
SD_JOURNAL_FOREACH_BACKWARDS(j) {
_cleanup_free_ char *c;
@@ -147,7 +147,7 @@ static void run_test(void) {
verify_contents(j, 1);
printf("NEXT TEST\n");
assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
assert_se(sd_journal_add_match(j, "MAGIC=quux", SIZE_MAX) >= 0);
assert_se(z = journal_make_match_string(j));
printf("resulting match expression is: %s\n", z);
@@ -157,10 +157,10 @@ static void run_test(void) {
printf("NEXT TEST\n");
sd_journal_flush_matches(j);
assert_se(sd_journal_add_match(j, "MAGIC=waldo", 0) >= 0);
assert_se(sd_journal_add_match(j, "NUMBER=10", 0) >= 0);
assert_se(sd_journal_add_match(j, "NUMBER=11", 0) >= 0);
assert_se(sd_journal_add_match(j, "NUMBER=12", 0) >= 0);
assert_se(sd_journal_add_match(j, "MAGIC=waldo", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "NUMBER=10", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "NUMBER=11", SIZE_MAX) >= 0);
assert_se(sd_journal_add_match(j, "NUMBER=12", SIZE_MAX) >= 0);
assert_se(z = journal_make_match_string(j));
printf("resulting match expression is: %s\n", z);

View File

@@ -1570,18 +1570,18 @@ int add_matches_for_unit(sd_journal *j, const char *unit) {
/* Look for coredumps of the service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0)) ||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", SIZE_MAX)) ||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX)) ||
(r = journal_add_match_pair(j, "COREDUMP_UNIT", unit)) ||
/* Look for messages from PID 1 about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "_PID=1", 0)) ||
(r = sd_journal_add_match(j, "_PID=1", SIZE_MAX)) ||
(r = journal_add_match_pair(j, "UNIT", unit)) ||
/* Look for messages from authorized daemons about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX)) ||
(r = journal_add_match_pair(j, "OBJECT_SYSTEMD_UNIT", unit))
);
@@ -1615,13 +1615,13 @@ int add_matches_for_user_unit(sd_journal *j, const char *unit, uid_t uid) {
(r = sd_journal_add_disjunction(j)) ||
(r = journal_add_match_pair(j, "COREDUMP_USER_UNIT", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX)) ||
/* Look for messages from authorized daemons about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = journal_add_match_pair(j, "OBJECT_SYSTEMD_USER_UNIT", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
(r = sd_journal_add_match(j, "_UID=0", 0))
(r = sd_journal_add_match(j, "_UID=0", SIZE_MAX))
);
if (r == 0 && endswith(unit, ".slice"))