> Date: Tue, 3 May 2016 22:47:51 +0300 (MSK)
> Cc: tech@openbsd.org
> 
> So, after initial input, here is improved version. Changelist:
> 
>   - Simplified handling of "matched" variable in sysctl_file(),
>     from kettenis@.
> 
>   - ERRORS section for kvm_getfiles.2 (to be committed separately),
>     requested by bluhm@. I also moved beginning of RETURN VALUES
>     section a bit up, IMHO, that makes more sense; but if any
>     our documentation maintainer will object, I'll revert, of course.
> 
> Okay to commit this version?

ok kettenis@

> Index: sys/kern/kern_sysctl.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
> retrieving revision 1.300
> diff -u -p -r1.300 kern_sysctl.c
> --- sys/kern/kern_sysctl.c    29 Feb 2016 19:44:07 -0000      1.300
> +++ sys/kern/kern_sysctl.c    3 May 2016 19:40:37 -0000
> @@ -1225,7 +1225,7 @@ sysctl_file(int *name, u_int namelen, ch
>       struct process *pr;
>       size_t buflen, elem_size, elem_count, outsize;
>       char *dp = where;
> -     int arg, i, error = 0, needed = 0;
> +     int arg, i, error = 0, needed = 0, matched;
>       u_int op;
>       int show_pointers;
>  
> @@ -1325,6 +1325,7 @@ sysctl_file(int *name, u_int namelen, ch
>                       error = EINVAL;
>                       break;
>               }
> +             matched = 0;
>               LIST_FOREACH(pr, &allprocess, ps_list) {
>                       /*
>                        * skip system, exiting, embryonic and undead
> @@ -1336,6 +1337,7 @@ sysctl_file(int *name, u_int namelen, ch
>                               /* not the pid we are looking for */
>                               continue;
>                       }
> +                     matched = 1;
>                       fdp = pr->ps_fd;
>                       if (pr->ps_textvp)
>                               FILLIT(NULL, NULL, KERN_FILE_TEXT, 
> pr->ps_textvp, pr);
> @@ -1353,6 +1355,8 @@ sysctl_file(int *name, u_int namelen, ch
>                               FILLIT(fp, fdp, i, NULL, pr);
>                       }
>               }
> +             if (!matched)
> +                     error = ESRCH;
>               break;
>       case KERN_FILE_BYUID:
>               LIST_FOREACH(pr, &allprocess, ps_list) {
> Index: lib/libkvm/kvm_file2.c
> ===================================================================
> RCS file: /cvs/src/lib/libkvm/kvm_file2.c,v
> retrieving revision 1.47
> diff -u -p -r1.47 kvm_file2.c
> --- lib/libkvm/kvm_file2.c    4 Sep 2015 02:58:14 -0000       1.47
> +++ lib/libkvm/kvm_file2.c    3 May 2016 19:40:38 -0000
> @@ -149,7 +149,7 @@ kvm_getfiles(kvm_t *kd, int op, int arg,
>                       /* find size and alloc buffer */
>                       rv = sysctl(mib, 6, NULL, &size, NULL, 0);
>                       if (rv == -1) {
> -                             if (kd->vmfd != -1)
> +                             if (errno != ESRCH && kd->vmfd != -1)
>                                       goto deadway;
>                               _kvm_syserr(kd, kd->program, "kvm_getfiles");
>                               return (NULL);
> @@ -266,7 +266,7 @@ kvm_deadfile_byid(kvm_t *kd, int op, int
>  {
>       size_t buflen;
>       struct nlist nl[4], *np;
> -     int n = 0;
> +     int n = 0, matched = 0;
>       char *where;
>       struct kinfo_file kf;
>       struct file *fp, file;
> @@ -312,6 +312,9 @@ kvm_deadfile_byid(kvm_t *kd, int op, int
>       kd->filebase = (void *)where;
>       buflen = (nfiles + 10) * esize;
>  
> +     if (op != KERN_FILE_BYPID || arg <= 0)
> +             matched = 1;
> +
>       for (pr = LIST_FIRST(&allprocess);
>           pr != NULL;
>           pr = LIST_NEXT(&process, ps_list)) {
> @@ -333,10 +336,12 @@ kvm_deadfile_byid(kvm_t *kd, int op, int
>                       goto cleanup;
>               }
>  
> -             if (op == KERN_FILE_BYPID && arg > 0 &&
> -                 proc.p_pid != (pid_t)arg) {
> -                             /* not the pid we are looking for */
> +             if (op == KERN_FILE_BYPID) {
> +                     /* check if this is the pid we are looking for */
> +                     if (arg > 0 && proc.p_pid != (pid_t)arg)
>                               continue;
> +                     else
> +                             matched = 1;
>               }
>  
>               if (KREAD(kd, (u_long)process.ps_ucred, &ucred)) {
> @@ -457,6 +462,10 @@ kvm_deadfile_byid(kvm_t *kd, int op, int
>                       buflen -= esize;
>                       n++;
>               }
> +     }
> +     if (!matched) {
> +             errno = ESRCH;
> +             goto cleanup;
>       }
>  done:
>       *cnt = n;
> Index: lib/libkvm/kvm_getfiles.3
> ===================================================================
> RCS file: /cvs/src/lib/libkvm/kvm_getfiles.3,v
> retrieving revision 1.17
> diff -u -p -r1.17 kvm_getfiles.3
> --- lib/libkvm/kvm_getfiles.3 11 Feb 2015 03:03:08 -0000      1.17
> +++ lib/libkvm/kvm_getfiles.3 3 May 2016 19:40:38 -0000
> @@ -107,7 +107,7 @@ the kernel will only return the requeste
>  each array entry and programs that use
>  .Fn kvm_getfiles
>  will continue to function without the need for recompilation.
> -.Pp
> +.Sh RETURN VALUES
>  The files are returned as a contiguous array of
>  .Vt kinfo_file
>  structures.
> @@ -118,11 +118,26 @@ This memory is owned by kvm and will be 
>  and destroyed by
>  .Fn kvm_close .
>  Data should be copied out if it needs to be saved.
> -.Sh RETURN VALUES
> +.Pp
>  .Fn kvm_getfiles
>  will return
>  .Dv NULL
>  on failure.
> +.Sh ERRORS
> +.Fn kvm_getfiles
> +will fail if:
> +.Bl -tag width Er
> +.It Bq Er ENOMEM
> +Could not allocate enough memory for internal buffer.
> +.It Bq Er ESRCH
> +The
> +.Fa op
> +argument has
> +.Dv KERN_FILE_BYPID
> +value and the process specified by
> +.Fa arg
> +was not found.
> +.El
>  .Sh SEE ALSO
>  .Xr kvm 3 ,
>  .Xr kvm_geterr 3 ,
> 

Reply via email to