Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit abd2a232 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Resolve custom printer icon boundary exploit." into rvc-dev

parents 0dcc5c6e 9adc7202
Loading
Loading
Loading
Loading
+34 −1
Original line number Original line Diff line number Diff line
@@ -253,12 +253,45 @@ public final class PrintManagerService extends SystemService {
            }
            }
            final long identity = Binder.clearCallingIdentity();
            final long identity = Binder.clearCallingIdentity();
            try {
            try {
                return userState.getCustomPrinterIcon(printerId);
                Icon icon = userState.getCustomPrinterIcon(printerId);
                return validateIconUserBoundary(icon);
            } finally {
            } finally {
                Binder.restoreCallingIdentity(identity);
                Binder.restoreCallingIdentity(identity);
            }
            }
        }
        }


        /**
         * Validates the custom printer icon to see if it's not in the calling user space.
         * If the condition is not met, return null. Otherwise, return the original icon.
         *
         * @param icon
         * @return icon (validated)
         */
        private Icon validateIconUserBoundary(Icon icon) {
            // Refer to Icon#getUriString for context. The URI string is invalid for icons of
            // incompatible types.
            if (icon != null && (icon.getType() == Icon.TYPE_URI
                    || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP)) {
                String encodedUser = icon.getUri().getEncodedUserInfo();

                // If there is no encoded user, the URI is calling into the calling user space
                if (encodedUser != null) {
                    int userId = Integer.parseInt(encodedUser);
                    // resolve encoded user
                    final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);

                    synchronized (mLock) {
                        // Only the current group members can get the printer icons.
                        if (resolveCallingProfileParentLocked(resolvedUserId)
                                != getCurrentUserId()) {
                            return null;
                        }
                    }
                }
            }
            return icon;
        }

        @Override
        @Override
        public void cancelPrintJob(PrintJobId printJobId, int appId, int userId) {
        public void cancelPrintJob(PrintJobId printJobId, int appId, int userId) {
            if (printJobId == null) {
            if (printJobId == null) {