On 3/19/07, Magnus Holmgren <lear_at_algonet.se> wrote:
> mailer_at_svn.rockbox.org 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
Received on 2007-03-19