summaryrefslogtreecommitdiff
path: root/regex.c
diff options
context:
space:
mode:
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/regex.c b/regex.c
index 190fdfe706..b92978fdbb 100644
--- a/regex.c
+++ b/regex.c
@@ -50,6 +50,9 @@
/* We need this for `regex.h', and perhaps for the Emacs include files. */
# include <sys/types.h>
#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
#if !defined(__STDC__) && !defined(_MSC_VER)
# define volatile
@@ -63,6 +66,10 @@
#ifdef RUBY_PLATFORM
#include "defines.h"
+#undef xmalloc
+#undef xrealloc
+#undef xcalloc
+#undef xfree
# define RUBY
extern int rb_prohibit_interrupt;
@@ -104,6 +111,11 @@ void *alloca ();
# include <strings.h>
#endif
+#define xmalloc malloc
+#define xrealloc realloc
+#define xcalloc calloc
+#define xfree free
+
#ifdef C_ALLOCA
#define FREE_VARIABLES() alloca(0)
#else
@@ -127,10 +139,12 @@ void *alloca ();
unsigned int xlen = stacke - stackb; \
if (stackb == stacka) { \
stackx = (type*)xmalloc(2 * xlen * sizeof(type)); \
+ if (!stackx) goto memory_exhausted; \
memcpy(stackx, stackb, xlen * sizeof (type)); \
} \
else { \
stackx = (type*)xrealloc(stackb, 2 * xlen * sizeof(type)); \
+ if (!stackx) goto memory_exhausted; \
} \
/* Rearrange the pointers. */ \
stackp = stackx + (stackp - stackb); \
@@ -2775,8 +2789,8 @@ bm_search(little, llen, big, blen, skip, translate)
The caller must supply the address of a (1 << BYTEWIDTH)-byte data
area as bufp->fastmap.
The other components of bufp describe the pattern to be used. */
-void
-re_compile_fastmap(bufp)
+static int
+re_compile_fastmap0(bufp)
struct re_pattern_buffer *bufp;
{
unsigned char *pattern = (unsigned char*)bufp->buffer;
@@ -2944,7 +2958,7 @@ re_compile_fastmap(bufp)
fastmap[j] = 1;
}
if (bufp->can_be_null) {
- FREE_AND_RETURN_VOID(stackb);
+ FREE_AND_RETURN(stackb, 0);
}
/* Don't return; check the alternative paths
so we can set can_be_null if appropriate. */
@@ -3110,7 +3124,16 @@ re_compile_fastmap(bufp)
else
break;
}
- FREE_AND_RETURN_VOID(stackb);
+ FREE_AND_RETURN(stackb, 0);
+ memory_exhausted:
+ FREE_AND_RETURN(stackb, -2);
+}
+
+void
+re_compile_fastmap(bufp)
+ struct re_pattern_buffer *bufp;
+{
+ (void)re_compile_fastmap0(bufp);
}
/* adjust startpos value to the position between characters. */
@@ -3144,7 +3167,8 @@ re_adjust_startpos(bufp, string, size, startpos, range)
{
/* Update the fastmap now if not correct already. */
if (!bufp->fastmap_accurate) {
- re_compile_fastmap(bufp);
+ int ret = re_compile_fastmap0(bufp);
+ if (ret) return ret;
}
/* Adjust startpos for mbc string */
@@ -3190,7 +3214,8 @@ re_search(bufp, string, size, startpos, range, regs)
/* Update the fastmap now if not correct already. */
if (fastmap && !bufp->fastmap_accurate) {
- re_compile_fastmap(bufp);
+ int ret = re_compile_fastmap0(bufp);
+ if (ret) return ret;
}
@@ -3580,7 +3605,7 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs)
``dummy''; if a failure happens and the failure point is a dummy, it
gets discarded and the next next one is tried. */
- unsigned char **stacka;
+ unsigned char **const stacka = 0;
unsigned char **stackb;
unsigned char **stackp;
unsigned char **stacke;
@@ -3629,8 +3654,7 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs)
}
/* Initialize the stack. */
- stacka = RE_TALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*);
- stackb = stacka;
+ stackb = TMALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*);
stackp = stackb;
stacke = &stackb[MAX_NUM_FAILURE_ITEMS * NFAILURES];
@@ -4400,6 +4424,8 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs)
goto restore_best_regs;
FREE_AND_RETURN(stackb,(-1)); /* Failure to match. */
+ memory_exhausted:
+ FREE_AND_RETURN(stackb,(-2));
}
@@ -4663,5 +4689,5 @@ utf8_startpos(string, pos)
mode : C
c-file-style : "gnu"
tab-width : 8
- End :
+ End
*/