------- You are receiving this mail because: ------- You are on the CC list for the bug.
http://bugs.exim.org/show_bug.cgi?id=1209 Summary: Calling pcre_free from C# causes a memory access violation Product: PCRE Version: 8.20 Platform: x86-64 OS/Version: Windows Status: NEW Severity: bug Priority: high Component: Code AssignedTo: [email protected] ReportedBy: [email protected] CC: [email protected] I have been using a 64 bit version of the pree3.dll from a C# application because the Microsoft implementation of Regex was too slow for our needs. I am import the pcre3.dll function pcre_compile, pcre_exec and pcre_free. I can get a compiled pcre object and sucessfully passit to pcre_exec to find a match. However when I have finished with the object and try to release the pointer passed back to me from pcre_Compile by calling pcre_free and passing the pointer to that function I get an AccessViolationException thrown. If I do not delete the pointer to the compiled regex I am leaking 2 bytes every time I call the write function. Is this the correct mechanism to delete the compiled regex object? Here is a sample of the code: [DllImport("pcre3.dll")] private static extern IntPtr pcre_compile(string sPattern, int Options, ref String ErrorMsg, ref int ErrorOffset, string Unknown); [DllImport("pcre3.dll")] private static extern int pcre_exec(IntPtr re, string ExtraData, string SourceData, int SourceDataLen, int Offset, int Options, int[] SubStrings, int SubStringsCount); [DllImport("pcre3.dll")] private static extern void pcre_free(IntPtr re); public override void Write(byte[] buffer, int offset, int count) { StringBuilder sb = new StringBuilder( this.Encoding.GetString(buffer)); IntPtr staticContentRegex = IntPtr.Zero; try { int Options = 0x00000001 | 0x00000002; //caseless option and multiline valid for pcre_compile only staticContentRegex = pcre_compile(REGEX_GET_STATIC_CONTENT, Options, ref ErrorMsg, ref iErrorOffset, null); if (sb.Length > 0) { int StartOffset = offset; int iNumMatches = 0; do { iNumMatches = pcre_exec(staticContentRegex, null, sb.ToString(), sb.Length, StartOffset, 0, ovector, OVECCOUNT); if (iNumMatches > 0) { //ovector contains the start and end byte of each match as a pair //so we increment by 2 for (int i = 0; i < iNumMatches * 2; i += 2) { int MatchLength = ovector[i + 1] - ovector[i]; char[] Matched = new char[MatchLength]; sb.CopyTo(ovector[i], Matched, 0, MatchLength); string Hashed = Evaluate(this.Encoding.GetString(this.Encoding.GetBytes(Matched))); sb.Remove(ovector[i], MatchLength); sb.Insert(ovector[i], Hashed); StartOffset = ovector[i + 1] + Hashed.Length + 1; //Set the new Start position for the next pass } } } while (iNumMatches > 0); byte[] bufferOut = this.Encoding.GetBytes(sb.ToString()); this.BaseFilter.Write(bufferOut, 0, bufferOut.Length); } } catch (Exception) { } finally { sb = null; if (IntPtr.Zero != staticContentRegex) { pcre_free(staticContentRegex); //exception thrown here staticContentRegex = IntPtr.Zero; } } } -- Configure bugmail: http://bugs.exim.org/userprefs.cgi?tab=email -- ## List details at https://lists.exim.org/mailman/listinfo/pcre-dev
