diff options
author | pierre <pierre@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2012-01-19 14:01:47 +0000 |
---|---|---|
committer | pierre <pierre@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2012-01-19 14:01:47 +0000 |
commit | 6c6bbf7f8f24d2e142201f7f6a6e195ff9c27d20 (patch) | |
tree | d045b228d17e3c90ef883ad12fb5dd228e45c5ed /packages/gdbint | |
parent | 748db5be0c392c69f8cad2d808c19129469f60d9 (diff) | |
download | fpc-6c6bbf7f8f24d2e142201f7f6a6e195ff9c27d20.tar.gz |
* Try to fix go32v2 problems related to DJGPP code using C free on _environ ppchar by reallcating with malloc
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@20111 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/gdbint')
-rw-r--r-- | packages/gdbint/src/gdbint.pp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/packages/gdbint/src/gdbint.pp b/packages/gdbint/src/gdbint.pp index 41f55a4dd9..09b1e358d4 100644 --- a/packages/gdbint/src/gdbint.pp +++ b/packages/gdbint/src/gdbint.pp @@ -855,8 +855,11 @@ type jmp_buf = dpmi_jmp_buf; pjmp_buf = pdpmi_jmp_buf; + function setjmp(var rec : jmp_buf) : longint;cdecl;external; + function malloc(size : longint) : pointer;cdecl;external; + procedure longjmp(var rec : jmp_buf;return_value : longint);cdecl;external; procedure reload_fs;assembler; @@ -3102,6 +3105,32 @@ var c_environ : ppchar;external name '_environ'; c_argc : longint;external name '___crt0_argc'; c_argv : ppchar;external name '___crt0_argv'; + + procedure ReallocateEnvironUsingCMalloc; + + var + neededsize , count : longint; + penv : pchar; + newenv : ppchar; + begin + if not assigned(c_environ) then + neededsize:=0 + else + begin + count:=0; + penv:=c_environ^; + while assigned(penv) do + begin + inc(count); + inc(penv,sizeof(pchar)); + end; + neededsize:=count*sizeof(pchar); + end; + newenv:=malloc(neededsize); + system.move(c_environ,newenv,neededsize); + c_environ:=newenv; + end; + {$endif def go32v2} var current_directory : pchar; cvar; external; @@ -3140,7 +3169,9 @@ var save_gdb_stderr : pui_file; begin {$ifdef go32v2} - c_environ:=system.envp; + { c_environ:=system.envp; } + { DJGPP libC presupposes the c_enivron was malloc'ated } + ReallocateEnvironUsingCMalloc; c_argc:=system.argc; c_argv:=system.argv; {$endif def go32v2} |