[lvm-devel] master - libdm: validate vsnprintf

Zdenek Kabelac zkabelac at fedoraproject.org
Sun Dec 11 22:34:49 UTC 2016


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6f84d3c69cdc161508fcc29e82f1167334466084
Commit:        6f84d3c69cdc161508fcc29e82f1167334466084
Parent:        3903f915f83634f91946550fda85d60b72ce3a88
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Fri Dec 9 22:54:08 2016 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Sun Dec 11 23:24:17 2016 +0100

libdm: validate vsnprintf

Avoid using buffer when no output has been generated.
Missed in ee13f265f043b47a1b023321fb9e8470fb5703c1.
---
 WHATS_NEW_DM         |    1 +
 libdm/libdm-common.c |   12 ++++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 73707b6..f402113 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
 Version 1.02.138 - 
 =====================================
+  Validation vsnprintf result in runtime translate of dm_log (1.02.136).
   Separate filemap extent allocation from region table.
   Fix segmentation fault when filemap region creation fails
   Fix performance of region cleanup for failed filemap creation.
diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c
index 476f018..d8cf946 100644
--- a/libdm/libdm-common.c
+++ b/libdm/libdm-common.c
@@ -173,14 +173,16 @@ static void _log_to_default_log(int level,
 	    const char *file, int line, int dm_errno_or_class,
 	    const char *f, ...)
 {
+	int n;
 	va_list ap;
 	char buf[2 * PATH_MAX + 256]; /* big enough for most messages */
 
 	va_start(ap, f);
-	vsnprintf(buf, sizeof(buf), f, ap);
+	n = vsnprintf(buf, sizeof(buf), f, ap);
 	va_end(ap);
 
-	dm_log(level, file, line, "%s", buf);
+	if (n > 0) /* Could be truncated */
+		dm_log(level, file, line, "%s", buf);
 }
 
 /*
@@ -195,14 +197,16 @@ __attribute__((format(printf, 4, 5)))
 static void _log_to_default_log_with_errno(int level,
 	    const char *file, int line, const char *f, ...)
 {
+	int n;
 	va_list ap;
 	char buf[2 * PATH_MAX + 256]; /* big enough for most messages */
 
 	va_start(ap, f);
-	vsnprintf(buf, sizeof(buf), f, ap);
+	n = vsnprintf(buf, sizeof(buf), f, ap);
 	va_end(ap);
 
-	dm_log_with_errno(level, file, line, 0, "%s", buf);
+	if (n > 0) /* Could be truncated */
+		dm_log_with_errno(level, file, line, 0, "%s", buf);
 }
 
 void dm_log_init(dm_log_fn fn)




More information about the lvm-devel mailing list