diff --git a/core/modules/user/user.pages.inc b/core/modules/user/user.pages.inc
index 7bf786e..0095850 100644
--- a/core/modules/user/user.pages.inc
+++ b/core/modules/user/user.pages.inc
@@ -315,6 +315,15 @@ function user_cancel_confirm_form($form, &$form_state, $account) {
   // Display account cancellation method selection, if allowed.
   $default_method = variable_get('user_cancel_method', 'user_cancel_block');
   $admin_access = user_access('administer users');
+  
+  // Pass access information to the submit handler. Running an access check
+  // inside the submit function interferes with form processing and breaks
+  // hook_form_alter().
+  $form['administer_users'] = array(
+     '#type' => 'value',
+     '#value' => $admin_access,
+  );
+  
   $can_select_method = $admin_access || user_access('select account cancellation method');
   $form['user_cancel_method'] = array(
     '#type' => 'item',
@@ -387,11 +396,13 @@ function user_cancel_confirm_form($form, &$form_state, $account) {
 function user_cancel_confirm_form_submit($form, &$form_state) {
   global $user;
   $account = $form_state['values']['_account'];
+  
+  $admin_access = $form_state['values']['administer_users'];
 
   // Cancel account immediately, if the current user has administrative
   // privileges, no confirmation mail shall be sent, and the user does not
   // attempt to cancel the own account.
-  if (user_access('administer users') && empty($form_state['values']['user_cancel_confirm']) && $account->uid != $user->uid) {
+  if ($admin_access && empty($form_state['values']['user_cancel_confirm']) && $account->uid != $user->uid) {
     user_cancel($form_state['values'], $account->uid, $form_state['values']['user_cancel_method']);
 
     $form_state['redirect'] = 'admin/people';
