diff options
28 files changed, 317 insertions, 82 deletions
diff --git a/cmds/cmd/cmd.cpp b/cmds/cmd/cmd.cpp index 014c99593c..40dbbf551c 100644 --- a/cmds/cmd/cmd.cpp +++ b/cmds/cmd/cmd.cpp @@ -61,7 +61,8 @@ class MyShellCallback : public BnShellCallback public: bool mActive = true; - virtual int openOutputFile(const String16& path, const String16& seLinuxContext) { + virtual int openFile(const String16& path, const String16& seLinuxContext, + const String16& mode) { String8 path8(path); char cwd[256]; getcwd(cwd, 256); @@ -71,7 +72,26 @@ public: aerr << "Open attempt after active for: " << fullPath << endl; return -EPERM; } - int fd = open(fullPath.string(), O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU|S_IRWXG); + int flags = 0; + bool checkRead = false; + bool checkWrite = false; + if (mode == String16("w")) { + flags = O_WRONLY|O_CREAT|O_TRUNC; + checkWrite = true; + } else if (mode == String16("w+")) { + flags = O_RDWR|O_CREAT|O_TRUNC; + checkRead = checkWrite = true; + } else if (mode == String16("r")) { + flags = O_RDONLY; + checkRead = true; + } else if (mode == String16("r+")) { + flags = O_RDWR; + checkRead = checkWrite = true; + } else { + aerr << "Invalid mode requested: " << mode.string() << endl; + return -EINVAL; + } + int fd = open(fullPath.string(), flags, S_IRWXU|S_IRWXG); if (fd < 0) { return fd; } @@ -80,14 +100,27 @@ public: security_context_t tmp = NULL; int ret = getfilecon(fullPath.string(), &tmp); Unique_SecurityContext context(tmp); - int accessGranted = selinux_check_access(seLinuxContext8.string(), context.get(), - "file", "write", NULL); - if (accessGranted != 0) { - close(fd); - aerr << "System server has no access to file context " << context.get() - << " (from path " << fullPath.string() << ", context " - << seLinuxContext8.string() << ")" << endl; - return -EPERM; + if (checkWrite) { + int accessGranted = selinux_check_access(seLinuxContext8.string(), context.get(), + "file", "write", NULL); + if (accessGranted != 0) { + close(fd); + aerr << "System server has no access to write file context " << context.get() + << " (from path " << fullPath.string() << ", context " + << seLinuxContext8.string() << ")" << endl; + return -EPERM; + } + } + if (checkRead) { + int accessGranted = selinux_check_access(seLinuxContext8.string(), context.get(), + "file", "read", NULL); + if (accessGranted != 0) { + close(fd); + aerr << "System server has no access to read file context " << context.get() + << " (from path " << fullPath.string() << ", context " + << seLinuxContext8.string() << ")" << endl; + return -EPERM; + } } } return fd; diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index 6ce04a2882..d030aa44b7 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -1240,7 +1240,7 @@ Dex2oatFileWrapper maybe_open_reference_profile(const std::string& pkgname, // Opens the vdex files and assigns the input fd to in_vdex_wrapper_fd and the output fd to // out_vdex_wrapper_fd. Returns true for success or false in case of errors. -bool open_vdex_files(const char* apk_path, const char* out_oat_path, int dexopt_needed, +bool open_vdex_files_for_dex2oat(const char* apk_path, const char* out_oat_path, int dexopt_needed, const char* instruction_set, bool is_public, int uid, bool is_secondary_dex, bool profile_guided, Dex2oatFileWrapper* in_vdex_wrapper_fd, Dex2oatFileWrapper* out_vdex_wrapper_fd) { @@ -1353,6 +1353,37 @@ Dex2oatFileWrapper open_oat_out_file(const char* apk_path, const char* oat_dir, return wrapper_fd; } +// Creates RDONLY fds for oat and vdex files, if exist. +// Returns false if it fails to create oat out path for the given apk path. +// Note that the method returns true even if the files could not be opened. +bool maybe_open_oat_and_vdex_file(const std::string& apk_path, + const std::string& oat_dir, + const std::string& instruction_set, + bool is_secondary_dex, + unique_fd* oat_file_fd, + unique_fd* vdex_file_fd) { + char oat_path[PKG_PATH_MAX]; + if (!create_oat_out_path(apk_path.c_str(), + instruction_set.c_str(), + oat_dir.c_str(), + is_secondary_dex, + oat_path)) { + return false; + } + oat_file_fd->reset(open(oat_path, O_RDONLY)); + if (oat_file_fd->get() < 0) { + PLOG(INFO) << "installd cannot open oat file during dexopt" << oat_path; + } + + std::string vdex_filename = create_vdex_filename(oat_path); + vdex_file_fd->reset(open(vdex_filename.c_str(), O_RDONLY)); + if (vdex_file_fd->get() < 0) { + PLOG(INFO) << "installd cannot open vdex file during dexopt" << vdex_filename; + } + + return true; +} + // Updates the access times of out_oat_path based on those from apk_path. void update_out_oat_access_times(const char* apk_path, const char* out_oat_path) { struct stat input_stat; @@ -1374,9 +1405,11 @@ void update_out_oat_access_times(const char* apk_path, const char* out_oat_path) // The analyzer will check if the dex_file needs to be (re)compiled to match the compiler_filter. // If this is for a profile guided compilation, profile_was_updated will tell whether or not // the profile has changed. -static void exec_dexoptanalyzer(const std::string& dex_file, const std::string& instruction_set, - const std::string& compiler_filter, bool profile_was_updated, bool downgrade, +static void exec_dexoptanalyzer(const std::string& dex_file, int vdex_fd, int oat_fd, + int zip_fd, const std::string& instruction_set, const std::string& compiler_filter, + bool profile_was_updated, bool downgrade, const char* class_loader_context) { + CHECK_GE(zip_fd, 0); const char* dexoptanalyzer_bin = is_debug_runtime() ? "/system/bin/dexoptanalyzerd" @@ -1390,6 +1423,9 @@ static void exec_dexoptanalyzer(const std::string& dex_file, const std::string& } std::string dex_file_arg = "--dex-file=" + dex_file; + std::string oat_fd_arg = "--oat-fd=" + std::to_string(oat_fd); + std::string vdex_fd_arg = "--vdex-fd=" + std::to_string(vdex_fd); + std::string zip_fd_arg = "--zip-fd=" + std::to_string(zip_fd); std::string isa_arg = "--isa=" + instruction_set; std::string compiler_filter_arg = "--compiler-filter=" + compiler_filter; const char* assume_profile_changed = "--assume-profile-changed"; @@ -1400,8 +1436,10 @@ static void exec_dexoptanalyzer(const std::string& dex_file, const std::string& } // program name, dex file, isa, filter, the final NULL - const int argc = 5 + + const int argc = 6 + (profile_was_updated ? 1 : 0) + + (vdex_fd >= 0 ? 1 : 0) + + (oat_fd >= 0 ? 1 : 0) + (downgrade ? 1 : 0) + (class_loader_context != nullptr ? 1 : 0); const char* argv[argc]; @@ -1410,6 +1448,13 @@ static void exec_dexoptanalyzer(const std::string& dex_file, const std::string& argv[i++] = dex_file_arg.c_str(); argv[i++] = isa_arg.c_str(); argv[i++] = compiler_filter_arg.c_str(); + if (oat_fd >= 0) { + argv[i++] = oat_fd_arg.c_str(); + } + if (vdex_fd >= 0) { + argv[i++] = vdex_fd_arg.c_str(); + } + argv[i++] = zip_fd_arg.c_str(); if (profile_was_updated) { argv[i++] = assume_profile_changed; } @@ -1564,12 +1609,35 @@ static bool process_secondary_dex_dexopt(const char* original_dex_path, const ch // Analyze profiles. bool profile_was_updated = analyze_profiles(uid, dex_path, /*is_secondary_dex*/true); + unique_fd oat_file_fd; + unique_fd vdex_file_fd; + unique_fd zip_fd; + zip_fd.reset(open(dex_path.c_str(), O_RDONLY)); + if (zip_fd.get() < 0) { + PLOG(ERROR) << "installd cannot open " << dex_path << " for input during dexopt"; + return false; + } + if (!maybe_open_oat_and_vdex_file(dex_path, + *oat_dir_out, + instruction_set, + true /* is_secondary_dex */, + &oat_file_fd, + &vdex_file_fd)) { + return false; + } + pid_t pid = fork(); if (pid == 0) { // child -- drop privileges before continuing. drop_capabilities(uid); // Run dexoptanalyzer to get dexopt_needed code. - exec_dexoptanalyzer(dex_path, instruction_set, compiler_filter, profile_was_updated, + exec_dexoptanalyzer(dex_path, + vdex_file_fd.get(), + oat_file_fd.get(), + zip_fd.get(), + instruction_set, + compiler_filter, + profile_was_updated, downgrade, class_loader_context); exit(DEXOPTANALYZER_BIN_EXEC_ERROR); } @@ -1661,8 +1729,8 @@ int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* ins // Open vdex files. Dex2oatFileWrapper in_vdex_fd; Dex2oatFileWrapper out_vdex_fd; - if (!open_vdex_files(dex_path, out_oat_path, dexopt_needed, instruction_set, is_public, uid, - is_secondary_dex, profile_guided, &in_vdex_fd, &out_vdex_fd)) { + if (!open_vdex_files_for_dex2oat(dex_path, out_oat_path, dexopt_needed, instruction_set, + is_public, uid, is_secondary_dex, profile_guided, &in_vdex_fd, &out_vdex_fd)) { return -1; } diff --git a/include/input/InputTransport.h b/include/input/InputTransport.h index 944947420e..c4b5dca23d 100644 --- a/include/input/InputTransport.h +++ b/include/input/InputTransport.h @@ -455,7 +455,6 @@ private: int32_t* displayId); void updateTouchState(InputMessage& msg); - bool rewriteMessage(const TouchState& state, InputMessage& msg); void resampleTouchState(nsecs_t frameTime, MotionEvent* event, const InputMessage *next); @@ -464,6 +463,7 @@ private: status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled); + static bool rewriteMessage(const TouchState& state, InputMessage& msg); static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg); static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg); static void addSample(MotionEvent* event, const InputMessage* msg); diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 1c3fab4057..ba9bf61f8c 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -571,7 +571,7 @@ status_t IPCThreadState::transact(int32_t handle, uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { - status_t err = data.errorCheck(); + status_t err; flags |= TF_ACCEPT_FDS; @@ -582,11 +582,9 @@ status_t IPCThreadState::transact(int32_t handle, << indent << data << dedent << endl; } - if (err == NO_ERROR) { - LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(), - (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY"); - err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL); - } + LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(), + (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY"); + err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL); if (err != NO_ERROR) { if (reply) reply->setError(err); diff --git a/libs/binder/IShellCallback.cpp b/libs/binder/IShellCallback.cpp index c793df3266..23b83a6a0b 100644 --- a/libs/binder/IShellCallback.cpp +++ b/libs/binder/IShellCallback.cpp @@ -39,11 +39,13 @@ public: { } - virtual int openOutputFile(const String16& path, const String16& seLinuxContext) { + virtual int openFile(const String16& path, const String16& seLinuxContext, + const String16& mode) { Parcel data, reply; data.writeInterfaceToken(IShellCallback::getInterfaceDescriptor()); data.writeString16(path); data.writeString16(seLinuxContext); + data.writeString16(mode); remote()->transact(OP_OPEN_OUTPUT_FILE, data, &reply, 0); reply.readExceptionCode(); int fd = reply.readParcelFileDescriptor(); @@ -64,7 +66,8 @@ status_t BnShellCallback::onTransact( CHECK_INTERFACE(IShellCallback, data, reply); String16 path(data.readString16()); String16 seLinuxContext(data.readString16()); - int fd = openOutputFile(path, seLinuxContext); + String16 mode(data.readString16()); + int fd = openFile(path, seLinuxContext, mode); if (reply != NULL) { reply->writeNoException(); if (fd >= 0) { diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 84ca3c0781..f739f07024 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -2645,7 +2645,7 @@ status_t Parcel::continueWrite(size_t desired) pthread_mutex_unlock(&gParcelGlobalAllocSizeLock); mData = data; mDataCapacity = desired; - } else if (desired > mDataCapacity) { + } else { mError = NO_MEMORY; return NO_MEMORY; } diff --git a/libs/binder/include/binder/IShellCallback.h b/libs/binder/include/binder/IShellCallback.h index fda9ee6ba7..b47e995183 100644 --- a/libs/binder/include/binder/IShellCallback.h +++ b/libs/binder/include/binder/IShellCallback.h @@ -29,7 +29,8 @@ class IShellCallback : public IInterface public: DECLARE_META_INTERFACE(ShellCallback); - virtual int openOutputFile(const String16& path, const String16& seLinuxContext) = 0; + virtual int openFile(const String16& path, const String16& seLinuxContext, + const String16& mode) = 0; enum { OP_OPEN_OUTPUT_FILE = IBinder::FIRST_CALL_TRANSACTION diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index bfc6f28704..b5295f2801 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -136,5 +136,101 @@ status_t DisplayState::read(const Parcel& input) { return NO_ERROR; } +void DisplayState::merge(const DisplayState& other) { + if (other.what & eSurfaceChanged) { + what |= eSurfaceChanged; + surface = other.surface; + } + if (other.what & eLayerStackChanged) { + what |= eLayerStackChanged; + layerStack = other.layerStack; + } + if (other.what & eDisplayProjectionChanged) { + what |= eDisplayProjectionChanged; + orientation = other.orientation; + viewport = other.viewport; + frame = other.frame; + } + if (other.what & eDisplaySizeChanged) { + what |= eDisplaySizeChanged; + width = other.width; + height = other.height; + } +} + +void layer_state_t::merge(const layer_state_t& other) { + if (other.what & ePositionChanged) { + what |= ePositionChanged; + x = other.x; + y = other.y; + } + if (other.what & eLayerChanged) { + what |= eLayerChanged; + z = other.z; + } + if (other.what & eSizeChanged) { + what |= eSizeChanged; + w = other.w; + h = other.h; + } + if (other.what & eAlphaChanged) { + what |= eAlphaChanged; + alpha = other.alpha; + } + if (other.what & eMatrixChanged) { + what |= eMatrixChanged; + matrix = other.matrix; + } + if (other.what & eTransparentRegionChanged) { + what |= eTransparentRegionChanged; + transparentRegion = other.transparentRegion; + } + if (other.what & eFlagsChanged) { + what |= eFlagsChanged; + flags = other.flags; + mask = other.mask; + } + if (other.what & eLayerStackChanged) { + what |= eLayerStackChanged; + layerStack = other.layerStack; + } + if (other.what & eCropChanged) { + what |= eCropChanged; + crop = other.crop; + } + if (other.what & eDeferTransaction) { + what |= eDeferTransaction; + barrierHandle = other.barrierHandle; + barrierGbp = other.barrierGbp; + frameNumber = other.frameNumber; + } + if (other.what & eFinalCropChanged) { + what |= eFinalCropChanged; + finalCrop = other.finalCrop; + } + if (other.what & eOverrideScalingModeChanged) { + what |= eOverrideScalingModeChanged; + overrideScalingMode = other.overrideScalingMode; + } + if (other.what & eGeometryAppliesWithResize) { + what |= eGeometryAppliesWithResize; + } + if (other.what & eReparentChildren) { + what |= eReparentChildren; + reparentHandle = other.reparentHandle; + } + if (other.what & eDetachChildren) { + what |= eDetachChildren; + } + if (other.what & eRelativeLayerChanged) { + what |= eRelativeLayerChanged; + z = other.z; + relativeLayerHandle = other.relativeLayerHandle; + } + if (other.what & eReparent) { + what |= eReparent; + parentHandleForChild = other.parentHandleForChild; + } +} }; // namespace android diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 15c4c9a880..2adc273651 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -104,6 +104,30 @@ SurfaceComposerClient::Transaction::Transaction(const Transaction& other) : mComposerStates = other.mComposerStates; } +SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) { + for (auto const& state : other.mComposerStates) { + ssize_t index = mComposerStates.indexOf(state); + if (index < 0) { + mComposerStates.add(state); + } else { + mComposerStates.editItemAt(static_cast<size_t>(index)).state.merge(state.state); + } + } + other.mComposerStates.clear(); + + for (auto const& state : other.mDisplayStates) { + ssize_t index = mDisplayStates.indexOf(state); + if (index < 0) { + mDisplayStates.add(state); + } else { + mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state); + } + } + other.mDisplayStates.clear(); + + return *this; +} + status_t SurfaceComposerClient::Transaction::apply(bool synchronous) { if (mStatus != NO_ERROR) { return mStatus; diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h index ae6965a0fc..f3fb82feb3 100644 --- a/libs/gui/include/gui/LayerState.h +++ b/libs/gui/include/gui/LayerState.h @@ -77,6 +77,7 @@ struct layer_state_t { matrix.dsdy = matrix.dtdx = 0.0f; } + void merge(const layer_state_t& other); status_t write(Parcel& output) const; status_t read(const Parcel& input); @@ -144,6 +145,7 @@ struct DisplayState { }; DisplayState(); + void merge(const DisplayState& other); uint32_t what; sp<IBinder> token; diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index d63dafea41..87fdfae111 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -144,7 +144,9 @@ public: Transaction(Transaction const& other); status_t apply(bool synchronous = false); - + // Merge another transaction in to this one, clearing other + // as if it had been applied. + Transaction& merge(Transaction&& other); Transaction& show(const sp<SurfaceControl>& sc); Transaction& hide(const sp<SurfaceControl>& sc); Transaction& setPosition(const sp<SurfaceControl>& sc, @@ -175,8 +177,6 @@ public: float alpha); Transaction& setMatrix(const sp<SurfaceControl>& sc, float dsdx, float dtdx, float dtdy, float dsdy); - Transaction& setOrientation(const sp<SurfaceControl>& sc, - const Rect& crop); Transaction& setCrop(const sp<SurfaceControl>& sc, const Rect& crop); Transaction& setFinalCrop(const sp<SurfaceControl>& sc, const Rect& crop); Transaction& setLayerStack(const sp<SurfaceControl>& sc, uint32_t layerStack); diff --git a/libs/input/tests/Android.bp b/libs/input/tests/Android.bp index e0bab1156b..aca9521c76 100644 --- a/libs/input/tests/Android.bp +++ b/libs/input/tests/Android.bp @@ -10,8 +10,8 @@ cc_test { ], cflags: [ "-Wall", + "-Wextra", "-Werror", - "-Wno-error=sign-compare", // to fix later "-Wno-unused-variable", ], shared_libs: [ diff --git a/libs/input/tests/InputEvent_test.cpp b/libs/input/tests/InputEvent_test.cpp index 3fb1c6df9b..fd3b7c8ee4 100644 --- a/libs/input/tests/InputEvent_test.cpp +++ b/libs/input/tests/InputEvent_test.cpp @@ -184,7 +184,7 @@ TEST_F(KeyEventTest, Properties) { ASSERT_EQ(AINPUT_EVENT_TYPE_KEY, event.getType()); ASSERT_EQ(2, event.getDeviceId()); - ASSERT_EQ(AINPUT_SOURCE_GAMEPAD, event.getSource()); + ASSERT_EQ(static_cast<int>(AINPUT_SOURCE_GAMEPAD), event.getSource()); ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, event.getAction()); ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, event.getFlags()); ASSERT_EQ(AKEYCODE_BUTTON_X, event.getKeyCode()); @@ -196,7 +196,7 @@ TEST_F(KeyEventTest, Properties) { // Set source. event.setSource(AINPUT_SOURCE_JOYSTICK); - ASSERT_EQ(AINPUT_SOURCE_JOYSTICK, event.getSource()); + ASSERT_EQ(static_cast<int>(AINPUT_SOURCE_JOYSTICK), event.getSource()); } @@ -300,7 +300,7 @@ void MotionEventTest::assertEqualsEventWithHistory(const MotionEvent* event) { // Check properties. ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, event->getType()); ASSERT_EQ(2, event->getDeviceId()); - ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, event->getSource()); + ASSERT_EQ(static_cast<int>(AINPUT_SOURCE_TOUCHSCREEN), event->getSource()); ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, event->getAction()); ASSERT_EQ(AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED, event->getFlags()); ASSERT_EQ(AMOTION_EVENT_EDGE_FLAG_TOP, event->getEdgeFlags()); @@ -432,7 +432,7 @@ TEST_F(MotionEventTest, Properties) { // Set source. event.setSource(AINPUT_SOURCE_JOYSTICK); - ASSERT_EQ(AINPUT_SOURCE_JOYSTICK, event.getSource()); + ASSERT_EQ(static_cast<int>(AINPUT_SOURCE_JOYSTICK), event.getSource()); // Set action. event.setAction(AMOTION_EVENT_ACTION_CANCEL); diff --git a/libs/input/tests/InputPublisherAndConsumer_test.cpp b/libs/input/tests/InputPublisherAndConsumer_test.cpp index a1367387bc..34c52d03d1 100644 --- a/libs/input/tests/InputPublisherAndConsumer_test.cpp +++ b/libs/input/tests/InputPublisherAndConsumer_test.cpp @@ -89,8 +89,9 @@ void InputPublisherAndConsumerTest::PublishAndConsumeKeyEvent() { uint32_t consumeSeq; InputEvent* event; + int32_t displayId; status = mConsumer->consume(&mEventFactory, true /*consumeBatches*/, -1, &consumeSeq, &event, - 0); + &displayId); ASSERT_EQ(OK, status) << "consumer consume should return OK"; @@ -133,7 +134,7 @@ void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent() { const uint32_t seq = 15; const int32_t deviceId = 1; const int32_t source = AINPUT_SOURCE_TOUCHSCREEN; - const int32_t displayId = 0; + int32_t displayId = 0; const int32_t action = AMOTION_EVENT_ACTION_MOVE; const int32_t actionButton = 0; const int32_t flags = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED; @@ -176,7 +177,7 @@ void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent() { uint32_t consumeSeq; InputEvent* event; status = mConsumer->consume(&mEventFactory, true /*consumeBatches*/, -1, &consumeSeq, &event, - 0); + &displayId); ASSERT_EQ(OK, status) << "consumer consume should return OK"; diff --git a/opengl/libagl/Android.mk b/opengl/libagl/Android.mk index c7635e27c7..15a12e458d 100644 --- a/opengl/libagl/Android.mk +++ b/opengl/libagl/Android.mk @@ -38,6 +38,8 @@ LOCAL_CFLAGS_mips += -fstrict-aliasing # The graphics code can generate division by zero LOCAL_CFLAGS_mips += -mno-check-zero-division +LOCAL_CFLAGS += -Wall -Werror + # we need to access the private Bionic header <bionic_tls.h> LOCAL_C_INCLUDES += bionic/libc/private diff --git a/opengl/libagl/array.cpp b/opengl/libagl/array.cpp index 54207fa212..2d36c6194e 100644 --- a/opengl/libagl/array.cpp +++ b/opengl/libagl/array.cpp @@ -136,9 +136,6 @@ void ogles_uninit_array(ogles_context_t* c) static void currentColor(ogles_context_t* c, GLfixed* v, const GLvoid*) { memcpy(v, c->current.color.v, sizeof(vec4_t)); } -static void currentColor_clamp(ogles_context_t* c, GLfixed* v, const GLvoid*) { - memcpy(v, c->currentColorClamped.v, sizeof(vec4_t)); -} static void currentNormal(ogles_context_t* c, GLfixed* v, const GLvoid*) { memcpy(v, c->currentNormal.v, sizeof(vec3_t)); } @@ -349,6 +346,7 @@ void vertex_cache_t::init() { // make sure the size of vertex_t allows cache-line alignment CTA<(sizeof(vertex_t) & 0x1F) == 0> assertAlignedSize; + (void)assertAlignedSize; // suppress unused warning. const int align = 32; const size_t s = VERTEX_BUFFER_SIZE + VERTEX_CACHE_SIZE; diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp index b79051c499..be437054ce 100644 --- a/opengl/libagl/egl.cpp +++ b/opengl/libagl/egl.cpp @@ -81,7 +81,9 @@ namespace android { const unsigned int NUM_DISPLAYS = 1; +#ifndef __ANDROID__ static pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; +#endif static pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_key_t gEGLErrorKey = -1; #ifndef __ANDROID__ @@ -1776,7 +1778,6 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, // if we're detaching, we need the current context current_ctx = (EGLContext)getGlThreadSpecific(); } else { - egl_context_t* c = egl_context_t::context(ctx); egl_surface_t* d = (egl_surface_t*)draw; egl_surface_t* r = (egl_surface_t*)read; if ((d && d->ctx && d->ctx != ctx) || diff --git a/opengl/libagl/light.cpp b/opengl/libagl/light.cpp index e7fe9d71a3..216c725128 100644 --- a/opengl/libagl/light.cpp +++ b/opengl/libagl/light.cpp @@ -467,7 +467,6 @@ static void lightx(GLenum i, GLenum pname, GLfixed param, ogles_context_t* c) } light_t& light = c->lighting.lights[i-GL_LIGHT0]; - const GLfixed kDegToRad = GLfixed((M_PI * gglIntToFixed(1)) / 180.0f); switch (pname) { case GL_SPOT_EXPONENT: if (GGLfixed(param) >= gglIntToFixed(128)) { diff --git a/opengl/libagl/matrix.cpp b/opengl/libagl/matrix.cpp index 034c857fa7..edd474d30c 100644 --- a/opengl/libagl/matrix.cpp +++ b/opengl/libagl/matrix.cpp @@ -51,7 +51,6 @@ static const matrixx_t gIdentityx = { static void point2__nop(transform_t const*, vec4_t* c, vec4_t const* o); static void point3__nop(transform_t const*, vec4_t* c, vec4_t const* o); static void point4__nop(transform_t const*, vec4_t* c, vec4_t const* o); -static void normal__nop(transform_t const*, vec4_t* c, vec4_t const* o); static void point2__generic(transform_t const*, vec4_t* c, vec4_t const* o); static void point3__generic(transform_t const*, vec4_t* c, vec4_t const* o); static void point4__generic(transform_t const*, vec4_t* c, vec4_t const* o); @@ -524,16 +523,6 @@ void transform_state_t::update_mvp() } } -static inline -GLfloat det22(GLfloat a, GLfloat b, GLfloat c, GLfloat d) { - return a*d - b*c; -} - -static inline -GLfloat ndet22(GLfloat a, GLfloat b, GLfloat c, GLfloat d) { - return b*c - a*d; -} - static __attribute__((noinline)) void invert(GLfloat* inverse, const GLfloat* src) { diff --git a/opengl/libagl/primitives.cpp b/opengl/libagl/primitives.cpp index 57a798deb3..d3b19e8e6d 100644 --- a/opengl/libagl/primitives.cpp +++ b/opengl/libagl/primitives.cpp @@ -241,6 +241,7 @@ void compute_iterators_t::initTriangle( m_dx20 = v0->window.x - v2->window.x; m_dy02 = v2->window.y - v0->window.y; m_area = m_dx01*m_dy02 + (-m_dy10)*m_dx20; + (void)m_reserved; // suppress unused warning } void compute_iterators_t::initLine( diff --git a/opengl/libagl/texture.cpp b/opengl/libagl/texture.cpp index 3fe5ed0630..aae8e058bf 100644 --- a/opengl/libagl/texture.cpp +++ b/opengl/libagl/texture.cpp @@ -356,10 +356,6 @@ int createTextureSurface(ogles_context_t* c, GLenum format, GLenum type, GLsizei width, GLsizei height, GLenum compressedFormat = 0) { - // find out which texture is bound to the current unit - const int active = c->textures.active; - const GLuint name = c->textures.tmu[active].name; - // convert the pixelformat to one we can handle const int32_t formatIdx = convertGLPixelFormat(format, type); if (formatIdx == 0) { // we don't know what to do with this @@ -1192,7 +1188,6 @@ void glTexImage2D( const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]); const int32_t align = c->textures.unpackAlignment-1; const int32_t bpr = ((width * pixelFormat.size) + align) & ~align; - const size_t size = bpr * height; const int32_t stride = bpr / pixelFormat.size; GGLSurface userSurface; @@ -1276,7 +1271,6 @@ void glTexSubImage2D( const GGLFormat& pixelFormat(c->rasterizer.formats[formatIdx]); const int32_t align = c->textures.unpackAlignment-1; const int32_t bpr = ((width * pixelFormat.size) + align) & ~align; - const size_t size = bpr * height; const int32_t stride = bpr / pixelFormat.size; GGLSurface userSurface; userSurface.version = sizeof(userSurface); diff --git a/services/inputflinger/InputDispatcher.cpp b/services/inputflinger/InputDispatcher.cpp index 031218562f..906794aee9 100644 --- a/services/inputflinger/InputDispatcher.cpp +++ b/services/inputflinger/InputDispatcher.cpp @@ -1993,10 +1993,10 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime, const PointerCoords* usingCoords = motionEntry->pointerCoords; // Set the X and Y offset depending on the input source. - float xOffset, yOffset, scaleFactor; + float xOffset, yOffset; if ((motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) && !(dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS)) { - scaleFactor = dispatchEntry->scaleFactor; + float scaleFactor = dispatchEntry->scaleFactor; xOffset = dispatchEntry->xOffset * scaleFactor; yOffset = dispatchEntry->yOffset * scaleFactor; if (scaleFactor != 1.0f) { @@ -2009,7 +2009,6 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime, } else { xOffset = 0.0f; yOffset = 0.0f; - scaleFactor = 1.0f; // We don't want the dispatch target to know. if (dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS) { diff --git a/services/inputflinger/InputReader.cpp b/services/inputflinger/InputReader.cpp index 6dd12d6bdd..4304982687 100644 --- a/services/inputflinger/InputReader.cpp +++ b/services/inputflinger/InputReader.cpp @@ -2258,7 +2258,7 @@ void KeyboardInputMapper::dump(String8& dump) { dump.appendFormat(INDENT3 "Orientation: %d\n", mOrientation); dump.appendFormat(INDENT3 "KeyDowns: %zu keys currently down\n", mKeyDowns.size()); dump.appendFormat(INDENT3 "MetaState: 0x%0x\n", mMetaState); - dump.appendFormat(INDENT3 "DownTime: %lld\n", (long long)mDownTime); + dump.appendFormat(INDENT3 "DownTime: %" PRId64 "\n", mDownTime); } @@ -2619,7 +2619,7 @@ void CursorInputMapper::dump(String8& dump) { dump.appendFormat(INDENT3 "Orientation: %d\n", mOrientation); dump.appendFormat(INDENT3 "ButtonState: 0x%08x\n", mButtonState); dump.appendFormat(INDENT3 "Down: %s\n", toString(isPointerDown(mButtonState))); - dump.appendFormat(INDENT3 "DownTime: %lld\n", (long long)mDownTime); + dump.appendFormat(INDENT3 "DownTime: %" PRId64 "\n", mDownTime); } void CursorInputMapper::configure(nsecs_t when, @@ -5508,18 +5508,15 @@ bool TouchInputMapper::preparePointerGestures(nsecs_t when, // Otherwise choose an arbitrary remaining pointer. // This guarantees we always have an active touch id when there is at least one pointer. // We keep the same active touch id for as long as possible. - bool activeTouchChanged = false; int32_t lastActiveTouchId = mPointerGesture.activeTouchId; int32_t activeTouchId = lastActiveTouchId; if (activeTouchId < 0) { if (!mCurrentCookedState.fingerIdBits.isEmpty()) { - activeTouchChanged = true; activeTouchId = mPointerGesture.activeTouchId = mCurrentCookedState.fingerIdBits.firstMarkedBit(); mPointerGesture.firstTouchTime = when; } } else if (!mCurrentCookedState.fingerIdBits.hasBit(activeTouchId)) { - activeTouchChanged = true; if (!mCurrentCookedState.fingerIdBits.isEmpty()) { activeTouchId = mPointerGesture.activeTouchId = mCurrentCookedState.fingerIdBits.firstMarkedBit(); @@ -5615,7 +5612,6 @@ bool TouchInputMapper::preparePointerGestures(nsecs_t when, } if (bestId >= 0 && bestId != activeTouchId) { mPointerGesture.activeTouchId = activeTouchId = bestId; - activeTouchChanged = true; #if DEBUG_GESTURES ALOGD("Gestures: BUTTON_CLICK_OR_DRAG switched pointers, " "bestId=%d, bestSpeed=%0.3f", bestId, bestSpeed); diff --git a/services/sensorservice/SensorDeviceUtils.cpp b/services/sensorservice/SensorDeviceUtils.cpp index b1344becd7..30de63fd79 100644 --- a/services/sensorservice/SensorDeviceUtils.cpp +++ b/services/sensorservice/SensorDeviceUtils.cpp @@ -28,8 +28,8 @@ using namespace android::hardware::sensors::V1_0; namespace android { namespace SensorDeviceUtils { -HidlServiceRegistrationWaiter::HidlServiceRegistrationWaiter() - : mRegistered(ISensors::registerForNotifications("default", this)) { +HidlServiceRegistrationWaiter::HidlServiceRegistrationWaiter() { + mRegistered = ISensors::registerForNotifications("default", this); } Return<void> HidlServiceRegistrationWaiter::onRegistration( diff --git a/services/sensorservice/SensorDeviceUtils.h b/services/sensorservice/SensorDeviceUtils.h index da36928105..4e429146eb 100644 --- a/services/sensorservice/SensorDeviceUtils.h +++ b/services/sensorservice/SensorDeviceUtils.h @@ -47,7 +47,7 @@ public: */ bool wait(); private: - const bool mRegistered; + bool mRegistered; std::mutex mLock; std::condition_variable mCondition; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 56328c9b3d..5405971afa 100755 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -71,7 +71,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, : contentDirty(false), sequence(uint32_t(android_atomic_inc(&sSequence))), mFlinger(flinger), - mTextureName(-1U), + mTextureName(UINT32_MAX), mPremultipliedAlpha(true), mName("unnamed"), mFormat(PIXEL_FORMAT_NONE), @@ -546,6 +546,13 @@ Rect Layer::computeInitialCrop(const sp<const DisplayDevice>& hw) const { activeCrop.clear(); } } + + const auto& p = mDrawingParent.promote(); + if (p != nullptr) { + auto parentCrop = p->computeInitialCrop(hw); + activeCrop.intersect(parentCrop, &activeCrop); + } + return activeCrop; } @@ -559,11 +566,6 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { // Screen space to make reduction to parent crop clearer. Rect activeCrop = computeInitialCrop(hw); - const auto& p = mDrawingParent.promote(); - if (p != nullptr) { - auto parentCrop = p->computeInitialCrop(hw); - activeCrop.intersect(parentCrop, &activeCrop); - } Transform t = getTransform(); // Back to layer space to work with the content crop. activeCrop = t.inverse().transform(activeCrop); @@ -2700,6 +2702,7 @@ int32_t Layer::getZ() const { return mDrawingState.z; } +__attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::makeTraversalList(LayerVector::StateSet stateSet) { LOG_ALWAYS_FATAL_IF(stateSet == LayerVector::StateSet::Invalid, "makeTraversalList received invalid stateSet"); diff --git a/services/surfaceflinger/LayerVector.cpp b/services/surfaceflinger/LayerVector.cpp index 2233e78c2b..d0f8fbea22 100644 --- a/services/surfaceflinger/LayerVector.cpp +++ b/services/surfaceflinger/LayerVector.cpp @@ -35,14 +35,17 @@ int LayerVector::do_compare(const void* lhs, const void* rhs) const uint32_t ls = l->getCurrentState().layerStack; uint32_t rs = r->getCurrentState().layerStack; if (ls != rs) - return ls - rs; + return (ls > rs) ? 1 : -1; uint32_t lz = l->getCurrentState().z; uint32_t rz = r->getCurrentState().z; if (lz != rz) - return lz - rz; + return (lz > rz) ? 1 : -1; - return l->sequence - r->sequence; + if (l->sequence == r->sequence) + return 0; + + return (l->sequence > r->sequence) ? 1 : -1; } void LayerVector::traverseInZOrder(StateSet stateSet, const Visitor& visitor) const { diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index ec87eeec77..16a16a53b1 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -891,6 +891,30 @@ TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) { } } +TEST_F(LayerUpdateTest, MergingTransactions) { + sp<ScreenCapture> sc; + { + SCOPED_TRACE("before move"); + ScreenCapture::captureScreen(&sc); + sc->expectBGColor(0, 12); + sc->expectFGColor(75, 75); + sc->expectBGColor(145, 145); + } + + Transaction t1, t2; + t1.setPosition(mFGSurfaceControl, 128, 128); + t2.setPosition(mFGSurfaceControl, 0, 0); + // We expect that the position update from t2 now + // overwrites the position update from t1. + t1.merge(std::move(t2)); + t1.apply(); + + { + ScreenCapture::captureScreen(&sc); + sc->expectFGColor(1, 1); + } +} + class ChildLayerTest : public LayerUpdateTest { protected: void SetUp() override { |