=== modified file 'includes/form.inc'
--- includes/form.inc	
+++ includes/form.inc	
@@ -145,6 +145,29 @@ function _form_validate($elements, $form
     if ($elements['#required'] && empty($elements['#value']) && $elements['#value'] !== '0') {
       form_error($elements, t('%name field is required', array('%name' => $elements['#title'])));
     }
+
+    // Add legal choice check if element has #options.
+    if (isset($elements['#options']) && isset($elements['#value'])) {
+      $message = t('Illegal choice in %title.', array('%title' => theme('placeholder', $elements['#title'])));
+      if (is_array($elements['#value'])) {
+        if ($elements['#type'] == 'checkboxes') {
+          $value = array_keys(array_filter($elements['#value']));
+        }
+        else {
+          $value = $elements['#value'];
+        }
+        foreach ($value as $v) {
+          if (!isset($elements['#options'][$v])) {
+            form_error($elements, $message);
+          }
+        }
+      }
+      elseif (!isset($elements['#options'][$elements['#value']])) {
+        form_error($elements, $message);
+      }
+    }
+
+    // User-applied checks.
     if (isset($elements['#validate'])) {
       foreach ($elements['#validate'] as $function => $args) {
         $args = array_merge(array($elements), $args);
=== modified file 'modules/filter.module'
--- modules/filter.module	
+++ modules/filter.module	
@@ -775,7 +775,6 @@ function filter_form($value = FILTER_FOR
         '#return_value' => $format->format,
         '#parents' => $parents,
         '#description' => theme('filter_tips', _filter_tips($format->format, false)),
-        '#validate' => array('filter_form_validate' => array())
       );
     }
   }
@@ -793,18 +792,6 @@ function filter_form($value = FILTER_FOR
   return $form;
 }
 
-function filter_form_validate($element) {
-  static $validated;
-  if ($validated) {
-    return;
-  }
-  $validated = 1;
-  $formats = filter_formats();
-  if (!isset($formats[$element['#value']])) {
-    form_set_error($element['#parents'][0], t('The supplied input format is invalid.'));
-  }
-}
-
 /**
  * Returns true if the user is allowed to access this format.
  */
