Skip to content

Commit

Permalink
Merge pull request grobian#3 from msaf1980/sanitizers
Browse files Browse the repository at this point in the history
Sanitizers
  • Loading branch information
msaf1980 committed Oct 4, 2020
2 parents d56b683 + bddc24e commit d0a4e35
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 87 deletions.
72 changes: 61 additions & 11 deletions build-test.sh
Original file line number Diff line number Diff line change
@@ -1,45 +1,95 @@
#!/bin/sh

# Run defaults build and tests
# ./build-test.sh
#
# Run build and tests under Address Sanitizer
# ASAN=1 UBSAN=1 ./build-test.sh
#
# Run build and tests under valgrind
# VALGRIND=1 ./build-test.sh

SCFLAGS="-fno-omit-frame-pointer -fstack-protector-strong -g"
SLDFLAGS="-fno-omit-frame-pointer -fstack-protector-strong -lrt -pthread"

SANITIZE="0"
[ "${ASAN}" = "1" ] && {
SANITIZE="1"
SCFLAGS="${SCFLAGS} -fsanitize=address"
SLDFLAGS="${SLDFLAGS} -fsanitize=address"
VALGRIND="0"
}
[ "${TSAN}" = "1" ] && {
SANITIZE="1"
SCFLAGS="${SCFLAGS} -fsanitize=thread"
SLDFLAGS="${SLDFLAGS} -fsanitize=thread"
VALGRIND="0"
}
[ "${UBSAN}" = "1" ] && {
SANITIZE="1"
SCFLAGS="${SCFLAGS} -fsanitize=undefined"
SLDFLAGS="${SLDFLAGS} -fsanitize=undefined"
VALGRIND="0"
}

[ "${VALGRIND}" = "1" ] && {
SANITIZE="1"
export VALGRIND
}

[ "${SANITIZE}" = "0" ] && {
econf="./configure --disable-maintainer-mode"
[ -z "${CFLAGS}" ] && CFLAGS="-O3 -Wall -Werror -Wshadow -D_GNU_SOURCE -pipe"
} || {
#export ac_cv_func_malloc_0_nonnull=yes
export ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
econf="./configure --disable-maintainer-mode --with-gnu-ld"
[ -z "${CFLAGS}" ] && CFLAGS="-O0 -Wall -Werror -Wshadow -D_GNU_SOURCE -pipe"
CFLAGS="${CFLAGS} ${SCFLAGS}"
LDFLAGS="${LDFLAGS} ${SLDFLAGS}"
}

# everything disabled, this MUST work
echo "==> base test, all disabled"
econf="./configure --disable-maintainer-mode"
${econf} --without-gzip --without-lz4 --without-ssl \
--without-oniguruma --without-pcre2 --without-pcre \
|| { cat config.log ; exit 1 ; }
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean check || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean check || exit 1
# compile some enabled/disabled variants compile only
if [ "${SANITIZE}" = "0" ]; then
# Build only, no need if enable sanitize check (for reduce needed time)
echo "==> gzip enabled"
if ${econf} --with-gzip --without-lz4 --without-ssl ; then
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean relay || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean relay || exit 1
fi
echo "==> lz4 enabled"
if ${econf} --without-gzip --with-lz4 --without-ssl ; then
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean relay || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean relay || exit 1
fi
echo "==> gzip,lz4 enabled"
if ${econf} --with-gzip --with-lz4 --without-ssl ; then
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean relay || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean relay || exit 1
fi
echo "==> gzip,lz4,ssl enabled"
if ${econf} --with-gzip --with-lz4 --with-ssl ; then
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean relay || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean relay || exit 1
fi
fi
# test the regex implementations
if [ $TRAVIS_OS_NAME = osx ] ; then
echo "==> pcre2 enabled"
${econf} --without-oniguruma --with-pcre2 --without-pcre || exit
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean check || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean check || exit 1
else
echo "==> oniguruma enabled"
${econf} --with-oniguruma --without-pcre2 --without-pcre || exit
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean check || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean check || exit 1
fi
echo "==> pcre enabled"
${econf} --without-oniguruma --without-pcre2 --with-pcre || exit
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean check || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean check || exit 1
# final test with everything enabled that is detected
echo "==> everything default"
${econf} || { cat config.log ; exit 1 ; }
make CFLAGS="-O3 -Wall -Werror -Wshadow -pipe" clean check || exit 1
make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" clean check || exit 1
exit 0 # all is good here

8 changes: 6 additions & 2 deletions ctest.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,14 +328,18 @@ void CTEST_ERR(const char* fmt, ...)

CTEST_IMPL_DIAG_POP()

static const char *null_str(const char *s) {
return (s == NULL) ? "(null)" : s;
}

void assert_str(const char* exp, const char* real, const char* caller, int line, const char *descr) {
if ((exp == NULL && real != NULL) ||
(exp != NULL && real == NULL) ||
(exp && real && strcmp(exp, real) != 0)) {
if (descr == NULL)
CTEST_ERR("%s:%d expected '%s', got '%s'", caller, line, exp, real);
CTEST_ERR("%s:%d expected '%s', got '%s'", caller, line, null_str(exp), null_str(real));
else
CTEST_ERR("%s:%d expected '%s', got '%s': %s", caller, line, exp, real, descr);
CTEST_ERR("%s:%d expected '%s', got '%s': %s", caller, line, null_str(exp), null_str(real), descr);
}
}

Expand Down
12 changes: 12 additions & 0 deletions docs/SANITIZERS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# valgrind

Run tests under valgrind
```
export VALGRIND=1
make test 2>&1 | tee valgrind.log
```

run build-test.sh with tests under valgrind
```
VALGRIND=1 ./build-test.sh 2>&1 | tee valgrind.log
```
176 changes: 114 additions & 62 deletions router_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,34 +22,36 @@
* clang -o distributiontest -I. issues/distributiontest.c consistent-hash.c \
* server.c queue.c md5.c dispatcher.c router.c aggregator.c -pthread -lm */

#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <errno.h>

#include "consistent-hash.h"
#include "md5.h"
#include "relay.h"
#include "router.h"
#include "server.h"
#include "relay.h"
#include "md5.h"

#define SRVCNT 8
#define REPLCNT 2

unsigned char mode = 0;

int
relaylog(enum logdst dest, const char *fmt, ...)
{
(void) dest;
(void) fmt;
return 0;
int relaylog(enum logdst dest, const char *fmt, ...) {
(void) dest;
(void) fmt;
return 0;
}

router *router_new(void);
char *router_validate_address(router *rtr, char **retip, unsigned short *retport, void **retsaddr, void **rethint, char *ip, con_proto proto);
char *router_validate_address(router *rtr, char **retip,
unsigned short *retport,
struct addrinfo **retsaddr,
struct addrinfo **rethint, char *ip,
con_proto proto);

#define CTEST_MAIN
#define CTEST_SEGFAULT
Expand All @@ -64,73 +66,123 @@ char sslCAisdir = 0;

CTEST_DATA(router_test) {
router *r;
struct addrinfo *retsaddr;
struct addrinfo *rethint;
};

CTEST_SETUP(router_test) {
data->r = router_new();
data->retsaddr = NULL;
data->rethint = NULL;
}

CTEST_TEARDOWN(router_test) {
router_free(data->r);
free(data->rethint);
freeaddrinfo(data->retsaddr);
}

CTEST2(router_test, router_validate_address_hostname) {
char *retip;
unsigned short retport;
void *retsaddr, *rethint;
char ip[256];

strcpy(ip, "host");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP));
ASSERT_EQUAL(retport, 2003);
ASSERT_STR(retip, "host");

strcpy(ip, "[host:1]");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP));
ASSERT_EQUAL(retport, 2003);
ASSERT_STR(retip, "host:1");
char *retip;
unsigned short retport;
char ip[256];

strcpy(ip, "host");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP));
ASSERT_EQUAL(retport, 2003);
ASSERT_STR(retip, "host");
free(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;

strcpy(ip, "[host:1]");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP));
ASSERT_EQUAL(retport, 2003);
ASSERT_STR(retip, "host:1");
freeaddrinfo(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;
}

CTEST2(router_test, router_validate_address_port) {
char *retip;
unsigned short retport;
void *retsaddr, *rethint;
char ip[256];

strcpy(ip, ":2005");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP));
ASSERT_EQUAL(retport, 2005);
ASSERT_NULL(retip);

strcpy(ip, ":2005a");
ASSERT_STR(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP), "invalid port number '2005a'");
char *retip;
unsigned short retport;
char ip[256];

strcpy(ip, ":2005");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP));
ASSERT_EQUAL(retport, 2005);
ASSERT_NULL(retip);
freeaddrinfo(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;

strcpy(ip, ":2005a");
ASSERT_STR(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP),
"invalid port number '2005a'");
freeaddrinfo(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;
}


CTEST2(router_test, router_validate_address_hostname_port) {
char *retip;
unsigned short retport;
void *retsaddr, *rethint;
char ip[256];

strcpy(ip, "host:2004");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP));
ASSERT_EQUAL(retport, 2004);
ASSERT_STR(retip, "host");

strcpy(ip, "host:2005a");
ASSERT_STR(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP), "invalid port number '2005a'");

strcpy(ip, "[host:1]:2002");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP));
ASSERT_EQUAL(retport, 2002);
ASSERT_STR(retip, "host:1");

strcpy(ip, "[host:1]:2006c");
ASSERT_STR(router_validate_address(data->r, &retip, &retport, &retsaddr, &rethint, ip, CON_TCP), "invalid port number '2006c'");
char *retip;
unsigned short retport;
char ip[256];

strcpy(ip, "host:2004");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP));
ASSERT_EQUAL(retport, 2004);
ASSERT_STR(retip, "host");
free(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;

strcpy(ip, "host:2005a");
ASSERT_STR(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP),
"invalid port number '2005a'");
freeaddrinfo(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;

strcpy(ip, "[host:1]:2002");
ASSERT_NULL(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP));
ASSERT_EQUAL(retport, 2002);
ASSERT_STR(retip, "host:1");
freeaddrinfo(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;

strcpy(ip, "[host:1]:2006c");
ASSERT_STR(router_validate_address(data->r, &retip, &retport,
&data->retsaddr, &data->rethint, ip,
CON_TCP),
"invalid port number '2006c'");
freeaddrinfo(data->rethint);
data->rethint = NULL;
freeaddrinfo(data->retsaddr);
data->retsaddr = NULL;
}

int main(int argc, const char *argv[])
{
return ctest_main(argc, argv);
}
int main(int argc, const char *argv[]) { return ctest_main(argc, argv); }
6 changes: 2 additions & 4 deletions server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1684,10 +1684,8 @@ server_cleanup(server *s) {
}
free(s->batch);
free(s->instance);
if (s->saddr != NULL) {
freeaddrinfo(s->saddr);
}
free(s->hint);
freeaddrinfo(s->saddr);
freeaddrinfo(s->hint);
if (s->strm != NULL) {
free(s->strm->nextstrm);
free(s->strm);
Expand Down
Loading

0 comments on commit d0a4e35

Please sign in to comment.