Vulnerability: Reference binding to null pointer in `MatrixDiag*` ops ### Impact
The implementation of [`MatrixDiag*` operations](https://github.com/tensorflow/tensorflow/blob/4c4f420e68f1cfaf8f4b6e8e3eb857e9e4c3ff33/tensorflow/core/kernels/linalg/matrix_diag_op.cc#L195-L197) does not validate that the tensor arguments are non-empty:

```cc
      num_rows = context->input(2).flat<int32>()(0);
      num_cols = context->input(3).flat<int32>()(0);
      padding_value = context->input(4).flat<T>()(0); 
``` 

Thus, users can trigger null pointer dereferences if any of the above tensors are null:

```python
import tensorflow as tf

d = tf.convert_to_tensor([],dtype=tf.float32)
p = tf.convert_to_tensor([],dtype=tf.float32)
tf.raw_ops.MatrixDiagV2(diagonal=d, k=0, num_rows=0, num_cols=0, padding_value=p)
```

Changing from `tf.raw_ops.MatrixDiagV2` to `tf.raw_ops.MatrixDiagV3` still reproduces the issue.

### Patches
We have patched the issue in GitHub commit [a7116dd3913c4a4afd2a3a938573aa7c785fdfc6](https://github.com/tensorflow/tensorflow/commit/a7116dd3913c4a4afd2a3a938573aa7c785fdfc6).

The fix will be included in TensorFlow 2.5.0. We will also cherrypick this commit on TensorFlow 2.4.2, TensorFlow 2.3.3, TensorFlow 2.2.3 and TensorFlow 2.1.4, as these are also affected and still in supported range.

### For more information
Please consult [our security guide](https://github.com/tensorflow/tensorflow/blob/master/SECURITY.md) for more information regarding the security model and how to contact us with issues and questions.

### Attribution
This vulnerability has been reported by Ye Zhang and Yakun Zhang of Baidu X-Team.
Vulnerability ID: GHSA-hc6c-75p4-hmq4
CWE: CWE-476
Severity score: 2.5
Project: https://github.com/tensorflow/tensorflow
Published: 2021-05-21
File: tensorflow/core/kernels/linalg/matrix_diag_op.cc
Commit message: Validate `MatrixDiagV{2,3}` arguments to prevent breakage.

PiperOrigin-RevId: 369056033
Change-Id: Ic2018c297d3dd6f252dc1dd3667f1ed5cb1eaa42
Commit author: Mihai Maruseac

Vulnerable version (before fix):
 class MatrixDiagOp : public OpKernel {           upper_diag_index = diag_index.flat<int32>()(1);         }       }       num_rows = context->input(2).flat<int32>()(0);       num_cols = context->input(3).flat<int32>()(0);       padding_value = context->input(4).flat<T>()(0);     }      // Size validations.

Fixed version (after fix):
 class MatrixDiagOp : public OpKernel {           upper_diag_index = diag_index.flat<int32>()(1);         }       }        auto& num_rows_tensor = context->input(2);       OP_REQUIRES(context, TensorShapeUtils::IsScalar(num_rows_tensor.shape()),                   errors::InvalidArgument("num_rows must be a scalar"));       num_rows = num_rows_tensor.flat<int32>()(0);        auto& num_cols_tensor = context->input(3);       OP_REQUIRES(context, TensorShapeUtils::IsScalar(num_cols_tensor.shape()),                   errors::InvalidArgument("num_cols must be a scalar"));       num_cols = num_cols_tensor.flat<int32>()(0);        auto& padding_value_tensor = context->input(4);       OP_REQUIRES(context,                   TensorShapeUtils::IsScalar(padding_value_tensor.shape()),                   errors::InvalidArgument("padding_value must be a scalar"));       padding_value = padding_value_tensor.flat<T>()(0);     }      // Size validations.

Patch:
patch: @@ -192,9 +192,22 @@ class MatrixDiagOp : public OpKernel {
           upper_diag_index = diag_index.flat<int32>()(1);
         }
       }
-      num_rows = context->input(2).flat<int32>()(0);
-      num_cols = context->input(3).flat<int32>()(0);
-      padding_value = context->input(4).flat<T>()(0);
+
+      auto& num_rows_tensor = context->input(2);
+      OP_REQUIRES(context, TensorShapeUtils::IsScalar(num_rows_tensor.shape()),
+                  errors::InvalidArgument("num_rows must be a scalar"));
+      num_rows = num_rows_tensor.flat<int32>()(0);
+
+      auto& num_cols_tensor = context->input(3);
+      OP_REQUIRES(context, TensorShapeUtils::IsScalar(num_cols_tensor.shape()),
+                  errors::InvalidArgument("num_cols must be a scalar"));
+      num_cols = num_cols_tensor.flat<int32>()(0);
+
+      auto& padding_value_tensor = context->input(4);
+      OP_REQUIRES(context,
+                  TensorShapeUtils::IsScalar(padding_value_tensor.shape()),
+                  errors::InvalidArgument("padding_value must be a scalar"));
+      padding_value = padding_value_tensor.flat<T>()(0);
     }
 
     // Size validations.
path: tensorflow/core/kernels/linalg/matrix_diag_op.cc