Re: sendsyslog error log

2015-09-01 Thread Theo de Raadt
Seems good to me.

I wouldn't bother with disabling this in SMALL_KERNEL.   Space
is not short enough to complicate the code for ~200 bytes.

> To make syslog reliable, I want to see log messages about failed
> log atempts.  sendsyslog(2) seems a good place to detect and report
> the problem.
> 
> ok?
> 
> bluhm
> 
> Index: kern/subr_log.c
> ===
> RCS file: /data/mirror/openbsd/cvs/src/sys/kern/subr_log.c,v
> retrieving revision 1.30
> diff -u -p -r1.30 subr_log.c
> --- kern/subr_log.c   6 May 2015 08:52:17 -   1.30
> +++ kern/subr_log.c   14 Aug 2015 18:11:47 -
> @@ -83,6 +83,8 @@ int filt_logread(struct knote *kn, long 
>  struct filterops logread_filtops =
>   { 1, NULL, filt_logrdetach, filt_logread};
>  
> +int dosendsyslog(struct proc *, const char *, size_t, enum uio_seg);
> +
>  void
>  initmsgbuf(caddr_t buf, size_t bufsize)
>  {
> @@ -354,6 +356,40 @@ sys_sendsyslog(struct proc *p, void *v, 
>   syscallarg(const void *) buf;
>   syscallarg(size_t) nbyte;
>   } */ *uap = v;
> + int error;
> +#ifndef SMALL_KERNEL
> + static int dropped_count, orig_error;
> + int len;
> + char buf[64];
> +
> + if (dropped_count) {
> + len = snprintf(buf, sizeof(buf),
> + "<%d> sendsyslog: dropped %d message%s, error %d",
> + LOG_KERN|LOG_WARNING, dropped_count,
> + dropped_count == 1 ? "" : "s", orig_error);
> + error = dosendsyslog(p, buf, MIN((size_t)len, sizeof(buf) - 1),
> + UIO_SYSSPACE);
> + if (error) {
> + dropped_count++;
> + return (error);
> + }
> + dropped_count = 0;
> + }
> +#endif
> + error = dosendsyslog(p, SCARG(uap, buf), SCARG(uap, nbyte),
> + UIO_USERSPACE);
> +#ifndef SMALL_KERNEL
> + if (error) {
> + dropped_count++;
> + orig_error = error;
> + }
> +#endif
> + return (error);
> +}
> +
> +int
> +dosendsyslog(struct proc *p, const char *buf, size_t nbyte, enum uio_seg 
> sflg)
> +{
>  #ifdef KTRACE
>   struct iovec *ktriov = NULL;
>   int iovlen;
> @@ -369,11 +405,11 @@ sys_sendsyslog(struct proc *p, void *v, 
>   f = syslogf;
>   FREF(f);
>  
> - aiov.iov_base = (char *)SCARG(uap, buf);
> - aiov.iov_len = SCARG(uap, nbyte);
> + aiov.iov_base = (char *)buf;
> + aiov.iov_len = nbyte;
>   auio.uio_iov = 
>   auio.uio_iovcnt = 1;
> - auio.uio_segflg = UIO_USERSPACE;
> + auio.uio_segflg = sflg;
>   auio.uio_rw = UIO_WRITE;
>   auio.uio_procp = p;
>   auio.uio_offset = 0;
> 



sendsyslog error log

2015-09-01 Thread Alexander Bluhm
Hi,

To make syslog reliable, I want to see log messages about failed
log atempts.  sendsyslog(2) seems a good place to detect and report
the problem.

ok?

bluhm

Index: kern/subr_log.c
===
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/subr_log.c,v
retrieving revision 1.30
diff -u -p -r1.30 subr_log.c
--- kern/subr_log.c 6 May 2015 08:52:17 -   1.30
+++ kern/subr_log.c 14 Aug 2015 18:11:47 -
@@ -83,6 +83,8 @@ int filt_logread(struct knote *kn, long 
 struct filterops logread_filtops =
{ 1, NULL, filt_logrdetach, filt_logread};
 
+int dosendsyslog(struct proc *, const char *, size_t, enum uio_seg);
+
 void
 initmsgbuf(caddr_t buf, size_t bufsize)
 {
@@ -354,6 +356,40 @@ sys_sendsyslog(struct proc *p, void *v, 
syscallarg(const void *) buf;
syscallarg(size_t) nbyte;
} */ *uap = v;
+   int error;
+#ifndef SMALL_KERNEL
+   static int dropped_count, orig_error;
+   int len;
+   char buf[64];
+
+   if (dropped_count) {
+   len = snprintf(buf, sizeof(buf),
+   "<%d> sendsyslog: dropped %d message%s, error %d",
+   LOG_KERN|LOG_WARNING, dropped_count,
+   dropped_count == 1 ? "" : "s", orig_error);
+   error = dosendsyslog(p, buf, MIN((size_t)len, sizeof(buf) - 1),
+   UIO_SYSSPACE);
+   if (error) {
+   dropped_count++;
+   return (error);
+   }
+   dropped_count = 0;
+   }
+#endif
+   error = dosendsyslog(p, SCARG(uap, buf), SCARG(uap, nbyte),
+   UIO_USERSPACE);
+#ifndef SMALL_KERNEL
+   if (error) {
+   dropped_count++;
+   orig_error = error;
+   }
+#endif
+   return (error);
+}
+
+int
+dosendsyslog(struct proc *p, const char *buf, size_t nbyte, enum uio_seg sflg)
+{
 #ifdef KTRACE
struct iovec *ktriov = NULL;
int iovlen;
@@ -369,11 +405,11 @@ sys_sendsyslog(struct proc *p, void *v, 
f = syslogf;
FREF(f);
 
-   aiov.iov_base = (char *)SCARG(uap, buf);
-   aiov.iov_len = SCARG(uap, nbyte);
+   aiov.iov_base = (char *)buf;
+   aiov.iov_len = nbyte;
auio.uio_iov = 
auio.uio_iovcnt = 1;
-   auio.uio_segflg = UIO_USERSPACE;
+   auio.uio_segflg = sflg;
auio.uio_rw = UIO_WRITE;
auio.uio_procp = p;
auio.uio_offset = 0;