Patchwork revlog: ensure that flags do not overflow 2 bytes

login
register
mail settings
Submitter Cotizo Sima
Date Nov. 25, 2016, 1:24 p.m.
Message ID <4b311b730614941db640.1480080290@devvm800.lla2.facebook.com>
Download mbox | patch
Permalink /patch/17755/
State Changes Requested
Headers show

Comments

Cotizo Sima - Nov. 25, 2016, 1:24 p.m.
# HG changeset patch
# User Cotizo Sima <cotizo@fb.com>
# Date 1480079985 28800
#      Fri Nov 25 05:19:45 2016 -0800
# Node ID 4b311b730614941db6409f560ab9451bec74be75
# Parent  a3163433647108b7bec8fc45896db1c20b18ab21
revlog: ensure that flags do not overflow 2 bytes

This patch adds a line that ensures we are not setting by mistake a set of flags
overlfowing the 2 bytes they are allocated. Given the way the data is packed in
the revlog header, overflowing 2 bytes will result in setting a wrong offset.
Gregory Szorc - Nov. 25, 2016, 5:27 p.m.
On Fri, Nov 25, 2016 at 5:24 AM, Cotizo Sima <cotizo@fb.com> wrote:

> # HG changeset patch
> # User Cotizo Sima <cotizo@fb.com>
> # Date 1480079985 28800
> #      Fri Nov 25 05:19:45 2016 -0800
> # Node ID 4b311b730614941db6409f560ab9451bec74be75
> # Parent  a3163433647108b7bec8fc45896db1c20b18ab21
> revlog: ensure that flags do not overflow 2 bytes
>
> This patch adds a line that ensures we are not setting by mistake a set of
> flags
> overlfowing the 2 bytes they are allocated. Given the way the data is
> packed in
> the revlog header, overflowing 2 bytes will result in setting a wrong
> offset.
>
> diff --git a/mercurial/revlog.py b/mercurial/revlog.py
> --- a/mercurial/revlog.py
> +++ b/mercurial/revlog.py
> @@ -72,6 +72,7 @@
>      return int(q & 0xFFFF)
>
>  def offset_type(offset, type):
> +    type &= 0xFFFF
>      return long(long(offset) << 16 | type)
>
>  _nullhash = hashlib.sha1(nullid)
>
>
I'm a believer in failing fast. If this new code comes into play, we've
already lost to a bug. I think instead we should raise ValueError if type >
65535.

Patch

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -72,6 +72,7 @@ 
     return int(q & 0xFFFF)
 
 def offset_type(offset, type):
+    type &= 0xFFFF
     return long(long(offset) << 16 | type)
 
 _nullhash = hashlib.sha1(nullid)