OSDN Git Service

Ensure that viewport and frame are initialized.
authorJeff Brown <jeffbrown@google.com>
Sun, 9 Sep 2012 07:07:17 +0000 (00:07 -0700)
committerJeff Brown <jeffbrown@google.com>
Sun, 9 Sep 2012 07:07:17 +0000 (00:07 -0700)
commit4c05dd175ee3bd5119eecf368742b6510a8cfa6c
tree821976538f8ae1f1852ab1cc8ee9d8f46ab857a6
parent4fb3999cea652617be5125f8a42c257467bf3c77
Ensure that viewport and frame are initialized.

onInitializeDisplays() was posting a transaction with changes
to the display projection.  Unfortunately, it only set the
display orientation field and left viewport and frame
uninitialized.

The uninitialized values flowed downstream and found themselves
baked into a bogus DisplayDevice mGlobalTransform.  That transform
was then applied to some Rects which were turned into Regions
that were them combined with other Regions.

Under certain situations, the uninitialized data might have
a largish value, resulting in the creation of Regions with
components in excess of the Region max-value limit of 0x7ffffff
(note that this is not INT_MAX).  Later when performing a
binary operation using the Region, the Spanner would loop
indefinitely trying to figure out how to stuff a humongous
region inside of a max-value region.  Not content to try
just once, the Spanner would continue trying again and
again, pegging the CPU and hanging surface flinger during boot.

Insanity soon followed.

Bug: 7130713
Change-Id: I0016f0c9662185be833474c212a1dd408096ae23
services/surfaceflinger/SurfaceFlinger.cpp
services/surfaceflinger/Transform.cpp