mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 08:00:52 +02:00
* fix for Mantis #37745: section names where the string offset has more than 7 digits need to be Base64 encoded
git-svn-id: trunk@46876 -
This commit is contained in:
parent
fb767dc246
commit
d1cd26592a
@ -914,6 +914,64 @@ const pemagic : array[0..3] of byte = (
|
||||
end;
|
||||
|
||||
|
||||
function encodeBase64(p:aword):string;
|
||||
const
|
||||
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
|
||||
'abcdefghijklmnopqrstuvwxyz' +
|
||||
'0123456789+/';
|
||||
var
|
||||
i,
|
||||
idx,
|
||||
rem : longint;
|
||||
begin
|
||||
setlength(result,6);
|
||||
|
||||
idx := 6;
|
||||
for i:=0 to 5 do
|
||||
begin
|
||||
rem:=p mod 64;
|
||||
p:=p div 64;
|
||||
result[idx]:=alphabet[rem+1];
|
||||
dec(idx);
|
||||
end;
|
||||
|
||||
if p<>0 then
|
||||
internalerror(2020091601);
|
||||
end;
|
||||
|
||||
|
||||
function decodeBase64(const s:string;out p:longint):boolean;
|
||||
var
|
||||
i : longint;
|
||||
v : aword;
|
||||
begin
|
||||
if length(s)>6 then
|
||||
exit(false);
|
||||
|
||||
p:=0;
|
||||
for i:=1 to length(s) do
|
||||
begin
|
||||
v:=0;
|
||||
if (s[i]>='A') and (s[i]<='Z') then // 0..25
|
||||
v:=Ord(s[i])-Ord('A')
|
||||
else if (s[i]>='a') and (s[i]<='z') then // 26..51
|
||||
v:=Ord(s[i])-Ord('a')+26
|
||||
else if (s[i]>='0') and (s[i]<='9') then // 52..61
|
||||
v:=Ord(s[i])-Ord('0')+52
|
||||
else if s[i]='+' then // 62
|
||||
v:=62
|
||||
else if s[i]='/' then // 63
|
||||
v:=63
|
||||
else
|
||||
exit(false);
|
||||
|
||||
p:=(p*64)+v;
|
||||
end;
|
||||
|
||||
result:=true;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
TCoffObjSection
|
||||
****************************************************************************}
|
||||
@ -1652,7 +1710,10 @@ const pemagic : array[0..3] of byte = (
|
||||
strpos:=FCoffStrs.size+4;
|
||||
FCoffStrs.writestr(s);
|
||||
FCoffStrs.writestr(#0);
|
||||
s:='/'+ToStr(strpos);
|
||||
if strpos>=10000000 then
|
||||
s:='//'+encodeBase64(strpos)
|
||||
else
|
||||
s:='/'+ToStr(strpos);
|
||||
if length(s)>8 then
|
||||
internalerror(2020091501);
|
||||
end;
|
||||
@ -2325,13 +2386,26 @@ const pemagic : array[0..3] of byte = (
|
||||
secname:=strpas(secnamebuf);
|
||||
if secname[1]='/' then
|
||||
begin
|
||||
Val(Copy(secname,2,8),strpos,code);
|
||||
if code=0 then
|
||||
secname:=Read_str(strpos)
|
||||
if secname[2]='/' then
|
||||
begin
|
||||
if not decodeBase64(copy(secname,3,8),strpos) then
|
||||
begin
|
||||
InputError('Error reading COFF Section Headers');
|
||||
secname:='error';
|
||||
end
|
||||
else
|
||||
secname:=Read_str(strpos);
|
||||
end
|
||||
else
|
||||
begin
|
||||
InputError('Error reading COFF Section Headers');
|
||||
secname:='error';
|
||||
Val(Copy(secname,2,8),strpos,code);
|
||||
if code=0 then
|
||||
secname:=Read_str(strpos)
|
||||
else
|
||||
begin
|
||||
InputError('Error reading COFF Section Headers');
|
||||
secname:='error';
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if win32 then
|
||||
|
Loading…
Reference in New Issue
Block a user