Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.492
diff -u -p -r1.492 form.inc
--- includes/form.inc	14 Sep 2010 21:42:05 -0000	1.492
+++ includes/form.inc	21 Sep 2010 05:42:02 -0000
@@ -995,27 +995,6 @@ function drupal_validate_form($form_id, 
 
   _form_validate($form, $form_state, $form_id);
   $validated_forms[$form_id] = TRUE;
-
-  // If validation errors are limited then remove any non validated form values,
-  // so that only values that passed validation are left for submit callbacks.
-  if (isset($form_state['triggering_element']['#limit_validation_errors']) && $form_state['triggering_element']['#limit_validation_errors'] !== FALSE) {
-    $values = array();
-    foreach ($form_state['triggering_element']['#limit_validation_errors'] as $section) {
-      // If the section exists within $form_state['values'], even if the value
-      // is NULL, copy it to $values.
-      $section_exists = NULL;
-      $value = drupal_array_get_nested_value($form_state['values'], $section, $section_exists);
-      if ($section_exists) {
-        drupal_array_set_nested_value($values, $section, $value);
-      }
-    }
-    // For convenience we always make the value of the pressed button available.
-    if (isset($form_state['triggering_element']['#button_type'])) {
-      $values[$form_state['triggering_element']['#name']] = $form_state['triggering_element']['#value'];
-      drupal_array_set_nested_value($values, $form_state['triggering_element']['#parents'], $form_state['triggering_element']['#value']);
-    }
-    $form_state['values'] = $values;
-  }
 }
 
 /**
@@ -1780,9 +1759,11 @@ function _form_builder_handle_input_elem
       // submit explicit NULL values when calling drupal_form_submit(), so we do
       // not modify $form_state['input'] for them.
       if (!$input_exists && !$form_state['rebuild'] && !$form_state['programmed']) {
-        // Add the necessary parent keys to $form_state['input'] and sets the
-        // element's input value to NULL.
-        drupal_array_set_nested_value($form_state['input'], $element['#parents'], NULL);
+        // We leverage the internal logic of form_set_value() to change the
+        // input values by passing $form_state['input'] instead of the usual
+        // $form_state['values']. In effect, this adds the necessary parent keys
+        // to $form_state['input'] and sets the element's input value to NULL.
+        _form_set_value($form_state['input'], $element, $element['#parents'], NULL);
         $input_exists = TRUE;
       }
       // If we have input for the current element, assign it to the #value
@@ -1841,7 +1822,11 @@ function _form_builder_handle_input_elem
 
   // Set the element's value in $form_state['values'], but only, if its key
   // does not exist yet (a #value_callback may have already populated it).
-  if (!drupal_array_nested_key_exists($form_state['values'], $element['#parents'])) {
+  $values = $form_state['values'];
+  foreach ($element['#parents'] as $key) {
+    $values = (isset($values[$key]) ? $values[$key] : NULL);
+  }
+  if (!isset($values)) {
     form_set_value($element, $element['#value'], $form_state);
   }
 }
@@ -2187,7 +2172,26 @@ function form_type_token_value($element,
  *   Form state array where the value change should be recorded.
  */
 function form_set_value($element, $value, &$form_state) {
-  drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value);
+  _form_set_value($form_state['values'], $element, $element['#parents'], $value);
+}
+
+/**
+ * Helper function for form_set_value() and _form_builder_handle_input_element().
+ *
+ * We iterate over $parents and create nested arrays for them in $form_values if
+ * needed. Then we insert the value into the last parent key.
+ */
+function _form_set_value(&$form_values, $element, $parents, $value) {
+  $parent = array_shift($parents);
+  if (empty($parents)) {
+    $form_values[$parent] = $value;
+  }
+  else {
+    if (!isset($form_values[$parent])) {
+      $form_values[$parent] = array();
+    }
+    _form_set_value($form_values[$parent], $element, $parents, $value);
+  }
 }
 
 /**
Index: modules/file/file.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/file/file.module,v
retrieving revision 1.40
diff -u -p -r1.40 file.module
--- modules/file/file.module	13 Sep 2010 01:09:25 -0000	1.40
+++ modules/file/file.module	21 Sep 2010 05:42:02 -0000
@@ -574,7 +574,10 @@ function file_managed_file_submit($form,
   // and set $element to the managed_file element that contains that button.
   $parents = $form_state['triggering_element']['#array_parents'];
   $button_key = array_pop($parents);
-  $element = drupal_array_get_nested_value($form, $parents);
+  $element = $form;
+  foreach ($parents as $parent) {
+   $element = $element[$parent];
+  }
 
   // No action is needed here for the upload button, because all file uploads on
   // the form are processed by file_managed_file_value() regardless of which
@@ -592,10 +595,13 @@ function file_managed_file_submit($form,
     // run, and for form building functions that run during the rebuild, such as
     // when the managed_file element is part of a field widget.
     // $form_state['input'] must be updated so that file_managed_file_value()
-    // has correct information during the rebuild.
+    // has correct information during the rebuild. The Form API provides no
+    // equivalent of form_set_value() for updating $form_state['input'], so
+    // inline that implementation with the same logic that form_set_value()
+    // uses.
     $values_element = $element['#extended'] ? $element['fid'] : $element;
     form_set_value($values_element, NULL, $form_state);
-    drupal_array_set_nested_value($form_state['input'], $values_element['#parents'], NULL);
+    _form_set_value($form_state['input'], $values_element, $values_element['#parents'], NULL);
   }
 
   // Set the form to rebuild so that $form is correctly updated in response to
