Use a more conventional error handling interface in regex_escape(): Return a ssize_t, which is either the number of bytes in the output, or return -1 and set errno.
Before this change, the (log_match_cursor < 0) check in the call site was never true because log_match_cursor is a pointer. Assisted-by: LLM Signed-off-by: Günther Noack <[email protected]> --- tools/testing/selftests/landlock/common.h | 20 ++++++++++++-------- tools/testing/selftests/landlock/fs_test.c | 12 +++++++----- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/landlock/common.h b/tools/testing/selftests/landlock/common.h index e1aa0ec02c96..91842f618a3a 100644 --- a/tools/testing/selftests/landlock/common.h +++ b/tools/testing/selftests/landlock/common.h @@ -264,11 +264,11 @@ static void __maybe_unused set_unix_address(struct service_fixture *const srv, * Escapes characters that have special meaning in POSIX Basic Regular * Expressions: $ * . [ \ ] ^ * - * Returns a pointer to the NUL terminator in @dst (cursor-style API for - * chaining), or (char *)-ENOMEM if the buffer is too small. + * Returns the length of the escaped string (excluding the NUL terminator), or + * -1 with errno set to ENOMEM if the buffer is too small. */ -static __maybe_unused char *regex_escape(const char *const src, char *dst, - size_t dst_size) +static __maybe_unused ssize_t regex_escape(const char *const src, char *dst, + size_t dst_size) { char *d = dst; @@ -282,21 +282,25 @@ static __maybe_unused char *regex_escape(const char *const src, char *dst, case ']': case '^': if (d >= dst + dst_size - 2) - return (char *)-ENOMEM; + goto err_nomem; *d++ = '\\'; *d++ = *s; break; default: if (d >= dst + dst_size - 1) - return (char *)-ENOMEM; + goto err_nomem; *d++ = *s; } } if (d >= dst + dst_size - 1) - return (char *)-ENOMEM; + goto err_nomem; *d = '\0'; - return d; + return d - dst; + +err_nomem: + errno = ENOMEM; + return -1; } diff --git a/tools/testing/selftests/landlock/fs_test.c b/tools/testing/selftests/landlock/fs_test.c index b1ce0f810e10..9abc2adef79d 100644 --- a/tools/testing/selftests/landlock/fs_test.c +++ b/tools/testing/selftests/landlock/fs_test.c @@ -7454,6 +7454,7 @@ static int matches_log_fs_extra(struct __test_metadata *const _metadata, char log_match[log_match_remaining]; char *log_match_cursor = log_match; size_t chunk_len; + ssize_t escaped_len; chunk_len = snprintf(log_match_cursor, log_match_remaining, REGEX_LANDLOCK_PREFIX " blockers=%s path=\"", @@ -7471,13 +7472,14 @@ static int matches_log_fs_extra(struct __test_metadata *const _metadata, log_match_remaining -= chunk_len; log_match_cursor += chunk_len; - log_match_cursor = regex_escape(absolute_path, log_match_cursor, - log_match_remaining); + escaped_len = regex_escape(absolute_path, log_match_cursor, + log_match_remaining); free(absolute_path); - if (log_match_cursor < 0) - return (long long)log_match_cursor; + if (escaped_len < 0) + return -errno; - log_match_remaining -= log_match_cursor - log_match; + log_match_remaining -= escaped_len; + log_match_cursor += escaped_len; chunk_len = snprintf(log_match_cursor, log_match_remaining, "\" dev=\"[^\"]\\+\" ino=[0-9]\\+%s$", extra ?: ""); -- 2.56.0

