lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 04 Jul 2008 15:12:36 +0200 From: Vitaly Mayatskikh <v.mayatskih@...il.com> To: Vitaly Mayatskikh <v.mayatskih@...il.com> Cc: linux-kernel@...r.kernel.org, Anton Blanchard <anton@...ibm.com>, Paul Mackerras <paulus@...ibm.com> Subject: Re: [PATCH] PowerPC: honor O_NONBLOCK flag for rtas error_log Vitaly Mayatskikh <v.mayatskih@...il.com> writes: > rtas_log_read() currently doesn't count O_NONBLOCK flag. This sample > code will block on read: > > fd = open ("/proc/ppc64/rtas/error_log", O_RDONLY | O_NONBLOCK); > while (1) { > err =read (fd, buf, 4096); > printf("err = %d, errno = %d (%s)\n", err, errno, strerror(errno)); > sleep(1); > } > > With patched kernel it produces such (correct) output: > > err = 2052, errno = 0 (Success) > err = -1, errno = 11 (Resource temporarily unavailable) > err = -1, errno = 11 (Resource temporarily unavailable) > err = -1, errno = 11 (Resource temporarily unavailable) > err = -1, errno = 11 (Resource temporarily unavailable) Sorry, wrong patch :( Signed-off-by: Vitaly Mayatskikh <v.mayatskih@...il.com> diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index 7d3e2b0..3343211 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c @@ -291,21 +291,24 @@ static ssize_t rtas_log_read(struct file * file, char __user * buf, if (!access_ok(VERIFY_WRITE, buf, count)) return -EFAULT; - tmp = kmalloc(count, GFP_KERNEL); - if (!tmp) - return -ENOMEM; - - spin_lock_irqsave(&rtasd_log_lock, s); /* if it's 0, then we know we got the last one (the one in NVRAM) */ - if (rtas_log_size == 0 && logging_enabled) + if (rtas_log_size == 0 && logging_enabled) { nvram_clear_error_log(); + if (file->f_flags & O_NONBLOCK) { + spin_unlock_irqrestore(&rtasd_log_lock, s); + return -EAGAIN; + } + } spin_unlock_irqrestore(&rtasd_log_lock, s); - error = wait_event_interruptible(rtas_log_wait, rtas_log_size); if (error) - goto out; + return error; + + tmp = kmalloc(count, GFP_KERNEL); + if (!tmp) + return -ENOMEM; spin_lock_irqsave(&rtasd_log_lock, s); offset = rtas_error_log_buffer_max * (rtas_log_start & LOG_NUMBER_MASK); -- wbr, Vitaly -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists