On 3/19/07, Magnus Holmgren <[EMAIL PROTECTED]> wrote:
[EMAIL PROTECTED] wrote:

> Log Message:
> Add support for the .precision format in the sprintf()-like functions
> to allow limiting the maximum length of a string.

<...>

>          case 's':
>              str = va_arg (ap, char*);
> +            if(precision > 0)
> +                str[precision] = '\0';

Should it really modify the input string like that? What if it is in
flash? (Might not be a problem as currently used, but...)

   Magnus


Good point. Would this be a better way to do it:

Index: firmware/common/sprintf.c
===================================================================
--- firmware/common/sprintf.c   (revision 12842)
+++ firmware/common/sprintf.c   (working copy)
@@ -27,6 +27,7 @@
#include <stdarg.h>
#include <string.h>
#include <stdbool.h>
+#include <limits.h>

#include "file.h" /* for write(), used in fprintf() */
#include "sprintf.h" /* to allow the simulator magic */
@@ -75,6 +76,8 @@
                precision = 10*precision + ch - '0';
                ch = *fmt++;
            }
+        } else {
+            precision = INT_MAX;
        }

        str = tmpbuf + sizeof tmpbuf - 1;
@@ -86,8 +89,6 @@

        case 's':
            str = va_arg (ap, char*);
-            if(precision > 0)
-                str[precision] = '\0';
            break;

        case 'd':
@@ -160,7 +161,7 @@
        while (width-- > 0 && ok)
            ok=push(userp, pad);
        }
-        while (*str != '\0' && ok)
+        while (*str != '\0' && ok && precision--)
                ok=push(userp, *str++);
    }
    else

Reply via email to