Index: class-wp-query.php
===================================================================
--- class-wp-query.php	(revision 47420)
+++ class-wp-query.php	(working copy)
@@ -1853,19 +1853,25 @@
 				$q['post_type'] = '';
 			}
 		}
+		
 		$post_type = $q['post_type'];
-		if ( empty( $q['posts_per_page'] ) ) {
-			$q['posts_per_page'] = get_option( 'posts_per_page' );
+		if( isset( $q['posts_per_page'] ) && ( is_numeric( $q['posts_per_page'] ) || is_bool( $q['posts_per_page'] ) ) ) {
+			$q['posts_per_page'] = (int) $q['posts_per_page'];
+		} else {
+			$q['posts_per_page'] = (int) get_option( 'posts_per_page' );
 		}
-		if ( isset( $q['showposts'] ) && $q['showposts'] ) {
+		
+		if ( isset( $q['showposts'] ) && ( is_numeric( $q['showposts'] ) || is_bool( $q['showposts'] ) ) ) {
 			$q['showposts']      = (int) $q['showposts'];
 			$q['posts_per_page'] = $q['showposts'];
 		}
-		if ( ( isset( $q['posts_per_archive_page'] ) && 0 != $q['posts_per_archive_page'] ) && ( $this->is_archive || $this->is_search ) ) {
-			$q['posts_per_page'] = $q['posts_per_archive_page'];
+		
+		if ( isset( $q['posts_per_archive_page'] ) && ( is_numeric( $q['posts_per_archive_page'] ) || is_bool( $q['posts_per_archive_page'] ) ) && ( $this->is_archive || $this->is_search ) ) {
+			$q['posts_per_page'] = (int) $q['posts_per_archive_page'];
 		}
+		
 		if ( ! isset( $q['nopaging'] ) ) {
-			if ( -1 == $q['posts_per_page'] ) {
+			if ( -1 == $q['posts_per_page'] || 0 == $q['posts_per_page'] ) {
 				$q['nopaging'] = true;
 			} else {
 				$q['nopaging'] = false;
@@ -1873,23 +1879,29 @@
 		}
 
 		if ( $this->is_feed ) {
-			// This overrides 'posts_per_page'.
-			if ( ! empty( $q['posts_per_rss'] ) ) {
-				$q['posts_per_page'] = $q['posts_per_rss'];
+			
+			// This overrides posts_per_page.
+			if ( isset( $q['posts_per_rss'] ) && ( is_numeric( $q['posts_per_rss'] ) || is_bool( $q['posts_per_rss'] ) ) ) {
+				$q['posts_per_page'] = (int) $q['posts_per_rss'];
 			} else {
-				$q['posts_per_page'] = get_option( 'posts_per_rss' );
+				$q['posts_per_page'] = (int) get_option( 'posts_per_rss' );
 			}
-			$q['nopaging'] = false;
+			
+			if( -1 == $q['posts_per_page'] || 0 == $q['posts_per_page'] ) {
+				$q['nopaging'] = true;
+			} else {
+				$q['nopaging'] = false;
+			}
 		}
-		$q['posts_per_page'] = (int) $q['posts_per_page'];
+		
 		if ( $q['posts_per_page'] < -1 ) {
 			$q['posts_per_page'] = abs( $q['posts_per_page'] );
-		} elseif ( 0 == $q['posts_per_page'] ) {
-			$q['posts_per_page'] = 1;
 		}
-
-		if ( ! isset( $q['comments_per_page'] ) || 0 == $q['comments_per_page'] ) {
-			$q['comments_per_page'] = get_option( 'comments_per_page' );
+		
+		if ( isset( $q['comments_per_page'] ) && ( is_numeric( $q['comments_per_page'] ) || is_bool( $q['comments_per_page'] ) ) ) {
+			$q['comments_per_page'] = (int) $q['comments_per_page'];
+		} else {
+			$q['comments_per_page'] = (int) get_option( 'comments_per_page' );
 		}
 
 		if ( $this->is_home && ( empty( $this->query ) || 'true' === $q['preview'] ) && ( 'page' === get_option( 'show_on_front' ) ) && get_option( 'page_on_front' ) ) {
@@ -2567,7 +2579,7 @@
 		}
 
 		// Paging.
-		if ( empty( $q['nopaging'] ) && ! $this->is_singular ) {
+		if ( ( empty( $q['nopaging'] ) || 0 == $q['posts_per_page'] ) && ! $this->is_singular ) {
 			$page = absint( $q['paged'] );
 			if ( ! $page ) {
 				$page = 1;
@@ -3256,7 +3268,7 @@
 		 */
 		$this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );
 
-		if ( ! empty( $limits ) ) {
+		if ( ! empty( $limits ) && 0 != $q['posts_per_page'] ) {
 			$this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] );
 		}
 	}
@@ -4413,4 +4425,4 @@
 		_deprecated_function( __METHOD__, '4.5.0' );
 		return $check;
 	}
-}
+}
\ No newline at end of file
