switch ((type = le64_to_cpu(buf->InodeType))) {
        case NFS_SPECFILE_LNK:
+               if (len == 0 || (len % 2)) {
+                       cifs_dbg(VFS, "srv returned malformed nfs symlink buffer\n");
+                       return -EIO;
+               }
+               /*
+                * Check that buffer does not contain UTF-16 null codepoint
+                * because Linux cannot process symlink with null byte.
+                */
+               if (UniStrnlen((wchar_t *)buf->DataBuffer, len/2) != len/2) {
+                       cifs_dbg(VFS, "srv returned null byte in nfs symlink target location\n");
+                       return -EIO;
+               }
                data->symlink_target = cifs_strndup_from_utf16(buf->DataBuffer,
                                                               len, true,
                                                               cifs_sb->local_nls);
                break;
        case NFS_SPECFILE_CHR:
        case NFS_SPECFILE_BLK:
+               /* DataBuffer for block and char devices contains two 32-bit numbers */
+               if (len != 8) {
+                       cifs_dbg(VFS, "srv returned malformed nfs buffer for type: 0x%llx\n", type);
+                       return -EIO;
+               }
+               break;
        case NFS_SPECFILE_FIFO:
        case NFS_SPECFILE_SOCK:
+               /* DataBuffer for fifos and sockets is empty */
+               if (len != 0) {
+                       cifs_dbg(VFS, "srv returned malformed nfs buffer for type: 0x%llx\n", type);
+                       return -EIO;
+               }
                break;
        default:
                cifs_dbg(VFS, "%s: unhandled inode type: 0x%llx\n",