[erlang-bugs] R12B-5 hide private libpcre patch

Paul Fisher <>
Wed Dec 31 22:14:16 CET 2008


A while ago I had reported that the libpcre code compiled into 
beam(.smp) interfered with linked-in drivers because of incompatible 
changes to the code.  The solution is to hide the entry points so that 
they are not resolved from linked-in driver code that expects to 
dynamically resolve to libpcre.so.3.

The following patch renames the public entry points to be prefixed with 
erts_pcre_ and has worked in our environment:

diff -ur otp_src_R12B-5.orig/erts/emulator/beam/erl_bif_re.c 
otp_src_R12B-5/erts/emulator/beam/erl_bif_re.c
--- otp_src_R12B-5.orig/erts/emulator/beam/erl_bif_re.c	2008-11-24 
08:48:37.920967010 -0600
+++ otp_src_R12B-5/erts/emulator/beam/erl_bif_re.c	2008-11-24 
09:22:54.770789631 -0600
@@ -61,10 +61,10 @@

  void erts_init_bif_re(void)
  {
-    pcre_malloc = &erts_pcre_malloc;
-    pcre_free = &erts_pcre_free;
-    pcre_stack_malloc = &erts_pcre_stack_malloc;
-    pcre_stack_free = &erts_pcre_stack_free;
+    erts_pcre_malloc_f = &erts_pcre_malloc;
+    erts_pcre_free_f = &erts_pcre_free;
+    erts_pcre_stack_malloc_f = &erts_pcre_stack_malloc;
+    erts_pcre_stack_free_f = &erts_pcre_stack_free;
      default_table = NULL; /* ISO8859-1 default, forced into pcre */
      max_loop_limit = CONTEXT_REDS * LOOP_FACTOR;

@@ -389,12 +389,12 @@
  	hp += 3;
  	ret = TUPLE2(hp, error_tag, ret);
      } else {
-	pcre_fullinfo(result, NULL, PCRE_INFO_SIZE, &pattern_size);
-	pcre_fullinfo(result, NULL, PCRE_INFO_CAPTURECOUNT, &capture_count);
+	erts_pcre_fullinfo(result, NULL, PCRE_INFO_SIZE, &pattern_size);
+	erts_pcre_fullinfo(result, NULL, PCRE_INFO_CAPTURECOUNT, &capture_count);
  	/* XXX: Optimize - keep in offheap binary to allow this to
  	   be kept across traps w/o need of copying */
  	ret = new_binary(p, (byte *) result, pattern_size);
-	pcre_free(result);
+	erts_pcre_free(result);
  	hp = HAlloc(p, (with_ok) ? (3+5) : 5);
  	ret = TUPLE4(hp,am_re_pattern, make_small(capture_count), 
make_small(unicode),ret);
  	if (with_ok) {
@@ -448,8 +448,8 @@
  	BIF_ERROR(BIF_P,BADARG);
      }
      expr[slen]='\0';
-    result = pcre_compile2(expr, options, &errcode,
-			   &errstr, &errofset, default_table);
+    result = erts_pcre_compile2(expr, options, &errcode,
+                                &errstr, &errofset, default_table);

      ret = build_compile_result(BIF_P, am_error, result, errcode,
  			       errstr, errofset, unicode, 1);
@@ -495,7 +495,7 @@
  static void cleanup_restart_context(RestartContext *rc)
  {
      if (rc->restart_data != NULL) {
-	pcre_free_restart_data(rc->restart_data);
+	erts_pcre_free_restart_data(rc->restart_data);
  	rc->restart_data = NULL;
      }
      if (rc->ovector != NULL) {
@@ -767,7 +767,7 @@
  			}
  			tmpb[slen] = '\0';
  		    }
-		    if ((ri->v[ri->num_spec - 1] = pcre_get_stringnumber(code,tmpb)) ==
+		    if ((ri->v[ri->num_spec - 1] = 
erts_pcre_get_stringnumber(code,tmpb)) ==
  			PCRE_ERROR_NOSUBSTRING) {
  			ri->v[ri->num_spec - 1] = -1;
  		    }
@@ -849,8 +849,8 @@
  		BIF_ERROR(BIF_P,BADARG);
  	    }
  	    expr[slen]='\0';
-	    result = pcre_compile2(expr, comp_options, &errcode,
-				   &errstr, &errofset, default_table);
+	    result = erts_pcre_compile2(expr, comp_options, &errcode,
+                                        &errstr, &errofset, default_table);
  	    if (!result) {
  		erts_free(ERTS_ALC_T_RE_TMP_BUF, expr);
  		/* Compilation error gives badarg except in the compile
@@ -876,12 +876,12 @@
  		BIF_TRAP3(grun_trap_exportp, BIF_P, BIF_ARG_1, precompiled, r);
  	    }

-	    pcre_fullinfo(result, NULL, PCRE_INFO_SIZE, &code_size);
-	    pcre_fullinfo(result, NULL, PCRE_INFO_CAPTURECOUNT, &capture_count);
+	    erts_pcre_fullinfo(result, NULL, PCRE_INFO_SIZE, &code_size);
+	    erts_pcre_fullinfo(result, NULL, PCRE_INFO_CAPTURECOUNT, 
&capture_count);
  	    ovsize = 3*(capture_count+1);
  	    restart.code = erts_alloc(ERTS_ALC_T_RE_SUBJECT, code_size);
  	    memcpy(restart.code, result, code_size);
-	    pcre_free(result);
+	    erts_pcre_free(result);
  	    erts_free(ERTS_ALC_T_RE_TMP_BUF, expr);
  	    /*unicode = (pflags & PARSE_FLAG_UNICODE) ? 1 : 0;*/
  	} else {
@@ -967,7 +967,7 @@
      loop_count = 0xFFFFFFFF;
  #endif

-    rc = pcre_exec(restart.code, &(restart.extra), restart.subject, 
slength, startoffset,
+    rc = erts_pcre_exec(restart.code, &(restart.extra), 
restart.subject, slength, startoffset,
  		   options, restart.ovector, ovsize);
      ASSERT(loop_count != 0xFFFFFFFF);
      BUMP_REDS(BIF_P, loop_count / LOOP_FACTOR);
@@ -1035,7 +1035,7 @@
  #ifdef DEBUG
      loop_count = 0xFFFFFFFF;
  #endif
-    rc = pcre_exec(NULL, &(restartp->extra), NULL, 0, 0, 0, NULL, 0);
+    rc = erts_pcre_exec(NULL, &(restartp->extra), NULL, 0, 0, 0, NULL, 0);
      ASSERT(loop_count != 0xFFFFFFFF);
      BUMP_REDS(BIF_P, loop_count / LOOP_FACTOR);
      if (rc == PCRE_ERROR_LOOP_LIMIT) {
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_compile.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_compile.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_compile.c	2008-11-24 
08:48:37.874132417 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_compile.c	2008-11-24 
09:22:26.143832254 -0600
@@ -5786,15 +5786,15 @@
  */

  PCRE_EXP_DEFN pcre *
-pcre_compile(const char *pattern, int options, const char **errorptr,
+erts_pcre_compile(const char *pattern, int options, const char **errorptr,
    int *erroroffset, const unsigned char *tables)
  {
-return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, 
tables);
+return erts_pcre_compile2(pattern, options, NULL, errorptr, 
erroroffset, tables);
  }


  PCRE_EXP_DEFN pcre *
-pcre_compile2(const char *pattern, int options, int *errorcodeptr,
+erts_pcre_compile2(const char *pattern, int options, int *errorcodeptr,
    const char **errorptr, int *erroroffset, const unsigned char *tables)
  {
  real_pcre *re;
@@ -6022,7 +6022,7 @@
  cd->name_entry_size. */

  size = length + sizeof(real_pcre) + cd->names_found * 
(cd->name_entry_size + 3);
-re = (real_pcre *)(pcre_malloc)(size);
+re = (real_pcre *)(erts_pcre_malloc_f)(size);

  if (re == NULL)
    {
@@ -6118,7 +6118,7 @@

  if (errorcode != 0)
    {
-  (pcre_free)(re);
+  (erts_pcre_free_f)(re);
    PCRE_EARLY_ERROR_RETURN:
    *erroroffset = ptr - (const uschar *)pattern;
    PCRE_EARLY_ERROR_RETURN2:
@@ -6206,7 +6206,7 @@

  if (code - codestart > length)
    {
-  (pcre_free)(re);
+  (erts_pcre_free_f)(re);
    *errorptr = find_error_text(ERR23);
    *erroroffset = ptr - (uschar *)pattern;
    if (errorcodeptr != NULL) *errorcodeptr = ERR23;
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_config.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_config.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_config.c	2008-11-24 
08:48:37.896839943 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_config.c	2008-11-24 
09:11:51.900473970 -0600
@@ -63,7 +63,7 @@
  */

  PCRE_EXP_DEFN int
-pcre_config(int what, void *where)
+erts_pcre_config(int what, void *where)
  {
  switch (what)
    {
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_dfa_exec.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_dfa_exec.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_dfa_exec.c	2008-11-24 
08:48:37.875955067 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_dfa_exec.c	2008-11-24 
09:22:12.611173554 -0600
@@ -2404,7 +2404,7 @@
        /* Handle callouts */

        case OP_CALLOUT:
-      if (pcre_callout != NULL)
+      if (erts_pcre_callout_f != NULL)
          {
          int rrc;
          pcre_callout_block cb;
@@ -2420,7 +2420,7 @@
          cb.capture_top      = 1;
          cb.capture_last     = -1;
          cb.callout_data     = md->callout_data;
-        if ((rrc = (*pcre_callout)(&cb)) < 0) return rrc;   /* Abandon */
+        if ((rrc = (*erts_pcre_callout_f)(&cb)) < 0) return rrc;   /* 
Abandon */
          if (rrc == 0) { ADD_ACTIVE(state_offset + 2 + 2*LINK_SIZE, 0); }
          }
        break;
@@ -2506,7 +2506,7 @@
  */

  PCRE_EXP_DEFN int
-pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,
+erts_pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,
    const char *subject, int length, int start_offset, int options, int 
*offsets,
    int offsetcount, int *workspace, int wscount)
  {
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_exec.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_exec.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_exec.c	2008-11-24 
08:48:37.876553392 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_exec.c	2008-11-24 
09:22:23.386491532 -0600
@@ -275,7 +275,7 @@

  #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw)\
    {\
-  heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\
+  heapframe *newframe = (erts_pcre_stack_malloc_f)(sizeof(heapframe));\
    frame->Xwhere = rw; \
    newframe->Xeptr = ra;\
    newframe->Xecode = rb;\
@@ -298,7 +298,7 @@
    {\
    heapframe *newframe = frame;\
    frame = newframe->Xprevframe;\
-  (pcre_stack_free)(newframe);\
+  (erts_pcre_stack_free_f)(newframe);\
    if (frame != NULL)\
      {\
      rrc = ra;\
@@ -315,7 +315,7 @@
    {\
    heapframe *newframe = frame;\
    frame = newframe->Xprevframe;\
-  (pcre_stack_free)(newframe);\
+  (erts_pcre_stack_free_f)(newframe);\
    if (frame != NULL)\
      {\
      rrc = ra;\
@@ -491,11 +491,11 @@
    EDEBUGF(("Break restore!"));
    goto LOOP_COUNT_RETURN;
  }
-frame = (pcre_stack_malloc)(sizeof(heapframe));
+frame = (erts_pcre_stack_malloc_f)(sizeof(heapframe));
  #else
  #define COST(N)
  #define COST_CHK(N)
-heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe));
+heapframe *frame = (erts_pcre_stack_malloc_f)(sizeof(heapframe));
  #endif

  frame->Xprevframe = NULL;            /* Marks the top level */
@@ -1038,7 +1038,7 @@
      function is able to force a failure. */

      case OP_CALLOUT:
-    if (pcre_callout != NULL)
+    if (erts_pcre_callout_f != NULL)
        {
        pcre_callout_block cb;
        cb.version          = 1;   /* Version 1 of the callout block */
@@ -1053,7 +1053,7 @@
        cb.capture_top      = offset_top/2;
        cb.capture_last     = md->capture_last;
        cb.callout_data     = md->callout_data;
-      if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH);
+      if ((rrc = (*erts_pcre_callout_f)(&cb)) > 0) RRETURN(MATCH_NOMATCH);
        if (rrc < 0) RRETURN(rrc);
        }
      ecode += 2 + 2*LINK_SIZE;
@@ -1102,7 +1102,7 @@
        else
          {
          new_recursive.offset_save =
-          (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int));
+          (int *)(erts_pcre_malloc_f)(new_recursive.saved_max * 
sizeof(int));
          if (new_recursive.offset_save == NULL) 
RRETURN(PCRE_ERROR_NOMEMORY);
          }

@@ -1125,7 +1125,7 @@
            DPRINTF(("Recursion matched\n"));
            md->recursive = new_recursive.prevrec;
            if (new_recursive.offset_save != stacksave)
-            (pcre_free)(new_recursive.offset_save);
+            (erts_pcre_free_f)(new_recursive.offset_save);
            RRETURN(MATCH_MATCH);
            }
          else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN)
@@ -1144,7 +1144,7 @@
        DPRINTF(("Recursion didn't match\n"));
        md->recursive = new_recursive.prevrec;
        if (new_recursive.offset_save != stacksave)
-        (pcre_free)(new_recursive.offset_save);
+        (erts_pcre_free_f)(new_recursive.offset_save);
        RRETURN(MATCH_NOMATCH);
        }
      /* Control never reaches here */
@@ -4442,7 +4442,7 @@
     utf8 = newframe->Xcur_is_word;
     minimize = newframe->Xcondition;
     possessive = newframe->Xprev_is_word;
-   (pcre_stack_free)(newframe);
+   (erts_pcre_stack_free_f)(newframe);
     EDEBUGF(("LOOP_COUNT_RETURN: %d",frame->Xwhere));
     switch (frame->Xwhere)
       {
@@ -4467,7 +4467,7 @@
     * possessive                     Xprev_is_word
     */
    {
-    heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));
+    heapframe *newframe = (erts_pcre_stack_malloc_f)(sizeof(heapframe));
      newframe->Xprevframe = frame;
      newframe->Xop = rrc;
      newframe->Xfi = i;
@@ -4489,7 +4489,7 @@
  static void free_saved_match_state(heapframe *top) {
    while (top != NULL) {
      heapframe *nxt = top->Xprevframe;
-     (pcre_stack_free)(top);
+     (erts_pcre_stack_free_f)(top);
       top = nxt;
    }
  }
@@ -4617,7 +4617,7 @@
  #endif

  PCRE_EXP_DEFN int
-pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
+erts_pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
    PCRE_SPTR subject, int length, int start_offset, int options, int 
*offsets,
    int offsetcount)
  {
@@ -4721,7 +4721,7 @@
   } else {
     if (extra_data != NULL &&
         (extra_data->flags & PCRE_EXTRA_LOOP_LIMIT)) {
-     exec_context = (PcreExecContext *) 
(pcre_malloc)(sizeof(PcreExecContext));
+     exec_context = (PcreExecContext *) 
(erts_pcre_malloc_f)(sizeof(PcreExecContext));
       *(extra_data->restart_data) = (void *) exec_context;
       /* need freeing by special routine from client */
     } else {
@@ -4944,7 +4944,7 @@
  if (re->top_backref > 0 && re->top_backref >= ocount/3)
    {
    ocount = re->top_backref * 3 + 3;
-  md->offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
+  md->offset_vector = (int *)(erts_pcre_malloc_f)(ocount * sizeof(int));
    if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
    using_temporary_offsets = TRUE;
    DPRINTF(("Got memory to hold back references\n"));
@@ -5304,10 +5304,10 @@
  #ifdef ERLANG_INTEGRATION
      if (extra_data == NULL ||
  	!(extra_data->flags & PCRE_EXTRA_LOOP_LIMIT)) {
-	(pcre_free)(md->offset_vector);
+	(erts_pcre_free_f)(md->offset_vector);
      }
  #else
-	(pcre_free)(md->offset_vector);
+	(erts_pcre_free_f)(md->offset_vector);
  #endif
      }

@@ -5336,7 +5336,7 @@
  if (using_temporary_offsets)
    {
    DPRINTF(("Freeing temporary memory\n"));
-  (pcre_free)(md->offset_vector);
+  (erts_pcre_free_f)(md->offset_vector);
    }

  if (rc != MATCH_NOMATCH)
@@ -5375,16 +5375,16 @@
  #undef re
  #undef ims

-void pcre_free_restart_data(void *restart_data) {
+void erts_pcre_free_restart_data(void *restart_data) {
    PcreExecContext *top = (PcreExecContext *) restart_data;
    /* We might be done, or we might not, so there might be some saved 
match_states here */
    if (top != NULL) {
      match_data *md = top->Xmd;
      if (top->Xusing_temporary_offsets && md->offset_vector != NULL) {
-	(pcre_free)(md->offset_vector);
+	(erts_pcre_free_f)(md->offset_vector);
      }
      free_saved_match_state(top->Xmd->state_save);
-    (pcre_free)(top);
+    (erts_pcre_free_f)(top);
    }
  }
  #endif
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_fullinfo.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_fullinfo.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_fullinfo.c	2008-11-24 
08:48:37.874225285 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_fullinfo.c	2008-11-24 
09:11:46.425871337 -0600
@@ -66,8 +66,8 @@
  */

  PCRE_EXP_DEFN int
-pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, 
int what,
-  void *where)
+erts_pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data,
+                 int what, void *where)
  {
  real_pcre internal_re;
  pcre_study_data internal_study;
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_get.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_get.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_get.c	2008-11-24 
08:48:37.896368417 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_get.c	2008-11-24 
12:42:06.283498362 -0600
@@ -65,21 +65,22 @@
                  (PCRE_ERROR_NOSUBSTRING) if not found
  */

+PCRE_EXP_DEFN
  int
-pcre_get_stringnumber(const pcre *code, const char *stringname)
+erts_pcre_get_stringnumber(const pcre *code, const char *stringname)
  {
  int rc;
  int entrysize;
  int top, bot;
  uschar *nametable;

-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
+if ((rc = erts_pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
    return rc;
  if (top <= 0) return PCRE_ERROR_NOSUBSTRING;

-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, 
&entrysize)) != 0)
+if ((rc = erts_pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, 
&entrysize)) != 0)
    return rc;
-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
+if ((rc = erts_pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, 
&nametable)) != 0)
    return rc;

  bot = 0;
@@ -114,8 +115,9 @@
                  (PCRE_ERROR_NOSUBSTRING) if not found
  */

+PCRE_EXP_DEFN
  int
-pcre_get_stringtable_entries(const pcre *code, const char *stringname,
+erts_pcre_get_stringtable_entries(const pcre *code, const char *stringname,
    char **firstptr, char **lastptr)
  {
  int rc;
@@ -123,13 +125,13 @@
  int top, bot;
  uschar *nametable, *lastentry;

-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
+if ((rc = erts_pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
    return rc;
  if (top <= 0) return PCRE_ERROR_NOSUBSTRING;

-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, 
&entrysize)) != 0)
+if ((rc = erts_pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, 
&entrysize)) != 0)
    return rc;
-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
+if ((rc = erts_pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, 
&nametable)) != 0)
    return rc;

  lastentry = nametable + entrysize * (top - 1);
@@ -190,8 +192,8 @@
  char *first, *last;
  uschar *entry;
  if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) 
== 0)
-  return pcre_get_stringnumber(code, stringname);
-entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);
+  return erts_pcre_get_stringnumber(code, stringname);
+entrysize = erts_pcre_get_stringtable_entries(code, stringname, &first, 
&last);
  if (entrysize <= 0) return entrysize;
  for (entry = (uschar *)first; entry <= (uschar *)last; entry += entrysize)
    {
@@ -231,8 +233,9 @@
                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
  */

+PCRE_EXP_DEFN
  int
-pcre_copy_substring(const char *subject, int *ovector, int stringcount,
+erts_pcre_copy_substring(const char *subject, int *ovector, int 
stringcount,
    int stringnumber, char *buffer, int size)
  {
  int yield;
@@ -276,13 +279,14 @@
                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
  */

+PCRE_EXP_DEFN
  int
-pcre_copy_named_substring(const pcre *code, const char *subject, int 
*ovector,
+erts_pcre_copy_named_substring(const pcre *code, const char *subject, 
int *ovector,
    int stringcount, const char *stringname, char *buffer, int size)
  {
  int n = get_first_set(code, stringname, ovector);
  if (n <= 0) return n;
-return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
+return erts_pcre_copy_substring(subject, ovector, stringcount, n, 
buffer, size);
  }


@@ -308,8 +312,9 @@
                     PCRE_ERROR_NOMEMORY (-6) failed to get store
  */

+PCRE_EXP_DEFN
  int
-pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
+erts_pcre_get_substring_list(const char *subject, int *ovector, int 
stringcount,
    const char ***listptr)
  {
  int i;
@@ -321,7 +326,7 @@
  for (i = 0; i < double_count; i += 2)
    size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;

-stringlist = (char **)(pcre_malloc)(size);
+stringlist = (char **)(erts_pcre_malloc_f)(size);
  if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;

  *listptr = (const char **)stringlist;
@@ -353,10 +358,11 @@
  Returns:    nothing
  */

+PCRE_EXP_DEFN
  void
-pcre_free_substring_list(const char **pointer)
+erts_pcre_free_substring_list(const char **pointer)
  {
-(pcre_free)((void *)pointer);
+(erts_pcre_free_f)((void *)pointer);
  }


@@ -386,8 +392,9 @@
                     PCRE_ERROR_NOSUBSTRING (-7) substring not present
  */

+PCRE_EXP_DEFN
  int
-pcre_get_substring(const char *subject, int *ovector, int stringcount,
+erts_pcre_get_substring(const char *subject, int *ovector, int stringcount,
    int stringnumber, const char **stringptr)
  {
  int yield;
@@ -396,7 +403,7 @@
    return PCRE_ERROR_NOSUBSTRING;
  stringnumber *= 2;
  yield = ovector[stringnumber+1] - ovector[stringnumber];
-substring = (char *)(pcre_malloc)(yield + 1);
+substring = (char *)(erts_pcre_malloc_f)(yield + 1);
  if (substring == NULL) return PCRE_ERROR_NOMEMORY;
  memcpy(substring, subject + ovector[stringnumber], yield);
  substring[yield] = 0;
@@ -433,13 +440,14 @@
                     PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
  */

+PCRE_EXP_DEFN
  int
-pcre_get_named_substring(const pcre *code, const char *subject, int 
*ovector,
+erts_pcre_get_named_substring(const pcre *code, const char *subject, 
int *ovector,
    int stringcount, const char *stringname, const char **stringptr)
  {
  int n = get_first_set(code, stringname, ovector);
  if (n <= 0) return n;
-return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
+return erts_pcre_get_substring(subject, ovector, stringcount, n, 
stringptr);
  }


@@ -456,10 +464,11 @@
  Returns:    nothing
  */

+PCRE_EXP_DEFN
  void
-pcre_free_substring(const char *pointer)
+erts_pcre_free_substring(const char *pointer)
  {
-(pcre_free)((void *)pointer);
+(erts_pcre_free_f)((void *)pointer);
  }

  /* End of pcre_get.c */
Only in otp_src_R12B-5/erts/emulator/pcre: pcre_get.c~
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_globals.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_globals.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_globals.c	2008-11-24 
08:48:37.876134005 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_globals.c	2008-11-24 
09:22:21.490581180 -0600
@@ -53,11 +53,11 @@
  #include "pcre_internal.h"

  #ifndef VPCOMPAT
-PCRE_EXP_DATA_DEFN void *(*pcre_malloc)(size_t) = malloc;
-PCRE_EXP_DATA_DEFN void  (*pcre_free)(void *) = free;
-PCRE_EXP_DATA_DEFN void *(*pcre_stack_malloc)(size_t) = malloc;
-PCRE_EXP_DATA_DEFN void  (*pcre_stack_free)(void *) = free;
-PCRE_EXP_DATA_DEFN int   (*pcre_callout)(pcre_callout_block *) = NULL;
+PCRE_EXP_DATA_DEFN void *(*erts_pcre_malloc_f)(size_t) = malloc;
+PCRE_EXP_DATA_DEFN void  (*erts_pcre_free_f)(void *) = free;
+PCRE_EXP_DATA_DEFN void *(*erts_pcre_stack_malloc_f)(size_t) = malloc;
+PCRE_EXP_DATA_DEFN void  (*erts_pcre_stack_free_f)(void *) = free;
+PCRE_EXP_DATA_DEFN int   (*erts_pcre_callout_f)(pcre_callout_block *) = 
NULL;
  #endif

  /* End of pcre_globals.c */
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre.h 
otp_src_R12B-5/erts/emulator/pcre/pcre.h
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre.h	2008-11-24 
08:48:37.895104421 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre.h	2008-11-24 
09:17:42.955780881 -0600
@@ -261,55 +261,55 @@
  have to take another form. */

  #ifndef VPCOMPAT
-PCRE_EXP_DECL void *(*pcre_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_free)(void *);
-PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);
+PCRE_EXP_DECL void *(*erts_pcre_malloc_f)(size_t);
+PCRE_EXP_DECL void  (*erts_pcre_free_f)(void *);
+PCRE_EXP_DECL void *(*erts_pcre_stack_malloc_f)(size_t);
+PCRE_EXP_DECL void  (*erts_pcre_stack_free_f)(void *);
+PCRE_EXP_DECL int   (*erts_pcre_callout_f)(pcre_callout_block *);
  #else   /* VPCOMPAT */
-PCRE_EXP_DECL void *pcre_malloc(size_t);
-PCRE_EXP_DECL void  pcre_free(void *);
-PCRE_EXP_DECL void *pcre_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre_stack_free(void *);
-PCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);
+PCRE_EXP_DECL void *erts_pcre_malloc_f(size_t);
+PCRE_EXP_DECL void  erts_pcre_free_f(void *);
+PCRE_EXP_DECL void *erts_pcre_stack_malloc_f(size_t);
+PCRE_EXP_DECL void  erts_pcre_stack_free_f(void *);
+PCRE_EXP_DECL int   erts_pcre_callout_f(pcre_callout_block *);
  #endif  /* VPCOMPAT */

  /* Exported PCRE functions */

-PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,
+PCRE_EXP_DECL pcre *erts_pcre_compile(const char *, int, const char **, 
int *,
                    const unsigned char *);
-PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,
+PCRE_EXP_DECL pcre *erts_pcre_compile2(const char *, int, int *, const 
char **,
                    int *, const unsigned char *);
-PCRE_EXP_DECL int  pcre_config(int, void *);
-PCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,
+PCRE_EXP_DECL int  erts_pcre_config(int, void *);
+PCRE_EXP_DECL int  erts_pcre_copy_named_substring(const pcre *, const 
char *,
                    int *, int, const char *, char *, int);
-PCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int, 
char *,
+PCRE_EXP_DECL int  erts_pcre_copy_substring(const char *, int *, int, 
int, char *,
                    int);
-PCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,
+PCRE_EXP_DECL int  erts_pcre_dfa_exec(const pcre *, const pcre_extra *,
                    const char *, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
+PCRE_EXP_DECL int  erts_pcre_exec(const pcre *, const pcre_extra *, 
PCRE_SPTR,
                     int, int, int, int *, int);
-PCRE_EXP_DECL void pcre_free_substring(const char *);
-PCRE_EXP_DECL void pcre_free_substring_list(const char **);
-PCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,
+PCRE_EXP_DECL void erts_pcre_free_substring(const char *);
+PCRE_EXP_DECL void erts_pcre_free_substring_list(const char **);
+PCRE_EXP_DECL int  erts_pcre_fullinfo(const pcre *, const pcre_extra *, 
int,
                    void *);
-PCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,
+PCRE_EXP_DECL int  erts_pcre_get_named_substring(const pcre *, const 
char *,
                    int *, int, const char *, const char **);
-PCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);
-PCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,
+PCRE_EXP_DECL int  erts_pcre_get_stringnumber(const pcre *, const char *);
+PCRE_EXP_DECL int  erts_pcre_get_stringtable_entries(const pcre *, 
const char *,
                    char **, char **);
-PCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,
+PCRE_EXP_DECL int  erts_pcre_get_substring(const char *, int *, int, int,
                    const char **);
-PCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,
+PCRE_EXP_DECL int  erts_pcre_get_substring_list(const char *, int *, int,
                    const char ***);
-PCRE_EXP_DECL int  pcre_info(const pcre *, int *, int *);
-PCRE_EXP_DECL const unsigned char *pcre_maketables(void);
-PCRE_EXP_DECL int  pcre_refcount(pcre *, int);
-PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);
-PCRE_EXP_DECL const char *pcre_version(void);
+PCRE_EXP_DECL int  erts_pcre_info(const pcre *, int *, int *);
+PCRE_EXP_DECL const unsigned char *erts_pcre_maketables(void);
+PCRE_EXP_DECL int  erts_pcre_refcount(pcre *, int);
+PCRE_EXP_DECL pcre_extra *erts_pcre_study(const pcre *, int, const char 
**);
+PCRE_EXP_DECL const char *erts_pcre_version(void);

  #ifdef ERLANG_INTEGRATION
-PCRE_EXP_DECL void  pcre_free_restart_data(void *restart_data);
+PCRE_EXP_DECL void  erts_pcre_free_restart_data(void *restart_data);
  #endif
  #ifdef __cplusplus
  }  /* extern "C" */
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_info.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_info.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_info.c	2008-11-24 
08:48:37.876051985 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_info.c	2008-11-24 
09:11:44.595525247 -0600
@@ -73,7 +73,7 @@
  */

  PCRE_EXP_DEFN int
-pcre_info(const pcre *argument_re, int *optptr, int *first_byte)
+erts_pcre_info(const pcre *argument_re, int *optptr, int *first_byte)
  {
  real_pcre internal_re;
  const real_pcre *re = (const real_pcre *)argument_re;
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_maketables.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_maketables.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_maketables.c	2008-11-24 
08:48:37.897015923 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_maketables.c	2008-11-24 
09:22:27.483868368 -0600
@@ -73,7 +73,7 @@
  int i;

  #ifndef DFTABLES
-yield = (unsigned char*)(pcre_malloc)(tables_length);
+yield = (unsigned char*)(erts_pcre_malloc_f)(tables_length);
  #else
  yield = (unsigned char*)malloc(tables_length);
  #endif
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_refcount.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_refcount.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_refcount.c	2008-11-24 
08:48:37.896195159 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_refcount.c	2008-11-24 
09:11:42.645337836 -0600
@@ -69,7 +69,7 @@
  */

  PCRE_EXP_DEFN int
-pcre_refcount(pcre *argument_re, int adjust)
+erts_pcre_refcount(pcre *argument_re, int adjust)
  {
  real_pcre *re = (real_pcre *)argument_re;
  if (re == NULL) return PCRE_ERROR_NULL;
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_study.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_study.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_study.c	2008-11-24 
08:48:37.896931557 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_study.c	2008-11-24 
09:19:15.702477776 -0600
@@ -496,7 +496,7 @@
  */

  PCRE_EXP_DEFN pcre_extra *
-pcre_study(const pcre *external_re, int options, const char **errorptr)
+erts_pcre_study(const pcre *external_re, int options, const char 
**errorptr)
  {
  uschar start_bits[32];
  pcre_extra *extra;
@@ -556,7 +556,7 @@
  the pcre_fullinfo() function so that if it becomes variable in the 
future, we
  don't have to change that code. */

-extra = (pcre_extra *)(pcre_malloc)
+extra = (pcre_extra *)(erts_pcre_malloc_f)
    (sizeof(pcre_extra) + sizeof(pcre_study_data));

  if (extra == NULL)
diff -ur otp_src_R12B-5.orig/erts/emulator/pcre/pcre_version.c 
otp_src_R12B-5/erts/emulator/pcre/pcre_version.c
--- otp_src_R12B-5.orig/erts/emulator/pcre/pcre_version.c	2008-11-24 
08:48:37.896282894 -0600
+++ otp_src_R12B-5/erts/emulator/pcre/pcre_version.c	2008-11-24 
09:11:38.519598556 -0600
@@ -80,7 +80,7 @@
  the STRING macro with an empty argument when doing the test. */

  PCRE_EXP_DEFN const char *
-pcre_version(void)
+erts_pcre_version(void)
  {
  return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)?
    XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) :


--
paul



More information about the erlang-bugs mailing list