Author: trociny
Date: Wed Feb  1 18:02:13 2012
New Revision: 230873
URL: http://svn.freebsd.org/changeset/base/230873

Log:
  Try to avoid ambiguity when sysctl returns ENOMEM additionally
  checking the returned oldlen: when ENOMEM is due to the supplied
  buffer being too short the return oldlen is equal to buffer size.
  
  Without this additional check kvm_getprocs() gets stuck in loop if the
  returned ENOMEM was due the exceeded memorylocked limit. This is
  easily can be observed running `limits -l 1k top'.
  
  Submitted by: Andrey Zonov <andrey zonov org>
  MFC after:    1 week

Modified:
  head/lib/libkvm/kvm_proc.c

Modified: head/lib/libkvm/kvm_proc.c
==============================================================================
--- head/lib/libkvm/kvm_proc.c  Wed Feb  1 17:56:38 2012        (r230872)
+++ head/lib/libkvm/kvm_proc.c  Wed Feb  1 18:02:13 2012        (r230873)
@@ -474,7 +474,7 @@ struct kinfo_proc *
 kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt)
 {
        int mib[4], st, nprocs;
-       size_t size;
+       size_t size, osize;
        int temp_op;
 
        if (kd->procbase != 0) {
@@ -524,10 +524,11 @@ kvm_getprocs(kvm_t *kd, int op, int arg,
                            _kvm_realloc(kd, kd->procbase, size);
                        if (kd->procbase == 0)
                                return (0);
+                       osize = size;
                        st = sysctl(mib, temp_op == KERN_PROC_ALL ||
                            temp_op == KERN_PROC_PROC ? 3 : 4,
                            kd->procbase, &size, NULL, 0);
-               } while (st == -1 && errno == ENOMEM);
+               } while (st == -1 && errno == ENOMEM && size == osize);
                if (st == -1) {
                        _kvm_syserr(kd, kd->program, "kvm_getprocs");
                        return (0);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to