1a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Test for memory/CPU leak in regcomp. */ 2a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 3a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_CONFIG_H 4a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include "config.h" 5a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 6a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 7a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <sys/types.h> 8a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <sys/time.h> 9a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <sys/resource.h> 10a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <regex.h> 11a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdio.h> 12a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdlib.h> 13a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 14a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define TEST_DATA_LIMIT (32 << 20) 15a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 16a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerint 17a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnermain () 18a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 19a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RLIMIT_DATA 20a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regex_t re; 21a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int reerr; 22a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 23a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Try to avoid eating all memory if a test leaks. */ 24a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct rlimit data_limit; 25a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (getrlimit (RLIMIT_DATA, &data_limit) == 0) 26a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 27a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if ((rlim_t) TEST_DATA_LIMIT > data_limit.rlim_max) 28a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner data_limit.rlim_cur = data_limit.rlim_max; 29a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (data_limit.rlim_cur > (rlim_t) TEST_DATA_LIMIT) 30a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner data_limit.rlim_cur = (rlim_t) TEST_DATA_LIMIT; 31a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (setrlimit (RLIMIT_DATA, &data_limit) < 0) 32a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner perror ("setrlimit: RLIMIT_DATA"); 33a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 34a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 35a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner perror ("getrlimit: RLIMIT_DATA"); 36a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 37a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner reerr = regcomp (&re, "^6?3?[25]?5?[14]*[25]*[69]*+[58]*87?4?$", 38a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner REG_EXTENDED | REG_NOSUB); 39a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (reerr != 0) 40a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 41a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char buf[100]; 42a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regerror (reerr, &re, buf, sizeof buf); 43a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("regerror %s\n", buf); 44a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 1; 45a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 46a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 47a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 0; 48a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 49a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 77; 50a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 51a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 52