svn commit: r272566 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Sun Oct 5 17:36:01 UTC 2014
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);
More information about the svn-src-all
mailing list