Page MenuHomeFreeBSD

D29007.diff
No OneTemporary

D29007.diff

Index: lib/libc/stdio/vsscanf.c
===================================================================
--- lib/libc/stdio/vsscanf.c
+++ lib/libc/stdio/vsscanf.c
@@ -48,15 +48,40 @@
#include "local.h"
#include "xlocale_private.h"
-static int
-eofread(void *, char *, int);
+struct _sscancookie {
+ FILE *fp;
+ const char *str;
+};
+
+static int _vsscanf_read(void *, char *, int);
+
+#ifndef VSSCANF_CHUNK_SIZE
+#define VSSCANF_CHUNK_SIZE 128
+#endif
/* ARGSUSED */
static int
-eofread(void *cookie, char *buf, int len)
+_vsscanf_read(void *cookie, char *buf, int len)
{
+ int n;
+ struct _sscancookie *sc;
+
+ sc = (struct _sscancookie *)cookie;
+
+ if (sc->str[0] == '\x00')
+ return (0);
- return (0);
+ n = strnlen(sc->str, VSSCANF_CHUNK_SIZE);
+
+ /*
+ * fp->_p is set in __srefill before calling us, this overwrites
+ * it so we don't have to copy the string into the buffer.
+ */
+ sc->fp->_p = (unsigned char *)sc->str;
+
+ sc->str += n;
+
+ return (n);
}
int
@@ -64,17 +89,25 @@
const char * __restrict fmt, __va_list ap)
{
FILE f = FAKE_FILE;
+ struct _sscancookie sc;
FIX_LOCALE(locale);
f._flags = __SRD;
f._bf._base = f._p = (unsigned char *)str;
- f._bf._size = f._r = strlen(str);
- f._read = eofread;
+ f._bf._size = f._r = strnlen(str, VSSCANF_CHUNK_SIZE);
+ f._read = _vsscanf_read;
+
+ sc = (struct _sscancookie){
+ .fp = &f,
+ .str = str + f._r,
+ };
+ f._cookie = ≻
+
return (__svfscanf(&f, locale, fmt, ap));
}
int
vsscanf(const char * __restrict str, const char * __restrict fmt,
__va_list ap)
{
- return vsscanf_l(str, __get_locale(), fmt, ap);
+ return (vsscanf_l(str, __get_locale(), fmt, ap));
}
Index: lib/libc/string/strnlen.c
===================================================================
--- lib/libc/string/strnlen.c
+++ lib/libc/string/strnlen.c
@@ -32,13 +32,14 @@
#include <string.h>
size_t
-strnlen(const char *s, size_t maxlen)
+strnlen(const char *ptr, size_t maxlen)
{
- size_t len;
+ const char *r;
- for (len = 0; len < maxlen; len++, s++) {
- if (!*s)
- break;
- }
- return (len);
+ r = memchr(ptr, '\0', maxlen);
+
+ if (r == NULL)
+ return (maxlen);
+
+ return (r - ptr);
}

File Metadata

Mime Type
text/plain
Expires
Thu, Jan 22, 9:33 PM (19 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27863833
Default Alt Text
D29007.diff (2 KB)

Event Timeline