diff --git a/fs/proc/base.c b/fs/proc/base.c
index a86ad9a..fd03634 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1036,15 +1036,16 @@ static ssize_t environ_read(struct file *file, char __user *buf,
 		goto out_free;
 
 	while (count > 0) {
-		int this_len, retval, max_len;
+		size_t this_len, max_len;
+		int retval;
 
-		this_len = mm->env_end - (mm->env_start + src);
-
-		if (this_len <= 0)
+		if (src >= (mm->env_end - mm->env_start))
 			break;
 
-		max_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
-		this_len = (this_len > max_len) ? max_len : this_len;
+		this_len = mm->env_end - (mm->env_start + src);
+
+		max_len = min(PAGE_SIZE, count);
+		this_len = min(max_len, this_len);
 
 		retval = access_process_vm(task, (mm->env_start + src),
 			page, this_len, 0);
