Index: src/wp-includes/link-template.php
===================================================================
--- src/wp-includes/link-template.php	(revision 30984)
+++ src/wp-includes/link-template.php	(working copy)
@@ -1517,6 +1517,28 @@
 		}
 	}
 
+	if ( is_user_logged_in() ) {
+		$user_id = get_current_user_id();
+
+		$post_type_object = get_post_type_object( $post->post_type );
+		if ( empty( $post_type_object ) ) {
+			$post_type_cap    = $post->post_type;
+			$read_private_cap = 'read_private_' . $post_type_cap . 's';
+		} else {
+			$read_private_cap = $post_type_object->cap->read_private_posts;
+		}
+
+		// Add private states that are limited to viewing by the author of a post or someone who has caps to read private states.
+		$private_states = get_post_stati( array( 'private' => true ) );
+		$where .= " AND ( p.post_status = 'publish'";
+		foreach ( (array) $private_states as $state ) {
+			$where .= current_user_can( $read_private_cap ) ? " OR p.post_status = '$state'" : " OR (p.post_author = $user_id AND p.post_status = '$state')";
+		}
+		$where .= " )";
+	} else {
+		$where .= " AND p.post_status = 'publish'";
+	}
+
 	$adjacent = $previous ? 'previous' : 'next';
 	$op = $previous ? '<' : '>';
 	$order = $previous ? 'DESC' : 'ASC';
@@ -1547,7 +1569,7 @@
 	 * @param bool   $in_same_term   Whether post should be in a same taxonomy term.
 	 * @param array  $excluded_terms Array of excluded term IDs.
 	 */
-	$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $where", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms );
+	$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s $where", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms );
 
 	/**
 	 * Filter the ORDER BY clause in the SQL for an adjacent post query.
