[OpenWrt-Devel] [PATCH] [libubox] ulog: check if /dev/kmsg is special file
John Crispin
blogic at openwrt.org
Mon Aug 17 06:36:17 EDT 2015
Hi,
On 16/08/2015 13:08, Sergiy Kibrik wrote:
> Race is possible in ulog_kmsg: if no /dev/kmsg exists
> (e.g. while /dev gets re-mounted) regular file created instead.
> From this point system goes without kernel logger:
> special character file can't be created anymore, all clients keep
> overwriting single message in regular file.
>
> To avoid this we check if file we're going to write to is really
> character special and ensure it doesn't go away while we check.
>
> Signed-off-by: Sergiy Kibrik <sakib at meta.ua>
the patch is quite invasive. how about just using "r+"
from the man page --> "r+ Open for reading and writing. The stream
is positioned at the beginning of the file."
could you try the following and not apply any other changes ?
John
- if ((kmsg = fopen("/dev/kmsg", "w")) != NULL) {
+ if ((kmsg = fopen("/dev/kmsg", "r+")) != NULL) {
> ---
> ulog.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/ulog.c b/ulog.c
> index 776a0c4..10d61da 100644
> --- a/ulog.c
> +++ b/ulog.c
> @@ -23,6 +23,9 @@
> #include <stdlib.h>
> #include <unistd.h>
> #include <string.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
>
> static int _ulog_channels = -1;
> static int _ulog_facility = -1;
> @@ -89,8 +92,18 @@ static void ulog_defaults(void)
> static void ulog_kmsg(int priority, const char *fmt, va_list ap)
> {
> FILE *kmsg;
> + int fd;
> + struct stat s;
> +
> + /* extra checks not to accidentally create regular file */
> + fd = open("/dev/kmsg", O_WRONLY);
> + if (fd < 0)
> + return;
> +
> + if (fstat(fd, &s) == 0 &&
> + s.st_mode & S_IFCHR &&
> + (kmsg = fdopen(fd, "w")) != NULL) {
>
> - if ((kmsg = fopen("/dev/kmsg", "w")) != NULL) {
> fprintf(kmsg, "<%u>", priority);
>
> if (_ulog_ident)
> @@ -99,6 +112,8 @@ static void ulog_kmsg(int priority, const char *fmt, va_list ap)
> vfprintf(kmsg, fmt, ap);
> fclose(kmsg);
> }
> +
> + close(fd);
> }
>
> static void ulog_stdio(int priority, const char *fmt, va_list ap)
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list