From eac5e6eee91332c3c98f4c5a3ee2d55ec1723d81 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Fri, 3 Jul 2009 00:20:19 +0200 Subject: add testcases for shm_{open,unlink} Reported-by: Mikael Lund Jepsen Signed-off-by: Bernhard Reutner-Fischer --- librt/shm.c | 4 ++ test/librt/Makefile | 6 +++ test/librt/shmtest.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 test/librt/Makefile create mode 100644 test/librt/shmtest.c diff --git a/librt/shm.c b/librt/shm.c index 3f33d68af..c7c0ee461 100644 --- a/librt/shm.c +++ b/librt/shm.c @@ -45,6 +45,10 @@ static char* get_shm_name(const char*name) if (i < 0) { free(path); return NULL; + } else if (i >= NAME_MAX) { + free(path); + __set_errno(ENAMETOOLONG); + return NULL; } #endif return path; diff --git a/test/librt/Makefile b/test/librt/Makefile new file mode 100644 index 000000000..362d5d5c1 --- /dev/null +++ b/test/librt/Makefile @@ -0,0 +1,6 @@ +# uClibc shm tests +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +include ../Test.mak + +LDFLAGS_shmtest := -lrt diff --git a/test/librt/shmtest.c b/test/librt/shmtest.c new file mode 100644 index 000000000..8f40047be --- /dev/null +++ b/test/librt/shmtest.c @@ -0,0 +1,102 @@ +/* Copyright (C) 2009 Mikael Lund Jepsen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char shared_name[] = "/sharetest"; +int test_data[11] = {0,1,2,3,4,5,6,7,8,9,10}; + +int main(void) { + int pfds[2]; + pid_t pid; + int fd; + int test_data_fails = 0; + char *ptest_data; + unsigned int i; + char buf[30]; + int rv; + + pipe(pfds); + + switch(pid = fork()) { + case -1: + perror("fork"); + exit(1); /* parent exits */ + + case 0: + /* Child */ + + /* wait for parent */ + read(pfds[0], buf, 5); + + fd = shm_open(shared_name, O_RDWR, DEFFILEMODE); + if (fd == -1) { + perror("CHILD - shm_open(existing):"); + exit(1); + } else { + ptest_data = mmap(0, sizeof(test_data), PROT_READ + PROT_WRITE, MAP_SHARED, fd, 0); + if (ptest_data != MAP_FAILED) { + for (i=0; i < sizeof(test_data); i++) { + if (ptest_data[i] != test_data[i]) { + printf("%-40s: Offset %d, local %d, shm %d", "Compare memory error", i, test_data[i], ptest_data[i]); + test_data_fails++; + } + } + if (test_data_fails == 0) + printf("%-40s: %s\n", "Compare memory", "Success"); + + munmap(ptest_data, sizeof(test_data)); + } + } + exit(0); + + default: + /* Parent */ + fd = shm_open(shared_name, O_RDWR+O_CREAT+O_EXCL, DEFFILEMODE ); + if (fd == -1) { + perror("PARENT - shm_open(create):"); + } else { + if ((ftruncate(fd, sizeof(test_data))) == -1) + { + printf("%-40s: %s", "ftruncate", strerror(errno)); + shm_unlink(shared_name); + return 0; + } + + ptest_data = mmap(0, sizeof(test_data), PROT_READ + PROT_WRITE, MAP_SHARED, fd, 0); + if (ptest_data == MAP_FAILED) + { + perror("PARENT - mmap:"); + if (shm_unlink(shared_name) == -1) { + perror("PARENT - shm_unlink:"); + } + return 0; + } + for (i=0; i