Index: link.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/link/Attic/link.inc,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 link.inc
--- link.inc	19 Aug 2010 04:34:49 -0000	1.1.2.1
+++ link.inc	10 Sep 2010 15:29:50 -0000
@@ -35,6 +35,14 @@ function _link_process(&$item, $delta = 
 }
 
 function _link_validate(&$item, $delta, $field, $node, &$optional_field_found) {
+  // Ensure the fields exist, make some of the rest of the validation simpler.
+  if (!isset($item['url'])) {
+    $item['url'] = '';
+  }
+  if (!isset($item['title'])) {
+    $item['title'] = '';
+  }
+
   if ($item['url'] && !(isset($field['widget']['default_value'][$delta]['url']) && $item['url'] == $field['widget']['default_value'][$delta]['url'] && !$field['required'])) {
     // Validate the link.
     if (link_validate_url(trim($item['url'])) == FALSE) {
@@ -72,6 +80,15 @@ function _link_sanitize(&$item, $delta, 
   if (empty($item['url']) && empty($item['title'])) {
     return;
   }
+  // Ensure the values actually exist.
+  else {
+    if (!array_key_exists('url', $item)) {
+      $item['url'] = '';
+    }
+    if (!array_key_exists('title', $item)) {
+      $item['title'] = '';
+    }
+  }
 
   // Replace URL tokens.
   if (module_exists('token') && $field['enable_tokens']) {
@@ -167,9 +184,9 @@ function _link_sanitize(&$item, $delta, 
   if ($type != LINK_EXTERNAL && $type != LINK_NEWS && strpos($item['attributes']['rel'], 'nofollow') !== FALSE) {
     $item['attributes']['rel'] = str_replace('nofollow', '', $item['attributes']['rel']);
   }
-  // Some old field data may have $element['#item']['attributes']['rel'] as an array, which will cause errors:
-  if (is_array($element['#item']['attributes']['rel'])) {
-    unset($element['#item']['attributes']['rel']);
+  // Some old field data may have $item['attributes']['rel'] as an array, which will cause errors:
+  if (is_array($item['attributes']['rel'])) {
+    unset($item['attributes']['rel']);
   }
 
   // Handle "title" link attribute
Index: link.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/link/link.module,v
retrieving revision 1.24.4.35
diff -u -p -r1.24.4.35 link.module
--- link.module	19 Aug 2010 04:34:49 -0000	1.24.4.35
+++ link.module	10 Sep 2010 15:29:51 -0000
@@ -206,35 +206,37 @@ function link_content_is_empty($item, $f
  * Implementation of hook_field().
  */
 function link_field($op, &$node, $field, &$items, $teaser, $page) {
-  module_load_include('inc', 'link');
-  switch ($op) {
-    case 'load':
-      return _link_load($field, $items);
-
-    case 'validate':
-      $optional_field_found = FALSE;
-      if ($field['validate_url'] !== 0 || is_null($field['validate_url']) || !isset($field['validate_url'])) {
+  if (!empty($field['type']) && $field['type'] == 'link') {
+    module_load_include('inc', 'link');
+    switch ($op) {
+      case 'load':
+        return _link_load($field, $items);
+
+      case 'validate':
+        $optional_field_found = FALSE;
+        if (!isset($field['validate_url']) || is_null($field['validate_url']) || $field['validate_url'] !== 0) {
+          foreach ($items as $delta => $value) {
+            _link_validate($items[$delta], $delta, $field, $node, $optional_field_found);
+          }
+        }
+
+        if ($field['url'] == 'optional' && $field['title'] == 'optional' && $field['required'] && !$optional_field_found) {
+          form_set_error($field['field_name'] .'][0][title', t('At least one title or URL must be entered.'));
+        }
+        break;
+
+      case 'presave':
         foreach ($items as $delta => $value) {
-          _link_validate($items[$delta], $delta, $field, $node, $optional_field_found);
+          _link_process($items[$delta], $delta, $field, $node);
         }
-      }
+        break;
 
-      if ($field['url'] == 'optional' && $field['title'] == 'optional' && $field['required'] && !$optional_field_found) {
-        form_set_error($field['field_name'] .'][0][title', t('At least one title or URL must be entered.'));
-      }
-      break;
-
-    case 'presave':
-      foreach ($items as $delta => $value) {
-        _link_process($items[$delta], $delta, $field, $node);
-      }
-      break;
-
-    case 'sanitize':
-      foreach ($items as $delta => $value) {
-        _link_sanitize($items[$delta], $delta, $field, $node);
-      }
-      break;
+      case 'sanitize':
+        foreach ($items as $delta => $value) {
+          _link_sanitize($items[$delta], $delta, $field, $node);
+        }
+        break;
+    }
   }
 }
 
@@ -431,7 +433,7 @@ function link_token_values($type, $objec
     $item = $object[0];
 
     $tokens['url'] = $item['url'];
-    $tokens['title'] = $item['title'];
+    $tokens['title'] = isset($item['title']) ? $item['title'] : '';
     $tokens['view'] = isset($item['view']) ? $item['view'] : '';
 
     return $tokens;
Index: link.theme.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/link/Attic/link.theme.inc,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 link.theme.inc
--- link.theme.inc	19 Aug 2010 04:34:49 -0000	1.1.2.1
+++ link.theme.inc	10 Sep 2010 15:29:51 -0000
@@ -32,7 +32,7 @@ function theme_link($element) {
       $element['url']['#title'] = $element['#title'] .' '. $element['url']['#title'];
       $element['title']['#title'] = $element['#title'] .' '. $element['title']['#title'];
     }
-    elseif ($element['url']) {
+    elseif (!empty($element['url']) && isset($element['#title'])) {
       $element['url']['#title'] = $element['#title'];
     }
   }
