Piotr Caban : msvcrt: Added support for secure functions to scanf helper functions.
Alexandre Julliard
julliard at winehq.org
Thu Apr 22 11:24:03 CDT 2010
Module: wine
Branch: master
Commit: 17f486baa45e8e76005dfeb0fc7e399ce9433b83
URL: http://source.winehq.org/git/wine.git/?a=commit;h=17f486baa45e8e76005dfeb0fc7e399ce9433b83
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Apr 22 17:55:27 2010 +0200
msvcrt: Added support for secure functions to scanf helper functions.
---
dlls/msvcrt/scanf.c | 6 +++
dlls/msvcrt/scanf.h | 96 +++++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 95 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcrt/scanf.c b/dlls/msvcrt/scanf.c
index 4845019..d0557d0 100644
--- a/dlls/msvcrt/scanf.c
+++ b/dlls/msvcrt/scanf.c
@@ -24,6 +24,7 @@
*/
#include <stdarg.h>
+#include <limits.h>
#include "windef.h"
#include "winbase.h"
@@ -61,30 +62,35 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
#undef WIDE_SCANF
#undef CONSOLE
#undef STRING
+#undef SECURE
#include "scanf.h"
/* vfwscanf_l */
#define WIDE_SCANF 1
#undef CONSOLE
#undef STRING
+#undef SECURE
#include "scanf.h"
/* vsscanf_l */
#undef WIDE_SCANF
#undef CONSOLE
#define STRING 1
+#undef SECURE
#include "scanf.h"
/* vswscanf_l */
#define WIDE_SCANF 1
#undef CONSOLE
#define STRING 1
+#undef SECURE
#include "scanf.h"
/* vcscanf_l */
#undef WIDE_SCANF
#define CONSOLE 1
#undef STRING
+#undef SECURE
#include "scanf.h"
diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index 086854f..a5202fe 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -48,7 +48,11 @@
#ifdef CONSOLE
#define _GETC_(file) (consumed++, _getch())
#define _UNGETC_(nch, file) do { _ungetch(nch); consumed--; } while(0)
+#ifdef SECURE
+#define _FUNCTION_ static int MSVCRT_vcscanf_s_l(const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#else /* SECURE */
#define _FUNCTION_ static int MSVCRT_vcscanf_l(const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#endif /* SECURE */
#else
#ifdef STRING
#undef _EOF_
@@ -56,19 +60,35 @@
#define _GETC_(file) (consumed++, *file++)
#define _UNGETC_(nch, file) do { file--; consumed--; } while(0)
#ifdef WIDE_SCANF
+#ifdef SECURE
+#define _FUNCTION_ static int MSVCRT_vswscanf_s_l(const MSVCRT_wchar_t *file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#else /* SECURE */
#define _FUNCTION_ static int MSVCRT_vswscanf_l(const MSVCRT_wchar_t *file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#endif /* SECURE */
#else /* WIDE_SCANF */
+#ifdef SECURE
+#define _FUNCTION_ static int MSVCRT_vsscanf_s_l(const char *file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#else /* SECURE */
#define _FUNCTION_ static int MSVCRT_vsscanf_l(const char *file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#endif /* SECURE */
#endif /* WIDE_SCANF */
#else /* STRING */
#ifdef WIDE_SCANF
#define _GETC_(file) (consumed++, MSVCRT_fgetwc(file))
#define _UNGETC_(nch, file) do { MSVCRT_ungetwc(nch, file); consumed--; } while(0)
+#ifdef SECURE
+#define _FUNCTION_ static int MSVCRT_vfwscanf_s_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#else /* SECURE */
#define _FUNCTION_ static int MSVCRT_vfwscanf_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#endif /* SECURE */
#else /* WIDE_SCANF */
#define _GETC_(file) (consumed++, MSVCRT_fgetc(file))
#define _UNGETC_(nch, file) do { MSVCRT_ungetc(nch, file); consumed--; } while(0)
+#ifdef SECURE
+#define _FUNCTION_ static int MSVCRT_vfscanf_s_l(MSVCRT_FILE* file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#else /* SECURE */
#define _FUNCTION_ static int MSVCRT_vfscanf_l(MSVCRT_FILE* file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#endif /* SECURE */
#endif /* WIDE_SCANF */
#endif /* STRING */
#endif /* CONSOLE */
@@ -265,7 +285,7 @@ _FUNCTION_ {
if (width>0) width--;
}
} else {
- cur = 0; /* MaxPayneDemo Fix: .8 -> 0.8 */
+ cur = 0; /* Fix: .8 -> 0.8 */
}
/* handle decimals */
if (width!=0 && nch == *locale->locinfo->lconv->decimal_point) {
@@ -339,12 +359,25 @@ _FUNCTION_ {
#endif /* WIDE_SCANF */
charstring: { /* read a word into a char */
char *sptr = suppress ? NULL : va_arg(ap, char*);
+ char *sptr_beg = sptr;
+#ifdef SECURE
+ unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned);
+#else
+ unsigned size = UINT_MAX;
+#endif
/* skip initial whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
/* read until whitespace */
while (width!=0 && (nch!=_EOF_) && !_ISSPACE_(nch)) {
- if (!suppress) *sptr++ = _CHAR2SUPPORTED_(nch);
+ if (!suppress) {
+ *sptr++ = _CHAR2SUPPORTED_(nch);
+ if(size>1) size--;
+ else {
+ *sptr_beg = 0;
+ return rd;
+ }
+ }
st++;
nch = _GETC_(file);
if (width>0) width--;
@@ -355,12 +388,25 @@ _FUNCTION_ {
break;
widecharstring: { /* read a word into a wchar_t* */
MSVCRT_wchar_t *sptr = suppress ? NULL : va_arg(ap, MSVCRT_wchar_t*);
+ MSVCRT_wchar_t *sptr_beg = sptr;
+#ifdef SECURE
+ unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned);
+#else
+ unsigned size = UINT_MAX;
+#endif
/* skip initial whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
/* read until whitespace */
while (width!=0 && (nch!=_EOF_) && !_ISSPACE_(nch)) {
- if (!suppress) *sptr++ = _WIDE2SUPPORTED_(nch);
+ if (!suppress) {
+ *sptr++ = _WIDE2SUPPORTED_(nch);
+ if(size>1) size--;
+ else {
+ *sptr_beg = 0;
+ return rd;
+ }
+ }
st++;
nch = _GETC_(file);
if (width>0) width--;
@@ -389,10 +435,23 @@ _FUNCTION_ {
#endif /* WIDE_SCANF */
character: { /* read single character into char */
char *str = suppress ? NULL : va_arg(ap, char*);
+ char *pstr = str;
+#ifdef SECURE
+ unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned)/sizeof(char);
+#else
+ unsigned size = UINT_MAX;
+#endif
if (width == -1) width = 1;
- while ((width != 0) && (nch != _EOF_))
+ while (width && (nch != _EOF_))
{
- if (!suppress) *str++ = _CHAR2SUPPORTED_(nch);
+ if (!suppress) {
+ *str++ = _CHAR2SUPPORTED_(nch);
+ if(size) size--;
+ else {
+ *pstr = 0;
+ return rd;
+ }
+ }
st++;
width--;
nch = _GETC_(file);
@@ -401,10 +460,23 @@ _FUNCTION_ {
break;
widecharacter: { /* read single character into a wchar_t */
MSVCRT_wchar_t *str = suppress ? NULL : va_arg(ap, MSVCRT_wchar_t*);
+ MSVCRT_wchar_t *pstr = str;
+#ifdef SECURE
+ unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned)/sizeof(MSVCRT_wchar_t);
+#else
+ unsigned size = UINT_MAX;
+#endif
if (width == -1) width = 1;
- while ((width != 0) && (nch != _EOF_))
+ while (width && (nch != _EOF_))
{
- if (!suppress) *str++ = _WIDE2SUPPORTED_(nch);
+ if (!suppress) {
+ *str++ = _WIDE2SUPPORTED_(nch);
+ if(size) size--;
+ else {
+ *pstr = 0;
+ return rd;
+ }
+ }
st++;
width--;
nch = _GETC_(file);
@@ -437,6 +509,11 @@ _FUNCTION_ {
RTL_BITMAP bitMask;
ULONG *Mask;
int invert = 0; /* Set if we are NOT to find the chars */
+#ifdef SECURE
+ unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned)/sizeof(_CHAR_);
+#else
+ unsigned size = UINT_MAX;
+#endif
/* Init our bitmap */
Mask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, _BITMAPSIZE_/8);
@@ -481,6 +558,11 @@ _FUNCTION_ {
st++;
nch = _GETC_(file);
if (width>0) width--;
+ if(size>1) size--;
+ else {
+ *str = 0;
+ return rd;
+ }
}
/* terminate */
if (!suppress) *sptr = 0;
More information about the wine-cvs
mailing list