<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>118733</bug_id>
          
          <creation_ts>2013-07-16 07:45:06 -0700</creation_ts>
          <short_desc>Javascript JIT still allocates 2GB of memory on x86-64 Linux</short_desc>
          <delta_ts>2013-07-16 10:45:53 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>UNCONFIRMED</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Török Edwin">edwin+webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>barraclough</cc>
    
    <cc>oliver</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>908882</commentid>
    <comment_count>0</comment_count>
      <attachid>206778</attachid>
    <who name="Török Edwin">edwin+webkit</who>
    <bug_when>2013-07-16 07:45:06 -0700</bug_when>
    <thetext>Created attachment 206778
Use MAP_32BIT

See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=712387 for the original bugreport.

Currently the javascript JIT allocates 2GB on x86-64, to ensure that all jumps are within a 2GB range.
This causes problems without overcommit (or without a swapfile), even on a machine with 8GB of physical RAM.

Attached is a patch that uses MAP_32BIT, instead of the wasteful allocation of 2GB.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908903</commentid>
    <comment_count>1</comment_count>
      <attachid>206778</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2013-07-16 08:48:21 -0700</bug_when>
    <thetext>Comment on attachment 206778
Use MAP_32BIT

View in context: https://bugs.webkit.org/attachment.cgi?id=206778&amp;action=review

&gt; b/src/3rdparty/javascriptcore/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp:44
&gt; -#ifdef QT_USE_ONEGB_VMALLOCATOR
&gt; -    #define VM_POOL_SIZE (1024u * 1024u * 1024u) // 1Gb
&gt; -#else
&gt; -    #define VM_POOL_SIZE (2u * 1024u * 1024u * 1024u) // 2Gb
&gt; -#endif
&gt; +    // On x86-64, where we require all jumps to have a 2Gb max range we&apos;ll use
&gt; +    // MAP_32BIT
&gt; +    #define VM_POOL_SIZE (32u * 1024u * 1024u) // 32Mb

Nope, we aren&apos;t taking a 32Mb JIT segment on 64 bit, also this leads to an incorrect comment.

The comment also becomes wrong</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908904</commentid>
    <comment_count>2</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2013-07-16 08:54:00 -0700</bug_when>
    <thetext>(In reply to comment #0)
&gt; Created an attachment (id=206778) [details]
&gt; Use MAP_32BIT
&gt; 
&gt; See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=712387 for the original bugreport.
&gt; 
&gt; Currently the javascript JIT allocates 2GB on x86-64, to ensure that all jumps are within a 2GB range.
&gt; This causes problems without overcommit (or without a swapfile), even on a machine with 8GB of physical RAM.
&gt; 
&gt; Attached is a patch that uses MAP_32BIT, instead of the wasteful allocation of 2GB.

It doesn&apos;t use 2gig of memory, it reserves 2gig of address space.  I would be stunned if linux cannot handle reserving address space as that&apos;s a common technique used by garbage collectors.

32Mb is also vastly too small to successfully jit large pieces of JS so i&apos;ll assume that there were no perf tests run on this patch either.

I think the correct fix here is to find out how linux GCs reserve address space without having the VM allocate physical backing memory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908907</commentid>
    <comment_count>3</comment_count>
    <who name="Török Edwin">edwin+webkit</who>
    <bug_when>2013-07-16 09:03:25 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (In reply to comment #0)
&gt; &gt; Created an attachment (id=206778) [details] [details]
&gt; &gt; Use MAP_32BIT
&gt; &gt; 
&gt; &gt; See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=712387 for the original bugreport.
&gt; &gt; 
&gt; &gt; Currently the javascript JIT allocates 2GB on x86-64, to ensure that all jumps are within a 2GB range.
&gt; &gt; This causes problems without overcommit (or without a swapfile), even on a machine with 8GB of physical RAM.
&gt; &gt; 
&gt; &gt; Attached is a patch that uses MAP_32BIT, instead of the wasteful allocation of 2GB.
&gt; 
&gt; It doesn&apos;t use 2gig of memory, it reserves 2gig of address space.  I would be stunned if linux cannot handle reserving address space as that&apos;s a common technique used by garbage collectors.
&gt; 
&gt; 32Mb is also vastly too small to successfully jit large pieces of JS so i&apos;ll assume that there were no perf tests run on this patch either.

Right, I have tested this only with Qt/KDE, where JIT performance doesn&apos;t really matter (in fact I&apos;d be perfectly happy with disabling the JIT for it).

I haven&apos;t checked how the allocation code works, but won&apos;t it allocate more pools when it runs out of the 32MB?

I&apos;ve chosen 32MB because that is what the 32-bit code uses, but if a larger value would be more appropriate then both should be updated.

&gt; 
&gt; I think the correct fix here is to find out how linux GCs reserve address space without having the VM allocate physical backing memory.

There is a MAP_NORESERVE on the allocation but that doesn&apos;t seem to do what its supposed to: the OOM killer kicks in and starts killing applications once KWin+plasma-desktop+other applications exceed my physical RAM (8GB).
If I run the patched libqt4-script (which has the patched javascriptcore), then the memory usage of KDE is no longer &gt;2GB, and the OOM killer never kicks in.

Reserving 2GB of VIRT, for a feature that is not critical for the application is not really nice...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908912</commentid>
    <comment_count>4</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2013-07-16 09:15:18 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; &gt; 32Mb is also vastly too small to successfully jit large pieces of JS so i&apos;ll assume that there were no perf tests run on this patch either.
&gt; 
&gt; Right, I have tested this only with Qt/KDE, where JIT performance doesn&apos;t really matter (in fact I&apos;d be perfectly happy with disabling the JIT for it).
&gt;

Have you talked to any other Qt embedders? 
 
&gt; I haven&apos;t checked how the allocation code works, but won&apos;t it allocate more pools when it runs out of the 32MB?

No.  The whole point of the FixedVMPool is that there is a single region of the address space in which all hit compiled code goes, this allows us to guarantee that all jumps are within the 32bit range allowed by a direct PC relative branch

&gt; 
&gt; I&apos;ve chosen 32MB because that is what the 32-bit code uses, but if a larger value would be more appropriate then both should be updated.
&gt; 

Desktop 32-bit does not use the FixedVMPool, I think the only 32bit platform that uses it is iOS.


&gt; &gt; 
&gt; &gt; I think the correct fix here is to find out how linux GCs reserve address space without having the VM allocate physical backing memory.
&gt; 
&gt; There is a MAP_NORESERVE on the allocation but that doesn&apos;t seem to do what its supposed to: the OOM killer kicks in and starts killing applications once KWin+plasma-desktop+other applications exceed my physical RAM (8GB).
&gt; If I run the patched libqt4-script (which has the patched javascriptcore), then the memory usage of KDE is no longer &gt;2GB, and the OOM killer never kicks in.
&gt; 
&gt; Reserving 2GB of VIRT, for a feature that is not critical for the application is not really nice...

Reserving 2gig of address space when there are terabytes (exabytes?) of address space available should be fine.  JSC and FastMalloc both make extensive use of reserved but unused address space, this seems like something where we need to know exactly what needs to happen to get linux to do the right thing (I refuse to believe that the linux VM can&apos;t handle this given that even windows can)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908919</commentid>
    <comment_count>5</comment_count>
    <who name="Török Edwin">edwin+webkit</who>
    <bug_when>2013-07-16 09:25:00 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; &gt; 32Mb is also vastly too small to successfully jit large pieces of JS so i&apos;ll assume that there were no perf tests run on this patch either.
&gt; &gt; 
&gt; &gt; Right, I have tested this only with Qt/KDE, where JIT performance doesn&apos;t really matter (in fact I&apos;d be perfectly happy with disabling the JIT for it).
&gt; &gt;
&gt; 
&gt; Have you talked to any other Qt embedders? 
&gt; 
&gt; &gt; I haven&apos;t checked how the allocation code works, but won&apos;t it allocate more pools when it runs out of the 32MB?
&gt; 
&gt; No.  The whole point of the FixedVMPool is that there is a single region of the address space in which all hit compiled code goes, this allows us to guarantee that all jumps are within the 32bit range allowed by a direct PC relative branch

My patch uses MAP_32BIT to guarantee that jumps are within 32-bit range.

&gt; 
&gt; &gt; 
&gt; &gt; I&apos;ve chosen 32MB because that is what the 32-bit code uses, but if a larger value would be more appropriate then both should be updated.
&gt; &gt; 
&gt; 
&gt; Desktop 32-bit does not use the FixedVMPool, I think the only 32bit platform that uses it is iOS.
&gt; 
&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; I think the correct fix here is to find out how linux GCs reserve address space without having the VM allocate physical backing memory.
&gt; &gt; 
&gt; &gt; There is a MAP_NORESERVE on the allocation but that doesn&apos;t seem to do what its supposed to: the OOM killer kicks in and starts killing applications once KWin+plasma-desktop+other applications exceed my physical RAM (8GB).
&gt; &gt; If I run the patched libqt4-script (which has the patched javascriptcore), then the memory usage of KDE is no longer &gt;2GB, and the OOM killer never kicks in.
&gt; &gt; 
&gt; &gt; Reserving 2GB of VIRT, for a feature that is not critical for the application is not really nice...
&gt; 
&gt; Reserving 2gig of address space when there are terabytes (exabytes?) of address space available should be fine.  JSC and FastMalloc both make extensive use of reserved but unused address space, this seems like something where we need to know exactly what needs to happen to get linux to do the right thing (I refuse to believe that the linux VM can&apos;t handle this given that even windows can)

I&apos;ll try to write some standalone testcases with mmap to see what happens.
I&apos;m running Linux 3.10.1, it could be a regression kernel-side.

In general its better to not overcommit, unless you have to. In this case I think the 2GB reservation can be worked around by using MAP_32BIT, so it is not an absolute requirement to overcommit by that much.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908936</commentid>
    <comment_count>6</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2013-07-16 10:05:26 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; In general its better to not overcommit, unless you have to. In this case I think the 2GB reservation can be worked around by using MAP_32BIT, so it is not an absolute requirement to overcommit by that much.

Agreed – but note that the memory is being allocated by a method called &apos;reserveUncommitted&apos; – an implementation of this method should be allocating VM without committing, so there should be no overcommit.  Unfortuantely it appears that this is a little trickier to achieve on Linux than other platforms (Windows appears to win at best VM API for this particular use case) – but it seems to have been possible to coax Linux into doing so in the past, and the real fix here should be to get this going again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908938</commentid>
    <comment_count>7</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2013-07-16 10:08:40 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; &gt; 32Mb is also vastly too small to successfully jit large pieces of JS so i&apos;ll assume that there were no perf tests run on this patch either.
&gt; &gt; &gt; 
&gt; &gt; &gt; Right, I have tested this only with Qt/KDE, where JIT performance doesn&apos;t really matter (in fact I&apos;d be perfectly happy with disabling the JIT for it).
&gt; &gt; &gt;
&gt; &gt; 
&gt; &gt; Have you talked to any other Qt embedders? 
&gt; &gt; 
&gt; &gt; &gt; I haven&apos;t checked how the allocation code works, but won&apos;t it allocate more pools when it runs out of the 32MB?
&gt; &gt; 
&gt; &gt; No.  The whole point of the FixedVMPool is that there is a single region of the address space in which all hit compiled code goes, this allows us to guarantee that all jumps are within the 32bit range allowed by a direct PC relative branch
&gt; 
&gt; My patch uses MAP_32BIT to guarantee that jumps are within 32-bit range.

As long as the FixedVMPool is 2gig or less you get that guarantee.  MAP_32BIT is irrelevant to that.

Please read my replies, I said _No_.  The FixedVMPool allocator means we have a _fixed_ pool.  There is only one allocation.  There are no more after that.  All JIT code goes into that one allocation.  If that region is exhausted, and we&apos;re unable to reclaim sufficient space we will just drop our generated code at link time and fall back to the interpreter.

&gt; In general its better to not overcommit, unless you have to. In this case I think the 2GB reservation can be worked around by using MAP_32BIT, so it is not an absolute requirement to overcommit by that much.

What? MAP_32BIT is not an answer here.

Do you understand what this code is doing?  Your references to MAP_32BIT are confusing me.

My understanding of MAP_32BIT are that it is a linux flag to force page allocation in the low 4 gig of the 64 bit address space, that&apos;s all.  Is my understanding of that behavior correct?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908950</commentid>
    <comment_count>8</comment_count>
    <who name="Török Edwin">edwin+webkit</who>
    <bug_when>2013-07-16 10:45:53 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; &gt; &gt; 32Mb is also vastly too small to successfully jit large pieces of JS so i&apos;ll assume that there were no perf tests run on this patch either.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Right, I have tested this only with Qt/KDE, where JIT performance doesn&apos;t really matter (in fact I&apos;d be perfectly happy with disabling the JIT for it).
&gt; &gt; &gt; &gt;
&gt; &gt; &gt; 
&gt; &gt; &gt; Have you talked to any other Qt embedders? 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I haven&apos;t checked how the allocation code works, but won&apos;t it allocate more pools when it runs out of the 32MB?
&gt; &gt; &gt; 
&gt; &gt; &gt; No.  The whole point of the FixedVMPool is that there is a single region of the address space in which all hit compiled code goes, this allows us to guarantee that all jumps are within the 32bit range allowed by a direct PC relative branch
&gt; &gt; 
&gt; &gt; My patch uses MAP_32BIT to guarantee that jumps are within 32-bit range.
&gt; 
&gt; As long as the FixedVMPool is 2gig or less you get that guarantee.  MAP_32BIT is irrelevant to that.
&gt; 
&gt; Please read my replies, I said _No_.  The FixedVMPool allocator means we have a _fixed_ pool.  There is only one allocation.  There are no more after that.  All JIT code goes into that one allocation.  If that region is exhausted, and we&apos;re unable to reclaim sufficient space we will just drop our generated code at link time and fall back to the interpreter.
&gt; 
&gt; &gt; In general its better to not overcommit, unless you have to. In this case I think the 2GB reservation can be worked around by using MAP_32BIT, so it is not an absolute requirement to overcommit by that much.
&gt; 
&gt; What? MAP_32BIT is not an answer here.

&gt; 
&gt; Do you understand what this code is doing?  Your references to MAP_32BIT are confusing me.

Turns out my patch is indeed flawed, as I&apos;ve only read/patched the part of the code that showed up in gdb, and I somehow thought you would do multiple allocations and then MAP_32BIT could&apos;ve been used to keep them no more than 2GB apart. But that is ExecutableAllocatorPosix.cpp, not ExecutableAllocatorFixedVMPool.cpp.

So a possible solution would be to use ExecutableAllocatorPosix with MAP_32BIT, but lets first try to find out where the regression happened.
(I know when it happened, 2013-06-15 when I filed the Debian bug, but I upgraded Qt, KDE, and the kernel around the time.
I&apos;m still working on that mmap testcase, will let you know once I have a working testcase. Worst case I&apos;ll try downgrading packages one by one to figure out which is the culprit.)

&gt; 
&gt; My understanding of MAP_32BIT are that it is a linux flag to force page allocation in the low 4 gig of the 64 bit address space, that&apos;s all.  Is my understanding of that behavior correct?

manpage says lower 2GB:
 MAP_32BIT (since Linux 2.4.20, 2.6)
              Put the mapping into the first 2 Gigabytes of the process address  space.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>206778</attachid>
            <date>2013-07-16 07:45:06 -0700</date>
            <delta_ts>2013-07-16 08:48:20 -0700</delta_ts>
            <desc>Use MAP_32BIT</desc>
            <filename>jit_no_gb_mem.patch</filename>
            <type>text/plain</type>
            <size>1785</size>
            <attacher name="Török Edwin">edwin+webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtcnUgYS9zcmMvM3JkcGFydHkvamF2YXNjcmlwdGNvcmUvSmF2YVNjcmlwdENvcmUvaml0
L0V4ZWN1dGFibGVBbGxvY2F0b3JGaXhlZFZNUG9vbC5jcHAgYi9zcmMvM3JkcGFydHkvamF2YXNj
cmlwdGNvcmUvSmF2YVNjcmlwdENvcmUvaml0L0V4ZWN1dGFibGVBbGxvY2F0b3JGaXhlZFZNUG9v
bC5jcHAKLS0tIGEvc3JjLzNyZHBhcnR5L2phdmFzY3JpcHRjb3JlL0phdmFTY3JpcHRDb3JlL2pp
dC9FeGVjdXRhYmxlQWxsb2NhdG9yRml4ZWRWTVBvb2wuY3BwCTIwMTMtMDYtMDcgMDg6MTY6NTgu
MDAwMDAwMDAwICswMzAwCisrKyBiL3NyYy8zcmRwYXJ0eS9qYXZhc2NyaXB0Y29yZS9KYXZhU2Ny
aXB0Q29yZS9qaXQvRXhlY3V0YWJsZUFsbG9jYXRvckZpeGVkVk1Qb29sLmNwcAkyMDEzLTA3LTE2
IDEwOjI0OjA5LjU4OTEyMTEyNSArMDMwMApAQCAtMzksMTEgKzM5LDkgQEAKIAogI2lmIENQVShY
ODZfNjQpCiAgICAgLy8gVGhlc2UgbGltaXRzIHN1aXRhYmxlIG9uIDY0LWJpdCBwbGF0Zm9ybXMg
KHBhcnRpY3VsYXJseSB4ODYtNjQsIHdoZXJlIHdlIHJlcXVpcmUgYWxsIGp1bXBzIHRvIGhhdmUg
YSAyR2IgbWF4IHJhbmdlKS4KLSNpZmRlZiBRVF9VU0VfT05FR0JfVk1BTExPQ0FUT1IKLSAgICAj
ZGVmaW5lIFZNX1BPT0xfU0laRSAoMTAyNHUgKiAxMDI0dSAqIDEwMjR1KSAvLyAxR2IKLSNlbHNl
Ci0gICAgI2RlZmluZSBWTV9QT09MX1NJWkUgKDJ1ICogMTAyNHUgKiAxMDI0dSAqIDEwMjR1KSAv
LyAyR2IKLSNlbmRpZgorICAgIC8vIE9uIHg4Ni02NCwgd2hlcmUgd2UgcmVxdWlyZSBhbGwganVt
cHMgdG8gaGF2ZSBhIDJHYiBtYXggcmFuZ2Ugd2UnbGwgdXNlCisgICAgLy8gTUFQXzMyQklUCisg
ICAgI2RlZmluZSBWTV9QT09MX1NJWkUgKDMydSAqIDEwMjR1ICogMTAyNHUpIC8vIDMyTWIKICAg
ICAjZGVmaW5lIENPQUxFU0NFX0xJTUlUICgxNnUgKiAxMDI0dSAqIDEwMjR1KSAvLyAxNk1iCiAj
ZWxzZQogICAgIC8vIFRoZXNlIGxpbWl0cyBhcmUgaG9wZWZ1bGx5IHNlbnNpYmxlIG9uIGVtYmVk
ZGVkIHBsYXRmb3Jtcy4KQEAgLTMwOSw3ICszMDcsNyBAQAogICAgICAgICByYW5kb21Mb2NhdGlv
biArPSAoMSA8PCAyNCk7CiAgICAgICAgIHJhbmRvbUxvY2F0aW9uIDw8PSAyMTsKICNlbmRpZgot
ICAgICAgICBtX2Jhc2UgPSBtbWFwKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJhbmRvbUxvY2F0
aW9uKSwgbV90b3RhbEhlYXBTaXplLCBJTklUSUFMX1BST1RFQ1RJT05fRkxBR1MsIE1BUF9QUklW
QVRFIHwgTUFQX0FOT04gfCBNQVBfTk9SRVNFUlZFLCBWTV9UQUdfRk9SX0VYRUNVVEFCTEVBTExP
Q0FUT1JfTUVNT1JZLCAwKTsKKyAgICAgICAgbV9iYXNlID0gbW1hcChyZWludGVycHJldF9jYXN0
PHZvaWQqPihyYW5kb21Mb2NhdGlvbiksIG1fdG90YWxIZWFwU2l6ZSwgSU5JVElBTF9QUk9URUNU
SU9OX0ZMQUdTLCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OIHwgTUFQX05PUkVTRVJWRSB8IE1BUF8z
MkJJVCwgVk1fVEFHX0ZPUl9FWEVDVVRBQkxFQUxMT0NBVE9SX01FTU9SWSwgMCk7CiAgICAgICAg
IGlmIChtX2Jhc2UgPT0gTUFQX0ZBSUxFRCkKICAgICAgICAgICAgIENSQVNIKCk7CiAKT25seSBp
biBiL3NyYy8zcmRwYXJ0eS9qYXZhc2NyaXB0Y29yZS9KYXZhU2NyaXB0Q29yZS9qaXQ6IEV4ZWN1
dGFibGVBbGxvY2F0b3JGaXhlZFZNUG9vbC5jcHAub3JpZwpPbmx5IGluIGIvc3JjLzNyZHBhcnR5
L2phdmFzY3JpcHRjb3JlL0phdmFTY3JpcHRDb3JlL2ppdDogRXhlY3V0YWJsZUFsbG9jYXRvckZp
eGVkVk1Qb29sLmNwcC5yZWoK
</data>
<flag name="review"
          id="228498"
          type_id="1"
          status="-"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>