From 5346b6af0ca67a2965ca5846ae150f3021a2aa17 Mon Sep 17 00:00:00 2001 From: Steve Grubb Date: Tue, 26 Feb 2019 18:33:33 -0500 Subject: [PATCH] Add substitue functions for strndupa & rawmemchr --- Origin: https://github.com/linux-audit/audit-userspace/commit/d579a08bb1cde71f939c13ac6b2261052ae9f77e Applied-Upstream: yes auparse/auparse.c | 12 +++++++++++- auparse/interpret.c | 9 ++++++++- configure.ac | 14 +++++++++++++- src/ausearch-lol.c | 12 +++++++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/auparse/auparse.c b/auparse/auparse.c index f84712e..3764046 100644 --- a/auparse/auparse.c +++ b/auparse/auparse.c @@ -1,5 +1,5 @@ /* auparse.c -- - * Copyright 2006-08,2012-17 Red Hat Inc., Durham, North Carolina. + * Copyright 2006-08,2012-19 Red Hat Inc., Durham, North Carolina. * All Rights Reserved. * * This library is free software; you can redistribute it and/or @@ -1100,6 +1100,16 @@ static int str2event(char *s, au_event_t *e) return 0; } +#ifndef HAVE_STRNDUPA +static inline char *strndupa(const char *old, size_t n) +{ + size_t len = strnlen(old, n); + char *tmp = alloca(len + 1); + tmp[len] = 0; + return memcpy(tmp, old, len); +} +#endif + /* Returns 0 on success and 1 on error */ static int extract_timestamp(const char *b, au_event_t *e) { diff --git a/auparse/interpret.c b/auparse/interpret.c index 1846f9d..8540bd1 100644 --- a/auparse/interpret.c +++ b/auparse/interpret.c @@ -853,6 +853,13 @@ err_out: return print_escaped(id->val); } +// rawmemchr is faster. Let's use it if we have it. +#ifdef HAVE_RAWMEMCHR +#define STRCHR rawmemchr +#else +#define STRCHR strchr +#endif + static const char *print_proctitle(const char *val) { char *out = (char *)print_escaped(val); @@ -863,7 +870,7 @@ static const char *print_proctitle(const char *val) // Proctitle has arguments separated by NUL bytes // We need to write over the NUL bytes with a space // so that we can see the arguments - while ((ptr = rawmemchr(ptr, '\0'))) { + while ((ptr = STRCHR(ptr, '\0'))) { if (ptr >= end) break; *ptr = ' '; diff --git a/configure.ac b/configure.ac index ede7109..97b547f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl define([AC_INIT_NOTICE], [### Generated automatically using autoconf version] AC_ACVERSION [ -### Copyright 2005-18 Steve Grubb +### Copyright 2005-19 Steve Grubb ### ### Permission is hereby granted, free of charge, to any person obtaining a ### copy of this software and associated documentation files (the "Software"), @@ -72,6 +72,18 @@ dnl; posix_fallocate is used in audisp-remote AC_CHECK_FUNCS([posix_fallocate]) dnl; signalfd is needed for libev AC_CHECK_FUNC([signalfd], [], [ AC_MSG_ERROR([The signalfd system call is necessary for auditd]) ]) +dnl; check if rawmemchr is available +AC_CHECK_FUNCS([rawmemchr]) +dnl; check if strndupa is available +AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [[ + #define _GNU_SOURCE + #include + int main() { (void) strndupa("test", 10); return 0; }]])], + [AC_DEFINE(HAVE_STRNDUPA, 1, [Let us know if we have it or not])], + [] +) ALLWARNS="" ALLDEBUG="-g" diff --git a/src/ausearch-lol.c b/src/ausearch-lol.c index 4fbfbae..5eecefe 100644 --- a/src/ausearch-lol.c +++ b/src/ausearch-lol.c @@ -1,6 +1,6 @@ /* * ausearch-lol.c - linked list of linked lists library -* Copyright (c) 2008,2010,2014,2016 Red Hat Inc., Durham, North Carolina. +* Copyright (c) 2008,2010,2014,2016,2019 Red Hat Inc., Durham, North Carolina. * All Rights Reserved. * * This software may be freely redistributed and/or modified under the @@ -131,6 +131,16 @@ static int inline events_are_equal(event *e1, event *e2) return 1; } +#ifndef HAVE_STRNDUPA +static inline char *strndupa(const char *old, size_t n) +{ + size_t len = strnlen(old, n); + char *tmp = alloca(len + 1); + tmp[len] = 0; + return memcpy(tmp, old, len); +} +#endif + /* * This function will look at the line and pick out pieces of it. */ -- 2.20.1