Skip to content

Commit d5a8b75

Browse files
committed
Resolve SIGILL errors on Pixel 6 devices caused by a binary mismatch
Filter fuzzing jobs to ensure Pixel 6 compatibility for Pixel 6 devices. Prevent Pixel 6 devices from falling back to the generic `jobs-android` queue.
1 parent 28e1d2a commit d5a8b75

File tree

4 files changed

+63
-11
lines changed

4 files changed

+63
-11
lines changed

src/clusterfuzz/_internal/base/tasks/__init__.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from clusterfuzz._internal.google_cloud_utils import pubsub
3535
from clusterfuzz._internal.google_cloud_utils import storage
3636
from clusterfuzz._internal.metrics import logs
37+
from clusterfuzz._internal.platforms.android import constants
3738
from clusterfuzz._internal.system import environment
3839

3940
# Task queue prefixes for various job types.
@@ -395,14 +396,20 @@ def get_task():
395396
return task
396397

397398
if environment.is_android():
398-
logs.info(f'Could not get task from {regular_queue()}. Trying from'
399-
f'default android queue {default_android_queue()}.')
400-
task = get_regular_task(default_android_queue())
401-
if task:
402-
# Log the task details for debug purposes.
403-
logs.info(f'Got task with cmd {task.command} args {task.argument} '
404-
f'job {task.job} from {default_android_queue()} queue.')
405-
return task
399+
if environment.platform() not in \
400+
constants.DEVICES_WITH_NO_FALLBACK_QUEUE_LIST:
401+
logs.info(f'Could not get task from {regular_queue()}. Trying from'
402+
f'default android queue {default_android_queue()}.')
403+
task = get_regular_task(default_android_queue())
404+
if task:
405+
# Log the task details for debug purposes.
406+
logs.info(f'Got task with cmd {task.command} args {task.argument} '
407+
f'job {task.job} from {default_android_queue()} queue.')
408+
return task
409+
else:
410+
logs.info(f'{environment.platform()} is part of devices with no '
411+
f'fallback list. Hence skipping picking up tasks from '
412+
f'default {default_android_queue()} queue.')
406413

407414
logs.info(f'Could not get task from {regular_queue()}. Fuzzing.')
408415

src/clusterfuzz/_internal/fuzzing/fuzzer_selection.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from clusterfuzz._internal.datastore import fuzz_target_utils
2323
from clusterfuzz._internal.datastore import ndb_utils
2424
from clusterfuzz._internal.metrics import logs
25+
from clusterfuzz._internal.platforms.android import constants
2526
from clusterfuzz._internal.system import environment
2627

2728
# Used to prepare targets to be passed to utils.random_weighted_choice.
@@ -133,9 +134,16 @@ def get_fuzz_task_payload(platform=None):
133134

134135
platforms = [platform]
135136
base_platform = platform.split(':')[0]
136-
# Generalized queue for platforms with a base platform (e.g. ANDROID)
137-
if base_platform != platform:
138-
platforms.append(base_platform)
137+
138+
# Conditionally append the base platform (e.g. ANDROID) as a job filter,
139+
# unless the platform is restricted or is the base platform itself.
140+
if platform != base_platform:
141+
if platform not in constants.DEVICES_WITH_NO_FALLBACK_QUEUE_LIST:
142+
platforms.append(base_platform)
143+
else:
144+
logs.info(f'{platform} is part of devices with no fallback list. '
145+
f'Hence skipping inclusion of the generic platform '
146+
f'({base_platform}) while querying.')
139147

140148
if environment.is_production():
141149
query = data_types.FuzzerJobs.query()

src/clusterfuzz/_internal/platforms/android/constants.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,7 @@
8282
'redfin', # Pixel 5
8383
'barbet', # Pixel 5a
8484
]
85+
86+
# Restrict pixel6 from picking up generic Android jobs to avoid
87+
# Binary Mismatch: Hence, 'ANDROID:PIXEL6' is added to the list.
88+
DEVICES_WITH_NO_FALLBACK_QUEUE_LIST = ['ANDROID:PIXEL6']

src/clusterfuzz/_internal/tests/core/fuzzing/fuzzer_selection_test.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,39 @@ def test_platform_restriction(self, local_development):
292292
argument, job = fuzzer_selection.get_fuzz_task_payload('linux')
293293
self.assertEqual(('right_fuzzer_1', 'job_2'), (argument, job))
294294

295+
android_mapping = data_types.FuzzerJob()
296+
android_mapping.fuzzer = 'android_fuzzer'
297+
android_mapping.job = 'job_android'
298+
android_mapping.platform = 'ANDROID'
299+
android_mapping.put()
300+
301+
pixel_mapping = data_types.FuzzerJob()
302+
pixel_mapping.fuzzer = 'pixel_fuzzer'
303+
pixel_mapping.job = 'job_pixel6'
304+
pixel_mapping.platform = 'ANDROID:PIXEL6'
305+
pixel_mapping.put()
306+
307+
data_types.FuzzerJobs(
308+
platform='ANDROID', fuzzer_jobs=[android_mapping]).put()
309+
data_types.FuzzerJobs(platform='ANDROID:PIXEL6', fuzzer_jobs=[]).put()
310+
311+
# Production Environment
312+
if local_development == 'False':
313+
argument, job = fuzzer_selection.get_fuzz_task_payload('ANDROID')
314+
self.assertEqual(('android_fuzzer', 'job_android'), (argument, job))
315+
316+
# PIXEL6 bots must ignore jobs that are not explicitly marked as
317+
# Pixel6-compatible.
318+
argument, job = fuzzer_selection.get_fuzz_task_payload('ANDROID:PIXEL6')
319+
self.assertEqual((None, None), (argument, job))
320+
# Local Enviroment
321+
else:
322+
argument, job = fuzzer_selection.get_fuzz_task_payload('ANDROID')
323+
self.assertEqual(('android_fuzzer', 'job_android'), (argument, job))
324+
325+
argument, job = fuzzer_selection.get_fuzz_task_payload('ANDROID:PIXEL6')
326+
self.assertEqual(('pixel_fuzzer', 'job_pixel6'), (argument, job))
327+
295328

296329
@test_utils.with_cloud_emulators('datastore')
297330
class UpdatePlatformForJobTest(unittest.TestCase):

0 commit comments

Comments
 (0)