[PATCH 2 of 2 hggit-ext] stop dying if extras is malformed

Augie Fackler raf at durin42.com
Fri Sep 9 09:13:36 EDT 2016


On Mon, Sep 05, 2016 at 03:35:29AM -0700, Ryan McElroy wrote:
> # HG changeset patch
> # User Ryan McElroy <rmcelroy at fb.com>
> # Date 1473069864 25200
> #      Mon Sep 05 03:04:24 2016 -0700
> # Node ID 5ff208b6700caa6e846da492b2a309f6509fa9a3
> # Parent  d292469f5ce939d91eea9020758d7d6e6f308e0f
> stop dying if extras is malformed

These are queued. In the future please send hg-git patches to the
correct mailing list per CONTRIBUTING.

Thanks!

>
> A commit's extras field should be considered user-supplied input that can take
> any form. Trusting it to be properly formatted is dangerous and can prevent
> forward progress. Instead, swallow errors due to malformed extras and carry on.
>
> diff --git a/hggit/git_handler.py b/hggit/git_handler.py
> --- a/hggit/git_handler.py
> +++ b/hggit/git_handler.py
> @@ -464,6 +464,11 @@ class GitHandler(object):
>              self.export_hg_commit(ctx.node(), exporter)
>          self.ui.progress('exporting', None, total=total)
>
> +    def set_commiter_from_author(self, commit):
> +        commit.committer = commit.author
> +        commit.commit_time = commit.author_time
> +        commit.commit_timezone = commit.author_timezone
> +
>      # convert this commit into git objects
>      # go through the manifest, convert all blobs/trees we don't have
>      # write the commit object (with metadata info)
> @@ -489,25 +494,26 @@ class GitHandler(object):
>          commit.author_timezone = -timezone
>
>          if 'committer' in extra:
> -            # fixup timezone
> -            (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2)
> -            commit.committer = name
> -            commit.commit_time = timestamp
> +            try:
> +                # fixup timezone
> +                (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2)
> +                commit.committer = name
> +                commit.commit_time = timestamp
>
> -            # work around a timezone format change
> -            if int(timezone) % 60 != 0:  # pragma: no cover
> -                timezone = parse_timezone(timezone)
> -                # Newer versions of Dulwich return a tuple here
> -                if isinstance(timezone, tuple):
> -                    timezone, neg_utc = timezone
> -                    commit._commit_timezone_neg_utc = neg_utc
> -            else:
> -                timezone = -int(timezone)
> -            commit.commit_timezone = timezone
> +                # work around a timezone format change
> +                if int(timezone) % 60 != 0:  # pragma: no cover
> +                    timezone = parse_timezone(timezone)
> +                    # Newer versions of Dulwich return a tuple here
> +                    if isinstance(timezone, tuple):
> +                        timezone, neg_utc = timezone
> +                        commit._commit_timezone_neg_utc = neg_utc
> +                else:
> +                    timezone = -int(timezone)
> +                commit.commit_timezone = timezone
> +            except: # extra is essentially user-supplied, we must be careful
> +                self.set_commiter_from_author(commit)
>          else:
> -            commit.committer = commit.author
> -            commit.commit_time = commit.author_time
> -            commit.commit_timezone = commit.author_timezone
> +            self.set_commiter_from_author(commit)
>
>          commit.parents = []
>          for parent in self.get_git_parents(ctx):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list