[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 4 of 6] Add sprintf() to hvmloader



On 11/29/11 11:53, Paul Durrant wrote:
# HG changeset patch
# User Paul Durrant<paul.durrant@xxxxxxxxxx>
# Date 1322563734 0
# Node ID e9997777ab6d629b97a8b8f020c18f40c4cf3aa0
# Parent  58cdfa17fb8801ab0a9e8133e0ec2ad47a426f5d
Add sprintf() to hvmloader.

For security reasons I prefer snprintf().

Christoph



Signed-off-by: Paul Durrant<paul.durrant@xxxxxxxxxx>

diff -r 58cdfa17fb88 -r e9997777ab6d tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c   Tue Nov 29 10:48:54 2011 +0000
+++ b/tools/firmware/hvmloader/util.c   Tue Nov 29 10:48:54 2011 +0000
@@ -528,7 +528,7 @@ static char *printnum(char *p, unsigned
      return p;
  }

-static void _doprint(void (*put)(char), const char *fmt, va_list ap)
+static void _doprint(void (*emit)(char**, char), char **arg, const char *fmt, 
va_list ap)
  {
      char *str, c;
      int lflag, zflag, nflag;
@@ -540,7 +540,7 @@ static void _doprint(void (*put)(char),
      {
          if ( *fmt != '%' )
          {
-            put(*fmt);
+            emit(arg, *fmt);
              continue;
          }

@@ -571,7 +571,7 @@ static void _doprint(void (*put)(char),
                  if ( (c == 'd')&&  ((long)value<  0) )
                  {
                      value = -value;
-                    put('-');
+                    emit(arg, '-');
                  }
              }
              else
@@ -580,7 +580,7 @@ static void _doprint(void (*put)(char),
                  if ( (c == 'd')&&  ((int)value<  0) )
                  {
                      value = -(int)value;
-                    put('-');
+                    emit(arg, '-');
                  }
              }
              str = buffer;
@@ -588,13 +588,13 @@ static void _doprint(void (*put)(char),
                       c == 'o' ? 8 : ((c == 'x') || (c == 'X') ? 16 : 10));
              slen = strlen(str);
              for ( i = pad - slen; i>  0; i-- )
-                put(zflag ? '0' : ' ');
+                emit(arg, zflag ? '0' : ' ');
              while ( *str )
              {
                  char ch = *str++;
                  if ( (ch>= 'a')&&  (c == 'X') )
                      ch += 'A'-'a';
-                put(ch);
+                emit(arg, ch);
              }
          }
          else if ( c == 's' )
@@ -603,20 +603,20 @@ static void _doprint(void (*put)(char),
              slen = strlen(str);
              if ( nflag == 0 )
                  for ( i = pad - slen; i>  0; i-- )
-                    put(' ');
+                    emit(arg, ' ');
              while ( *str )
-                put(*str++);
+                emit(arg, *str++);
              if ( nflag )
                  for ( i = pad - slen; i>  0; i-- )
-                    put(' ');
+                    emit(arg, ' ');
          }
          else if ( c == 'c' )
          {
-            put(va_arg(ap, int));
+            emit(arg, va_arg(ap, int));
          }
          else
          {
-            put(*fmt);
+            emit(arg, *fmt);
          }
      }
  }
@@ -626,12 +626,17 @@ static void putchar(char c)
      outb(0xe9, c);
  }

+static void __put(char **ignore, char c)
+{
+    putchar(c);
+}
+
  int printf(const char *fmt, ...)
  {
      va_list ap;

      va_start(ap, fmt);
-    _doprint(putchar, fmt, ap);
+    _doprint(__put, NULL, fmt, ap);
      va_end(ap);

      return 0;
@@ -639,7 +644,25 @@ int printf(const char *fmt, ...)

  int vprintf(const char *fmt, va_list ap)
  {
-    _doprint(putchar, fmt, ap);
+    _doprint(__put, NULL, fmt, ap);
+    return 0;
+}
+
+static void __copy(char **buf, char c)
+{
+    **buf = c;
+    (*buf)++;
+}
+
+int sprintf(char *buf, const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    _doprint(__copy,&buf, fmt, ap);
+    va_end(ap);
+
+    *buf = '\0';
      return 0;
  }

diff -r 58cdfa17fb88 -r e9997777ab6d tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h   Tue Nov 29 10:48:54 2011 +0000
+++ b/tools/firmware/hvmloader/util.h   Tue Nov 29 10:48:54 2011 +0000
@@ -171,6 +171,9 @@ void uuid_to_string(char *dest, uint8_t
  int printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
  int vprintf(const char *fmt, va_list ap);

+/* Buffer output */
+int sprintf(char *buf, const char *fmt, ...) __attribute__ ((format (printf, 
2, 3)));
+
  /* Populate specified memory hole with RAM. */
  void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t nr_mfns);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel



--
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.