[PATCH 08/10] parse(mail|archive): handle early fail within email module

Andrew Donnellan andrew.donnellan at au1.ibm.com
Wed Jun 28 18:43:06 AEST 2017


On 28/06/17 17:48, Daniel Axtens wrote:
> Certain really messed up email messages can cause a failure within
> the email module (at least on py3). Catch this.
>
> Signed-off-by: Daniel Axtens <dja at axtens.net>
> ---
>  patchwork/management/commands/parsearchive.py |  9 ++++++++
>  patchwork/management/commands/parsemail.py    | 31 ++++++++++++++++-----------
>  2 files changed, 27 insertions(+), 13 deletions(-)
>
> diff --git a/patchwork/management/commands/parsearchive.py b/patchwork/management/commands/parsearchive.py
> index a3c8360186c8..3aab58a45bcd 100644
> --- a/patchwork/management/commands/parsearchive.py
> +++ b/patchwork/management/commands/parsearchive.py
> @@ -77,6 +77,15 @@ class Command(BaseCommand):
>
>          count = len(mbox)
>
> +        # detect broken mails in the mbox
> +        # see earlyfail fuzz test on py3
> +        try:
> +            for m in mbox:
> +                pass
> +        except AttributeError:
> +            logger.warning('Broken mbox/Maildir, aborting')
> +            return
> +

This seems a bit non-obvious and could do with a little bit of explanation?

>          logger.info('Parsing %d mails', count)
>          for i, msg in enumerate(mbox):
>              try:
> diff --git a/patchwork/management/commands/parsemail.py b/patchwork/management/commands/parsemail.py
> index 9adfb25b09e3..52ec8bc56899 100644
> --- a/patchwork/management/commands/parsemail.py
> +++ b/patchwork/management/commands/parsemail.py
> @@ -58,20 +58,25 @@ class Command(base.BaseCommand):
>      def handle(self, *args, **options):
>          infile = args[0] if args else options['infile']
>
> -        if infile:
> -            logger.info('Parsing mail loaded by filename')
> -            if six.PY3:
> -                with open(infile, 'rb') as file_:
> -                    mail = email.message_from_binary_file(file_)
> -            else:
> -                with open(infile) as file_:
> -                    mail = email.message_from_file(file_)
> -        else:
> -            logger.info('Parsing mail loaded from stdin')
> -            if six.PY3:
> -                mail = email.message_from_binary_file(sys.stdin.buffer)
> +        try:
> +            if infile:
> +                logger.info('Parsing mail loaded by filename')
> +                if six.PY3:
> +                    with open(infile, 'rb') as file_:
> +                        mail = email.message_from_binary_file(file_)
> +                else:
> +                    with open(infile) as file_:
> +                        mail = email.message_from_file(file_)
>              else:
> -                mail = email.message_from_file(sys.stdin)
> +                logger.info('Parsing mail loaded from stdin')
> +                if six.PY3:
> +                    mail = email.message_from_binary_file(sys.stdin.buffer)
> +                else:
> +                    mail = email.message_from_file(sys.stdin)
> +        except AttributeError:
> +            logger.warning("Broken email ignored")
> +            return
> +
>          try:
>              result = parse_mail(mail, options['list_id'])
>              if result:
>

-- 
Andrew Donnellan              OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com  IBM Australia Limited



More information about the Patchwork mailing list