All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ildar Muslukhov <ildarm@google.com>
To: trinity@vger.kernel.org
Cc: davej@redhat.com, Ildar Muslukhov <ildarm@google.com>
Subject: [PATCH 5/6] added bufferless logging functions for syscall pamaters
Date: Tue,  8 Oct 2013 14:26:54 -0700	[thread overview]
Message-ID: <1381267615-9826-5-git-send-email-ildarm@google.com> (raw)
In-Reply-To: <1381267615-9826-1-git-send-email-ildarm@google.com>

Signed-off-by: Ildar Muslukhov <ildarm@google.com>

---
 include/log.h |   9 ++++++
 log.c         | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+)

diff --git a/include/log.h b/include/log.h
index 7041eda..76b825e 100644
--- a/include/log.h
+++ b/include/log.h
@@ -1,6 +1,8 @@
 #ifndef _LOG_H
 #define _LOG_H 1
 
+#include "types.h"
+
 #define ANSI_RED	"^[[1;31m"
 #define ANSI_GREEN	"^[[1;32m"
 #define ANSI_YELLOW	"^[[1;33m"
@@ -21,12 +23,19 @@
 
 #define CRESETPTR if (monochrome == FALSE)	*sptr += sprintf(*sptr, "%s", ANSI_RESET);
 
+#define REDFD if (mono == FALSE)	fprintf(fd, "%s", ANSI_RED);
+#define GREENFD if (mono == FALSE)	fprintf(fd, "%s", ANSI_GREEN);
+#define CRESETFD if (mono == FALSE)	fprintf(fd, "%s", ANSI_RESET);
+
 #define MAX_LOGLEVEL 3
 unsigned int highest_logfile(void);
 void synclogs(void);
 void output(unsigned char level, const char *fmt, ...);
 void outputerr(const char *fmt, ...);
 void outputstd(const char *fmt, ...);
+void output_syscall_prefix(const unsigned int childno, const unsigned int syscallno);
+void output_syscall_postfix(unsigned long ret, int errno_saved, bool err);
+
 void open_logfiles(void);
 void close_logfiles(void);
 
diff --git a/log.c b/log.c
index 518dd81..2a9c140 100644
--- a/log.c
+++ b/log.c
@@ -9,6 +9,9 @@
 #include "shm.h"
 #include "pids.h"
 #include "log.h"
+#include "arch.h" //PAGE_MASK
+#include "maps.h" //pages
+#include "syscall.h" //syscalls
 
 #define BUFSIZE 1024
 
@@ -128,6 +131,10 @@ void synclogs(void)
 	fsync(fileno(mainlogfile));
 }
 
+static void output_arg(unsigned int call, unsigned int argnum, const char *name, unsigned long oldreg, unsigned long reg, int type, FILE *fd, bool mono)
+{
+}
+
 static FILE *robust_find_logfile_handle(void)
 {
 	unsigned int j;
@@ -262,3 +269,97 @@ void outputstd(const char *fmt, ...)
 	vfprintf(stdout, fmt, args);
 	va_end(args);
 }
+
+static void output_syscall_prefix_to_fd(const unsigned int childno, const pid_t pid, const unsigned int syscallno, FILE *fd, bool mono)
+{
+	fprintf(fd, "[child%d:%d] [%ld] %s", childno, pid, shm->child_syscall_count[childno],
+			(shm->do32bit[childno] == TRUE) ? "[32BIT] " : "");
+
+	if (syscallno > max_nr_syscalls)
+		fprintf(fd, "%u", syscallno);
+	else
+		fprintf(fd, "%s", syscalls[syscallno].entry->name);
+
+	CRESETFD
+	fprintf(fd, "(");
+	output_arg(syscallno, 1, syscalls[syscallno].entry->arg1name, shm->previous_a1[childno], shm->a1[childno],
+			syscalls[syscallno].entry->arg1type, fd, mono);
+	output_arg(syscallno, 2, syscalls[syscallno].entry->arg2name, shm->previous_a2[childno], shm->a2[childno],
+			syscalls[syscallno].entry->arg2type, fd, mono);
+	output_arg(syscallno, 3, syscalls[syscallno].entry->arg3name, shm->previous_a3[childno], shm->a3[childno],
+			syscalls[syscallno].entry->arg3type, fd, mono);
+	output_arg(syscallno, 4, syscalls[syscallno].entry->arg4name, shm->previous_a4[childno], shm->a4[childno],
+			syscalls[syscallno].entry->arg4type, fd, mono);
+	output_arg(syscallno, 5, syscalls[syscallno].entry->arg5name, shm->previous_a5[childno], shm->a5[childno],
+			syscalls[syscallno].entry->arg5type, fd, mono);
+	output_arg(syscallno, 6, syscalls[syscallno].entry->arg6name, shm->previous_a6[childno], shm->a6[childno],
+			syscalls[syscallno].entry->arg6type, fd, mono);
+	CRESETFD
+	fprintf(fd, ") ");
+}
+
+/* This function is always called from a fuzzing child. */
+void output_syscall_prefix(const unsigned int childno, const unsigned int syscallno)
+{
+	FILE *log_handle;
+	pid_t pid;
+
+	/* Exit if should not continue at all. */
+	if (logging == FALSE && quiet_level < MAX_LOGLEVEL)
+		return;
+	pid = getpid();
+
+	/* Find the log file handle */
+	log_handle = robust_find_logfile_handle();
+
+	/* do not output any ascii control symbols to files */
+	if ((logging == TRUE) && (log_handle != NULL))
+		output_syscall_prefix_to_fd(childno, pid, syscallno, log_handle, TRUE);
+
+	/* Output to stdout only if -q param is not specified */
+	if (quiet_level == MAX_LOGLEVEL)
+		output_syscall_prefix_to_fd(childno, pid, syscallno, stdout, monochrome);
+}
+
+static void output_syscall_postfix_err(unsigned long ret, int errno_saved, FILE *fd, bool mono)
+{
+	REDFD
+	fprintf(fd, "= %ld (%s)", ret, strerror(errno_saved));
+	CRESETFD
+	fprintf(fd, "\n");
+}
+
+static void output_syscall_postfix_success(unsigned long ret, FILE *fd, bool mono)
+{
+	GREENFD
+	if ((unsigned long)ret > 10000)
+		fprintf(fd, "= 0x%lx", ret);
+	else
+		fprintf(fd, "= %ld", ret);
+	CRESETFD
+	fprintf(fd, "\n");
+}
+
+void output_syscall_postfix(unsigned long ret, int errno_saved, bool err)
+{
+	FILE *log_handle;
+
+	/* Exit if should not continue at all. */
+	if (logging == FALSE && quiet_level < MAX_LOGLEVEL)
+		return;
+
+	/* Find the log file handle */
+	log_handle = robust_find_logfile_handle();
+
+	if (err) {
+		if ((logging == TRUE) && (log_handle != NULL))
+			output_syscall_postfix_err(ret, errno_saved, log_handle, TRUE);
+		if (quiet_level == MAX_LOGLEVEL)
+			output_syscall_postfix_err(ret, errno_saved, stdout, monochrome);
+	} else {
+		if ((logging == TRUE) && (log_handle != NULL))
+			output_syscall_postfix_success(ret, log_handle, TRUE);
+		if (quiet_level == MAX_LOGLEVEL)
+			output_syscall_postfix_success(ret, stdout, monochrome);
+	}
+}
\ No newline at end of file
-- 
1.8.4

  parent reply	other threads:[~2013-10-08 21:26 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-08 21:26 [PATCH 1/6] added outputerr/outputstd log functions Ildar Muslukhov
2013-10-08 21:26 ` [PATCH 2/6] wired outputstd/err functions Ildar Muslukhov
2013-10-08 21:26 ` [PATCH 3/6] refactored output function Ildar Muslukhov
2013-10-10 18:20   ` Dave Jones
2013-10-15 17:07     ` Ildar Muslukhov
2013-10-08 21:26 ` [PATCH 4/6] wired in output function instead of printf (and some missing outputstd) Ildar Muslukhov
2013-10-09 16:23   ` Dave Jones
2013-10-09 21:40     ` Dave Jones
2013-10-08 21:26 ` Ildar Muslukhov [this message]
2013-10-09 16:27   ` [PATCH 5/6] added bufferless logging functions for syscall pamaters Dave Jones
2013-10-08 21:26 ` [PATCH 6/6] wired syscall parameters logging function into syscall (this should fix stack smash bug detected) Ildar Muslukhov
2013-10-09 16:28   ` Dave Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1381267615-9826-5-git-send-email-ildarm@google.com \
    --to=ildarm@google.com \
    --cc=davej@redhat.com \
    --cc=trinity@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.