Ejemplo n.º 1
0
    def _do_process_task(self, subscriber, subscription, ack_id, message,
                         done_event):
        """Process task with timeout."""
        try:
            with self._ndb_client.context():
                source_id = get_source_id(message)
                _state.source_id = source_id

                task_type = message.attributes['type']
                if task_type in ('regressed', 'fixed'):
                    oss_fuzz.process_bisect_task(self._oss_fuzz_dir, task_type,
                                                 source_id, message)
                elif task_type == 'impact':
                    try:
                        oss_fuzz.process_impact_task(source_id, message)
                    except osv.ImpactError:
                        logging.error('Failed to process impact: %s',
                                      traceback.format_exc())
                elif task_type == 'invalid':
                    mark_bug_invalid(message)
                elif task_type == 'update':
                    self._source_update(message)

                _state.source_id = None
                subscriber.acknowledge(subscription=subscription,
                                       ack_ids=[ack_id])
        except Exception:
            logging.error('Unexpected exception while processing task: %s',
                          traceback.format_exc())
            subscriber.modify_ack_deadline(subscription=subscription,
                                           ack_ids=[ack_id],
                                           ack_deadline_seconds=0)
        finally:
            logging.info('Ending task')
            done_event.set()
Ejemplo n.º 2
0
    def test_fixed_range_too_long(self):
        """Test fixed range that's too long."""
        message = mock.Mock()
        message.attributes = {
            'source_id': 'oss-fuzz:123',
            'allocated_id': 'OSV-2020-1337',
        }

        regress_result = osv.RegressResult(
            id='oss-fuzz:123',
            commit='eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
            repo_url='https://repo.com/repo',
            issue_id='9001',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        regress_result.put()

        fix_result = osv.FixResult(
            id='oss-fuzz:123',
            commit=('eefe8ec3f1f90d0e684890e810f3f21e8500a4cd:'
                    'b587c21c36a84e16cfc6b39eb68578d43b5281ad'),
            repo_url='https://repo.com/repo',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            details='DETAILS',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        fix_result.put()

        oss_fuzz.process_impact_task('oss-fuzz:123', message)
        self.expect_dict_equal(
            'fixed_range_too_long',
            ndb.Key(osv.Bug, 'OSV-2020-1337').get()._to_dict())

        affected_commits = list(osv.AffectedCommit.query())

        self.assertCountEqual([
            'b9b3fd4732695b83c3068b7b6a14bb372ec31f98',
            'ff8cc32ba60ad9cbb3b23f0a82aad96ebe9ff76b',
            'febfac1940086bc1f6d3dc33fda0a1d1ba336209',
            '4c155795426727ea05575bd5904321def23c03f4',
            'b1c95a196f22d06fcf80df8c6691cd113d8fefff',
            'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
            '8d8242f545e9cec3e6d0d2e3f5bde8be1c659735',
            '3ea6feea9bb853596c727abab309476cc07d1505',
            '36f0bd9549298b44f9ff2496c9dd1326b3a9d0e2',
        ], [commit.commit for commit in affected_commits])
Ejemplo n.º 3
0
    def test_zero_regression_range(self):
        """Test regression range with "0:X"."""
        message = mock.Mock()
        message.attributes = {
            'source_id': 'oss-fuzz:123',
            'allocated_id': 'OSV-2020-1337',
        }

        regress_result = osv.RegressResult(
            id='oss-fuzz:123',
            commit='unknown:eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
            repo_url='https://repo.com/repo',
            issue_id='9001',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        regress_result.put()

        fix_result = osv.FixResult(
            id='oss-fuzz:123',
            commit='8d8242f545e9cec3e6d0d2e3f5bde8be1c659735',
            repo_url='https://repo.com/repo',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            details='DETAILS',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        fix_result.put()

        oss_fuzz.process_impact_task('oss-fuzz:123', message)
        self.expect_dict_equal(
            'zero_regression_range',
            ndb.Key(osv.Bug, 'OSV-2020-1337').get()._to_dict())

        affected_commits = list(osv.AffectedCommit.query())

        self.assertCountEqual([
            'ff8cc32ba60ad9cbb3b23f0a82aad96ebe9ff76b',
            'febfac1940086bc1f6d3dc33fda0a1d1ba336209',
            '4c155795426727ea05575bd5904321def23c03f4',
            'b1c95a196f22d06fcf80df8c6691cd113d8fefff',
            'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
        ], [commit.commit for commit in affected_commits])
Ejemplo n.º 4
0
    def test_simplify_range(self):
        """Test simplifying commit range."""
        message = mock.Mock()
        message.attributes = {
            'source_id': 'oss-fuzz:123',
            'allocated_id': 'OSV-2020-1337',
        }

        regress_result = osv.RegressResult(
            id='oss-fuzz:123',
            commit=('a2ba949290915d445d34d0e8e9de2e7ce38198fc:'
                    'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd'),
            repo_url='https://repo.com/repo',
            issue_id='9001',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        regress_result.put()

        fix_result = osv.FixResult(
            id='oss-fuzz:123',
            commit=('b1c95a196f22d06fcf80df8c6691cd113d8fefff:'
                    '8d8242f545e9cec3e6d0d2e3f5bde8be1c659735'),
            repo_url='https://repo.com/repo',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            details='DETAILS',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        fix_result.put()

        oss_fuzz.process_impact_task('oss-fuzz:123', message)
        self.expect_dict_equal(
            'simplify_range',
            ndb.Key(osv.Bug, 'OSV-2020-1337').get()._to_dict())
Ejemplo n.º 5
0
    def test_not_fixed(self):
        """Test not fixed bug."""
        message = mock.Mock()
        message.attributes = {
            'source_id': 'oss-fuzz:123',
            'allocated_id': '2020-1337',
        }

        regress_result = osv.RegressResult(
            id='oss-fuzz:123',
            commit='eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
            repo_url='https://repo.com/repo',
            issue_id='9001',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            details='DETAILS',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        regress_result.put()

        oss_fuzz.process_impact_task('oss-fuzz:123', message)
        self.assertDictEqual(
            {
                'affected': [
                    'branch-v0.1.1', 'branch-v0.1.1-with-fix',
                    'branch_1_cherrypick_regress', 'v0.1.1', 'v0.2'
                ],
                'affected_fuzzy': ['0-1-1', '0-1-1', '1', '0-1-1', '0-2'],
                'additional_commit_ranges': [{
                    'introduced_in':
                    'febfac1940086bc1f6d3dc33fda0a1d1ba336209',
                    'fixed_in': None
                }],
                'fixed':
                '',
                'regressed':
                'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
                'repo_url':
                'https://repo.com/repo',
                'confidence':
                100,
                'issue_id':
                '9001',
                'last_modified':
                datetime.datetime(2021, 1, 1, 0, 0),
                'timestamp':
                datetime.datetime(2020, 1, 1),
                'source_id':
                'oss-fuzz:123',
                'project':
                'project',
                'ecosystem':
                'ecosystem',
                'summary':
                'Heap-buffer-overflow in Foo',
                'details':
                'DETAILS',
                'severity':
                'MEDIUM',
                'sort_key':
                '2020-0001337',
                'source_of_truth':
                osv.SourceOfTruth.INTERNAL,
                'reference_urls': ['https://url/'],
                'public':
                False,
                'status':
                osv.BugStatus.PROCESSED.value,
                'has_affected':
                True,
                'search_indices': ['project', '2020-1337', '2020', '1337'],
            },
            ndb.Key(osv.Bug, '2020-1337').get()._to_dict())

        affected_commits = list(osv.AffectedCommit.query())
        for commit in affected_commits:
            self.assertEqual(100, commit.confidence)
            self.assertEqual('project', commit.project)

        self.assertCountEqual([
            'ff8cc32ba60ad9cbb3b23f0a82aad96ebe9ff76b',
            'febfac1940086bc1f6d3dc33fda0a1d1ba336209',
            '4c155795426727ea05575bd5904321def23c03f4',
            'b1c95a196f22d06fcf80df8c6691cd113d8fefff',
            'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
            '36f0bd9549298b44f9ff2496c9dd1326b3a9d0e2',
            '8d8242f545e9cec3e6d0d2e3f5bde8be1c659735',
            'b9b3fd4732695b83c3068b7b6a14bb372ec31f98',
            'b587c21c36a84e16cfc6b39eb68578d43b5281ad',
            '88e5ae3c40c85b702ba89a34c29f233048abb12b',
            '3ea6feea9bb853596c727abab309476cc07d1505',
        ], [commit.commit for commit in affected_commits])
Ejemplo n.º 6
0
    def test_simplify_range(self):
        """Test simplifying commit range."""
        message = mock.Mock()
        message.attributes = {
            'source_id': 'oss-fuzz:123',
            'allocated_id': '2020-1337',
        }

        regress_result = osv.RegressResult(
            id='oss-fuzz:123',
            commit=('a2ba949290915d445d34d0e8e9de2e7ce38198fc:'
                    'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd'),
            repo_url='https://repo.com/repo',
            issue_id='9001',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        regress_result.put()

        fix_result = osv.FixResult(
            id='oss-fuzz:123',
            commit=('b1c95a196f22d06fcf80df8c6691cd113d8fefff:'
                    '8d8242f545e9cec3e6d0d2e3f5bde8be1c659735'),
            repo_url='https://repo.com/repo',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            details='DETAILS',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        fix_result.put()

        oss_fuzz.process_impact_task('oss-fuzz:123', message)
        self.assertDictEqual(
            {
                'affected':
                ['branch-v0.1.1', 'branch_1_cherrypick_regress', 'v0.1.1'],
                'affected_fuzzy': ['0-1-1', '1', '0-1-1'],
                'additional_commit_ranges': [{
                    'introduced_in':
                    'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
                    'fixed_in':
                    'b9b3fd4732695b83c3068b7b6a14bb372ec31f98'
                }, {
                    'introduced_in':
                    'febfac1940086bc1f6d3dc33fda0a1d1ba336209',
                    'fixed_in': None
                }],
                'fixed':
                '8d8242f545e9cec3e6d0d2e3f5bde8be1c659735',
                'regressed':
                'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
                'repo_url':
                'https://repo.com/repo',
                'confidence':
                100,
                'issue_id':
                '9001',
                'last_modified':
                datetime.datetime(2021, 1, 1, 0, 0),
                'timestamp':
                datetime.datetime(2020, 1, 1),
                'source_id':
                'oss-fuzz:123',
                'project':
                'project',
                'ecosystem':
                'ecosystem',
                'summary':
                'Heap-buffer-overflow in Foo',
                'details':
                'DETAILS',
                'severity':
                'MEDIUM',
                'sort_key':
                '2020-0001337',
                'source_of_truth':
                osv.SourceOfTruth.INTERNAL,
                'reference_urls': ['https://url/'],
                'public':
                False,
                'status':
                osv.BugStatus.PROCESSED.value,
                'has_affected':
                True,
                'search_indices': ['project', '2020-1337', '2020', '1337'],
            },
            ndb.Key(osv.Bug, '2020-1337').get()._to_dict())
Ejemplo n.º 7
0
    def test_zero_regression_range(self):
        """Test regression range with "0:X"."""
        message = mock.Mock()
        message.attributes = {
            'source_id': 'oss-fuzz:123',
            'allocated_id': '2020-1337',
        }

        regress_result = osv.RegressResult(
            id='oss-fuzz:123',
            commit='unknown:eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
            repo_url='https://repo.com/repo',
            issue_id='9001',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        regress_result.put()

        fix_result = osv.FixResult(
            id='oss-fuzz:123',
            commit='8d8242f545e9cec3e6d0d2e3f5bde8be1c659735',
            repo_url='https://repo.com/repo',
            project='project',
            ecosystem='ecosystem',
            summary='Heap-buffer-overflow in Foo',
            details='DETAILS',
            severity='MEDIUM',
            reference_urls=['https://url/'])
        fix_result.put()

        oss_fuzz.process_impact_task('oss-fuzz:123', message)
        self.assertDictEqual(
            {
                'affected':
                ['branch-v0.1.1', 'branch_1_cherrypick_regress', 'v0.1.1'],
                'affected_fuzzy': ['0-1-1', '1', '0-1-1'],
                'additional_commit_ranges': [],
                'fixed':
                '8d8242f545e9cec3e6d0d2e3f5bde8be1c659735',
                'regressed':
                'unknown:eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
                'repo_url':
                'https://repo.com/repo',
                'confidence':
                80,
                'issue_id':
                '9001',
                'last_modified':
                datetime.datetime(2021, 1, 1, 0, 0),
                'timestamp':
                datetime.datetime(2020, 1, 1),
                'source_id':
                'oss-fuzz:123',
                'project':
                'project',
                'ecosystem':
                'ecosystem',
                'summary':
                'Heap-buffer-overflow in Foo',
                'details':
                'DETAILS',
                'severity':
                'MEDIUM',
                'sort_key':
                '2020-0001337',
                'source_of_truth':
                osv.SourceOfTruth.INTERNAL,
                'reference_urls': ['https://url/'],
                'public':
                False,
                'status':
                osv.BugStatus.PROCESSED.value,
                'has_affected':
                True,
                'search_indices': ['project', '2020-1337', '2020', '1337'],
            },
            ndb.Key(osv.Bug, '2020-1337').get()._to_dict())

        affected_commits = list(osv.AffectedCommit.query())
        for commit in affected_commits:
            self.assertEqual(80, commit.confidence)
            self.assertEqual('project', commit.project)

        self.assertCountEqual([
            'ff8cc32ba60ad9cbb3b23f0a82aad96ebe9ff76b',
            'febfac1940086bc1f6d3dc33fda0a1d1ba336209',
            '4c155795426727ea05575bd5904321def23c03f4',
            'b1c95a196f22d06fcf80df8c6691cd113d8fefff',
            'eefe8ec3f1f90d0e684890e810f3f21e8500a4cd',
        ], [commit.commit for commit in affected_commits])