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