[libvirt] [PATCH 1/2] Add virBufferQuoteString

Guido Günther agx at sigxcpu.org
Fri Jul 29 09:12:03 UTC 2011


Quote strings so they're safe to pass to the shell. Based on glib's
g_quote_string.
---
 src/libvirt_private.syms |    1 +
 src/util/buf.c           |   29 +++++++++++++++++++++++++++++
 src/util/buf.h           |    1 +
 3 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 853ee62..eb16fb6 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -28,6 +28,7 @@ virBufferError;
 virBufferEscapeSexpr;
 virBufferEscapeString;
 virBufferFreeAndReset;
+virBufferQuoteString;
 virBufferStrcat;
 virBufferURIEncodeString;
 virBufferUse;
diff --git a/src/util/buf.c b/src/util/buf.c
index 5002486..8106231 100644
--- a/src/util/buf.c
+++ b/src/util/buf.c
@@ -472,6 +472,35 @@ virBufferURIEncodeString (virBufferPtr buf, const char *str)
 }
 
 /**
+ * virBufferQuoteString:
+ * @buf:  the buffer to append to
+ * @str:  an unquoted string
+ *
+ * Quotes a string so that the shell (/bin/sh) will interpret the
+ * quoted string as unquoted_string.
+ */
+void
+virBufferQuoteString(const virBufferPtr buf, const char *unquoted_str)
+{
+    const char *p;
+
+    virBufferAddChar(buf, '\'');
+    p = unquoted_str;
+
+    while (*p) {
+        /* Replace literal ' with a close ', a \', and a open ' */
+        if (*p == '\'')
+            virBufferAddLit(buf, "'\\''");
+        else
+            virBufferAddChar(buf, *p);
+        ++p;
+    }
+
+    /* close the quote */
+    virBufferAddChar(buf, '\'');
+}
+
+/**
  * virBufferStrcat:
  * @buf:  the buffer to dump
  * @...:  the variable list of strings, the last argument must be NULL
diff --git a/src/util/buf.h b/src/util/buf.h
index 06d01ba..26a2f35 100644
--- a/src/util/buf.h
+++ b/src/util/buf.h
@@ -51,6 +51,7 @@ void virBufferStrcat(const virBufferPtr buf, ...)
 void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);
 void virBufferEscapeSexpr(const virBufferPtr buf, const char *format, const char *str);
 void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
+void virBufferQuoteString(const virBufferPtr buf, const char *str);
 
 # define virBufferAddLit(buf_, literal_string_) \
   virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1)
-- 
1.7.5.4




More information about the libvir-list mailing list