From f61b049483e3a8a7b6d75b1be31f41d322099a13 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Wed, 9 Apr 2014 05:45:58 -0400
Subject: [PATCH] Issue #2226241 by voidberg, claudiu.cristea: Saving image
 field or instance with an inexistent default_image crashes.

---
 core/modules/image/image.module               | 25 ++++++------
 .../Plugin/Field/FieldType/ImageItem.php      |  1 +
 .../Tests/ImageFieldDefaultImagesTest.php     | 39 +++++++++++++++++++
 .../lib/Drupal/user/Tests/UserCreateTest.php  |  2 -
 4 files changed, 53 insertions(+), 14 deletions(-)

diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index a57fe55d724b..dc2599806ff0 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -376,9 +376,11 @@ function image_entity_presave(EntityInterface $entity) {
   $entity_type_id = $entity->getEntityTypeId();
   if ($entity_type_id == 'field_instance_config') {
     $field = $entity->getField();
+    $default_settings = \Drupal::service('plugin.manager.field.field_type')->getDefaultInstanceSettings('image');
   }
   elseif ($entity_type_id == 'field_config') {
     $field = $entity;
+    $default_settings = \Drupal::service('plugin.manager.field.field_type')->getDefaultSettings('image');
   }
   // Exit, if not saving an image field or image field instance entity.
   if (!$field || $field->type != 'image') {
@@ -389,20 +391,19 @@ function image_entity_presave(EntityInterface $entity) {
   if ($fid) {
     $original_fid = isset($entity->original) ? $entity->original->settings['default_image']['fid'] : NULL;
     if ($fid != $original_fid) {
-      $image = \Drupal::service('image.factory')->get(file_load($fid)->getFileUri());
-      $entity->settings['default_image']['width'] = $image->getWidth();
-      $entity->settings['default_image']['height'] = $image->getHeight();
+      $file = file_load($fid);
+      if ($file) {
+        $image = \Drupal::service('image.factory')->get($file->getFileUri());
+        $entity->settings['default_image']['width'] = $image->getWidth();
+        $entity->settings['default_image']['height'] = $image->getHeight();
+      }
+      else {
+        $entity->settings['default_image']['fid'] = NULL;
+      }
     }
   }
-  else {
-    $entity->settings['default_image'] = array(
-      'fid' => NULL,
-      'alt' => '',
-      'title' => '',
-      'width' => NULL,
-      'height' => NULL,
-    );
-  }
+
+  $entity->settings['default_image'] += $default_settings['default_image'];
 }
 
 /**
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
index 7a936348aef9..3ea3d84f1aed 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
@@ -71,6 +71,7 @@ public static function defaultInstanceSettings() {
       'default_image' => array(
         'fid' => NULL,
         'alt' => '',
+        'title' => '',
         'width' => NULL,
         'height' => NULL,
       ),
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
index edf1919510db..c0fd5d7d9c86 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
@@ -291,4 +291,43 @@ public function testDefaultImages() {
     );
   }
 
+  /**
+   * Tests image field and instance having an invalid default image.
+   */
+  public  function testInvalidDefaultImage() {
+    $field = array(
+      'name' => drupal_strtolower($this->randomName()),
+      'entity_type' => 'node',
+      'type' => 'image',
+      'settings' => array(
+        'default_image' => array(
+          'fid' => 100000,
+        )
+      ),
+    );
+    $instance = array(
+      'field_name' => $field['name'],
+      'label' => $this->randomName(),
+      'entity_type' => 'node',
+      'bundle' => 'page',
+      'settings' => array(
+        'default_image' => array(
+          'fid' => 100000,
+        )
+      ),
+    );
+    $field_config = entity_create('field_config', $field);
+    $field_config->save();
+    $settings = $field_config->getSettings();
+    // The non-existent default image should not be saved.
+    $this->assertNull($settings['default_image']['fid']);
+
+    $field_instance_config = entity_create('field_instance_config', $instance);
+    $field_instance_config->save();
+    $settings = $field_instance_config->getSettings();
+    // The non-existent default image should not be saved.
+    $this->assertNull($settings['default_image']['fid']);
+
+  }
+
 }
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php b/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php
index cc6d2adf1c83..7ba715db3a72 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserCreateTest.php
@@ -49,7 +49,6 @@ protected function testUserAdd() {
       'indexes' => array('target_id' => array('target_id')),
       'settings' => array(
         'uri_scheme' => 'public',
-        'default_image' => FALSE,
       ),
     );
     entity_create('field_config', $field)->save();
@@ -69,7 +68,6 @@ protected function testUserAdd() {
         'title_field' => 0,
         'max_resolution' => '85x85',
         'min_resolution' => '',
-        'default_image' => 0,
       ),
     );
     entity_create('field_instance_config', $instance)->save();
-- 
GitLab