Index: wp-includes/comment-template.php
===================================================================
--- wp-includes/comment-template.php	(revision 31275)
+++ wp-includes/comment-template.php	(working copy)
@@ -2060,9 +2060,9 @@
 		if ( empty($wp_query->comments) )
 			return;
 		if ( 'all' != $r['type'] ) {
-			if ( empty($wp_query->comments_by_type) )
-				$wp_query->comments_by_type = separate_comments($wp_query->comments);
-			if ( empty($wp_query->comments_by_type[$r['type']]) )
+			if ( empty( $wp_query->comments_by_type ) )
+				$wp_query->comments_by_type = separate_comments( $wp_query->comments );
+			if ( empty( $wp_query->comments_by_type[$r['type']] ) )
 				return;
 			$_comments = $wp_query->comments_by_type[$r['type']];
 		} else {
@@ -2070,37 +2070,37 @@
 		}
 	}
 
-	if ( '' === $r['per_page'] && get_option('page_comments') )
-		$r['per_page'] = get_query_var('comments_per_page');
+	if ( '' === $r['per_page'] && get_option( 'page_comments' ) )
+		$r['per_page'] = get_query_var( 'comments_per_page' );
 
-	if ( empty($r['per_page']) ) {
+	if ( empty( $r['per_page'] ) ) {
 		$r['per_page'] = 0;
 		$r['page'] = 0;
 	}
 
 	if ( '' === $r['max_depth'] ) {
-		if ( get_option('thread_comments') )
-			$r['max_depth'] = get_option('thread_comments_depth');
+		if ( get_option( 'thread_comments' ) )
+			$r['max_depth'] = get_option( 'thread_comments_depth' );
 		else
 			$r['max_depth'] = -1;
 	}
 
 	if ( '' === $r['page'] ) {
-		if ( empty($overridden_cpage) ) {
-			$r['page'] = get_query_var('cpage');
+		if ( empty( $overridden_cpage ) ) {
+			$r['page'] = get_query_var( 'cpage' );
 		} else {
 			$threaded = ( -1 != $r['max_depth'] );
-			$r['page'] = ( 'newest' == get_option('default_comments_page') ) ? get_comment_pages_count($_comments, $r['per_page'], $threaded) : 1;
+			$r['page'] = ( 'newest' == get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $r['per_page'], $threaded ) : 1;
 			set_query_var( 'cpage', $r['page'] );
 		}
 	}
 	// Validation check
-	$r['page'] = intval($r['page']);
+	$r['page'] = intval( $r['page'] );
 	if ( 0 == $r['page'] && 0 != $r['per_page'] )
 		$r['page'] = 1;
 
 	if ( null === $r['reverse_top_level'] )
-		$r['reverse_top_level'] = ( 'desc' == get_option('comment_order') );
+		$r['reverse_top_level'] = ( 'desc' == get_option( 'comment_order' ) );
 
 	if ( empty( $r['walker'] ) ) {
 		$walker = new Walker_Comment;
@@ -2109,8 +2109,16 @@
 	}
 
 	$output = $walker->paged_walk( $_comments, $r['max_depth'], $r['page'], $r['per_page'], $r );
-	$wp_query->max_num_comment_pages = $walker->max_pages;
 
+	// When requested comment page does not exist, display last page of comments.
+	if ( $r['page'] > intval( $walker->max_pages ) ) {
+		$r['page'] = intval( $walker->max_pages );
+		set_query_var( 'cpage', $r['page'] );
+		$output = $walker->paged_walk( $_comments, $r['max_depth'], $r['page'], $r['per_page'], $r );
+	}
+
+	$wp_query->max_num_comment_pages = intval( $walker->max_pages );
+
 	$in_comment_loop = false;
 
 	if ( $r['echo'] ) {
Index: wp-includes/link-template.php
===================================================================
--- wp-includes/link-template.php	(revision 31275)
+++ wp-includes/link-template.php	(working copy)
@@ -2431,23 +2431,23 @@
 function get_next_comments_link( $label = '', $max_page = 0 ) {
 	global $wp_query;
 
-	if ( !is_singular() || !get_option('page_comments') )
+	if ( !is_singular() || !get_option( 'page_comments' ) )
 		return;
 
-	$page = get_query_var('cpage');
+	$page = get_query_var( 'cpage' );
 
-	$nextpage = intval($page) + 1;
+	$nextpage = intval( $page ) + 1;
 
-	if ( empty($max_page) )
+	if ( empty( $max_page ) )
 		$max_page = $wp_query->max_num_comment_pages;
 
-	if ( empty($max_page) )
+	if ( empty( $max_page ) )
 		$max_page = get_comment_pages_count();
 
 	if ( $nextpage > $max_page )
 		return;
 
-	if ( empty($label) )
+	if ( empty( $label ) )
 		$label = __('Newer Comments &raquo;');
 
 	/**
@@ -2478,22 +2478,34 @@
  * @since 2.7.1
  *
  * @param string $label Optional. Label for comments link text.
+ * @param int $max_page Optional. Max page.
  * @return string|null HTML-formatted link for the previous page of comments.
  */
-function get_previous_comments_link( $label = '' ) {
-	if ( !is_singular() || !get_option('page_comments') )
+function get_previous_comments_link( $label = '', $max_page = 0 ) {
+	global $wp_query;
+
+	if ( !is_singular() || !get_option( 'page_comments' ) )
 		return;
 
-	$page = get_query_var('cpage');
+	$page = get_query_var( 'cpage' );
 
-	if ( intval($page) <= 1 )
+	if ( empty( $max_page ) )
+		$max_page = $wp_query->max_num_comment_pages;
+
+	if ( empty( $max_page ) )
+		$max_page = get_comment_pages_count();
+
+	if ( intval( $page ) <= 1 )
 		return;
 
-	$prevpage = intval($page) - 1;
+	if ( intval( $page ) > $max_page )
+		$page = $max_page;
 
-	if ( empty($label) )
-		$label = __('&laquo; Older Comments');
+	$prevpage = intval( $page ) - 1;
 
+	if ( empty( $label ) )
+		$label = __( '&laquo; Older Comments' );
+
 	/**
 	 * Filter the anchor tag attributes for the previous comments page link.
 	 *
@@ -2510,9 +2522,10 @@
  * @since 2.7.0
  *
  * @param string $label Optional. Label for comments link text.
+ * @param int $max_page Optional. Max page.
  */
-function previous_comments_link( $label = '' ) {
-	echo get_previous_comments_link( $label );
+function previous_comments_link( $label = '', $max_page = 0 ) {
+	echo get_previous_comments_link( $label, $max_page );
 }
 
 /**
@@ -2524,16 +2537,20 @@
  * @param string|array $args Optional args. See paginate_links().
  * @return string Markup for pagination links.
 */
-function paginate_comments_links($args = array()) {
+function paginate_comments_links( $args = array() ) {
 	global $wp_rewrite;
 
-	if ( !is_singular() || !get_option('page_comments') )
+	if ( !is_singular() || !get_option( 'page_comments' ) )
 		return;
 
-	$page = get_query_var('cpage');
-	if ( !$page )
+	$page = get_query_var( 'cpage' );
+
+	if ( !$page ) {
 		$page = 1;
+	}
+
 	$max_page = get_comment_pages_count();
+
 	$defaults = array(
 		'base' => add_query_arg( 'cpage', '%#%' ),
 		'format' => '',
@@ -2542,16 +2559,19 @@
 		'echo' => true,
 		'add_fragment' => '#comments'
 	);
-	if ( $wp_rewrite->using_permalinks() )
-		$defaults['base'] = user_trailingslashit(trailingslashit(get_permalink()) . 'comment-page-%#%', 'commentpaged');
+	if ( $wp_rewrite->using_permalinks() ) {
+		$defaults['base'] = user_trailingslashit( trailingslashit( get_permalink() ) . 'comment-page-%#%', 'commentpaged' );
+	}
 
 	$args = wp_parse_args( $args, $defaults );
 	$page_links = paginate_links( $args );
 
-	if ( $args['echo'] )
+	if ( $args['echo'] ) {
 		echo $page_links;
-	else
+	} else {
 		return $page_links;
+	}
+
 }
 
 /**
