Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Oct 2014 17:36:00 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r272566 - head/sys/kern
Message-ID:  <201410051736.s95Ha0U7010634@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun Oct  5 17:35:59 2014
New Revision: 272566
URL: https://svnweb.freebsd.org/changeset/base/272566

Log:
  On error, sbuf_bcat() returns -1.  Some callers returned this -1 to
  the upper layers, which interpret it as errno value, which happens to
  be ERESTART.  The result was spurious restarts of the sysctls in loop,
  e.g. kern.proc.proc, instead of returning ENOMEM to caller.
  
  Convert -1 from sbuf_bcat() to ENOMEM, when returning to the callers
  expecting errno.
  
  In collaboration with:	pho
  Sponsored by:	The FreeBSD Foundation (kib)
  MFC after:	1 week

Modified:
  head/sys/kern/kern_descrip.c
  head/sys/kern/kern_proc.c

Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c	Sun Oct  5 11:16:16 2014	(r272565)
+++ head/sys/kern/kern_descrip.c	Sun Oct  5 17:35:59 2014	(r272566)
@@ -3097,7 +3097,7 @@ export_kinfo_to_sb(struct export_fd_buf 
 		}
 		efbuf->remainder -= kif->kf_structsize;
 	}
-	return (sbuf_bcat(efbuf->sb, kif, kif->kf_structsize));
+	return (sbuf_bcat(efbuf->sb, kif, kif->kf_structsize) == 0 ? 0 : ENOMEM);
 }
 
 static int

Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c	Sun Oct  5 11:16:16 2014	(r272565)
+++ head/sys/kern/kern_proc.c	Sun Oct  5 17:35:59 2014	(r272566)
@@ -1208,21 +1208,25 @@ kern_proc_out(struct proc *p, struct sbu
 #ifdef COMPAT_FREEBSD32
 		if ((flags & KERN_PROC_MASK32) != 0) {
 			freebsd32_kinfo_proc_out(&ki, &ki32);
-			error = sbuf_bcat(sb, &ki32, sizeof(ki32));
+			if (sbuf_bcat(sb, &ki32, sizeof(ki32)) != 0)
+				error = ENOMEM;
 		} else
 #endif
-			error = sbuf_bcat(sb, &ki, sizeof(ki));
+			if (sbuf_bcat(sb, &ki, sizeof(ki)) != 0)
+				error = ENOMEM;
 	} else {
 		FOREACH_THREAD_IN_PROC(p, td) {
 			fill_kinfo_thread(td, &ki, 1);
 #ifdef COMPAT_FREEBSD32
 			if ((flags & KERN_PROC_MASK32) != 0) {
 				freebsd32_kinfo_proc_out(&ki, &ki32);
-				error = sbuf_bcat(sb, &ki32, sizeof(ki32));
+				if (sbuf_bcat(sb, &ki32, sizeof(ki32)) != 0)
+					error = ENOMEM;
 			} else
 #endif
-				error = sbuf_bcat(sb, &ki, sizeof(ki));
-			if (error)
+				if (sbuf_bcat(sb, &ki, sizeof(ki)) != 0)
+					error = ENOMEM;
+			if (error != 0)
 				break;
 		}
 	}
@@ -1777,7 +1781,8 @@ proc_getauxv(struct thread *td, struct p
 		else
 #endif
 			size = vsize * sizeof(Elf_Auxinfo);
-		error = sbuf_bcat(sb, auxv, size);
+		if (sbuf_bcat(sb, auxv, size) != 0)
+			error = ENOMEM;
 		free(auxv, M_TEMP);
 	}
 	return (error);
@@ -2363,9 +2368,10 @@ kern_proc_vmmap_out(struct proc *p, stru
 		    strlen(kve->kve_path) + 1;
 		kve->kve_structsize = roundup(kve->kve_structsize,
 		    sizeof(uint64_t));
-		error = sbuf_bcat(sb, kve, kve->kve_structsize);
+		if (sbuf_bcat(sb, kve, kve->kve_structsize) != 0)
+			error = ENOMEM;
 		vm_map_lock_read(map);
-		if (error)
+		if (error != 0)
 			break;
 		if (last_timestamp != map->timestamp) {
 			vm_map_lookup_entry(map, addr - 1, &tmp_entry);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201410051736.s95Ha0U7010634>