Consistently pass around context information using a simple pointer. This

fixes some dereferencing bugs in Chinese character set conversions.

PR:		185964
MFC after:	5 days
This commit is contained in:
Tijl Coosemans 2014-02-24 13:33:20 +00:00
parent b85b1bbd0f
commit 64f204f9dd
4 changed files with 15 additions and 17 deletions

View File

@ -339,7 +339,7 @@ _citrus_prop_read_symbol(struct _memstream * __restrict ms,
static int static int
_citrus_prop_parse_element(struct _memstream * __restrict ms, _citrus_prop_parse_element(struct _memstream * __restrict ms,
const _citrus_prop_hint_t * __restrict hints, void ** __restrict context) const _citrus_prop_hint_t * __restrict hints, void * __restrict context)
{ {
int ch, errnum; int ch, errnum;
#define _CITRUS_PROP_HINT_NAME_LEN_MAX 255 #define _CITRUS_PROP_HINT_NAME_LEN_MAX 255
@ -435,8 +435,7 @@ _citrus_prop_parse_variable(const _citrus_prop_hint_t * __restrict hints,
if (ch == EOF || ch == '\0') if (ch == EOF || ch == '\0')
break; break;
_memstream_ungetc(&ms, ch); _memstream_ungetc(&ms, ch);
errnum = _citrus_prop_parse_element( errnum = _citrus_prop_parse_element(&ms, hints, context);
&ms, hints, (void ** __restrict)context);
if (errnum != 0) if (errnum != 0)
return (errnum); return (errnum);
} }

View File

@ -42,7 +42,7 @@ typedef struct _citrus_prop_hint_t _citrus_prop_hint_t;
#define _CITRUS_PROP_CB0_T(_func_, _type_) \ #define _CITRUS_PROP_CB0_T(_func_, _type_) \
typedef int (*_citrus_prop_##_func_##_cb_func_t) \ typedef int (*_citrus_prop_##_func_##_cb_func_t) \
(void ** __restrict, const char *, _type_); \ (void * __restrict, const char *, _type_); \
typedef struct { \ typedef struct { \
_citrus_prop_##_func_##_cb_func_t func; \ _citrus_prop_##_func_##_cb_func_t func; \
} _citrus_prop_##_func_##_cb_t; } _citrus_prop_##_func_##_cb_t;
@ -52,7 +52,7 @@ _CITRUS_PROP_CB0_T(str, const char *)
#define _CITRUS_PROP_CB1_T(_func_, _type_) \ #define _CITRUS_PROP_CB1_T(_func_, _type_) \
typedef int (*_citrus_prop_##_func_##_cb_func_t) \ typedef int (*_citrus_prop_##_func_##_cb_func_t) \
(void ** __restrict, const char *, _type_, _type_); \ (void * __restrict, const char *, _type_, _type_); \
typedef struct { \ typedef struct { \
_citrus_prop_##_func_##_cb_func_t func; \ _citrus_prop_##_func_##_cb_func_t func; \
} _citrus_prop_##_func_##_cb_t; } _citrus_prop_##_func_##_cb_t;

View File

@ -172,7 +172,7 @@ _citrus_BIG5_check_excludes(_BIG5EncodingInfo *ei, wint_t c)
} }
static int static int
_citrus_BIG5_fill_rowcol(void ** __restrict ctx, const char * __restrict s, _citrus_BIG5_fill_rowcol(void * __restrict ctx, const char * __restrict s,
uint64_t start, uint64_t end) uint64_t start, uint64_t end)
{ {
_BIG5EncodingInfo *ei; _BIG5EncodingInfo *ei;
@ -191,7 +191,7 @@ _citrus_BIG5_fill_rowcol(void ** __restrict ctx, const char * __restrict s,
static int static int
/*ARGSUSED*/ /*ARGSUSED*/
_citrus_BIG5_fill_excludes(void ** __restrict ctx, _citrus_BIG5_fill_excludes(void * __restrict ctx,
const char * __restrict s __unused, uint64_t start, uint64_t end) const char * __restrict s __unused, uint64_t start, uint64_t end)
{ {
_BIG5EncodingInfo *ei; _BIG5EncodingInfo *ei;
@ -237,7 +237,6 @@ static int
_citrus_BIG5_encoding_module_init(_BIG5EncodingInfo * __restrict ei, _citrus_BIG5_encoding_module_init(_BIG5EncodingInfo * __restrict ei,
const void * __restrict var, size_t lenvar) const void * __restrict var, size_t lenvar)
{ {
void *ctx = (void *)ei;
const char *s; const char *s;
int err; int err;
@ -259,9 +258,9 @@ _citrus_BIG5_encoding_module_init(_BIG5EncodingInfo * __restrict ei,
} }
/* fallback Big5-1984, for backward compatibility. */ /* fallback Big5-1984, for backward compatibility. */
_citrus_BIG5_fill_rowcol((void **)&ctx, "row", 0xA1, 0xFE); _citrus_BIG5_fill_rowcol(ei, "row", 0xA1, 0xFE);
_citrus_BIG5_fill_rowcol((void **)&ctx, "col", 0x40, 0x7E); _citrus_BIG5_fill_rowcol(ei, "col", 0x40, 0x7E);
_citrus_BIG5_fill_rowcol((void **)&ctx, "col", 0xA1, 0xFE); _citrus_BIG5_fill_rowcol(ei, "col", 0xA1, 0xFE);
return (0); return (0);
} }

View File

@ -505,12 +505,12 @@ _citrus_HZ_encoding_module_uninit(_HZEncodingInfo *ei)
} }
static int static int
_citrus_HZ_parse_char(void **context, const char *name __unused, const char *s) _citrus_HZ_parse_char(void *context, const char *name __unused, const char *s)
{ {
escape_t *escape; escape_t *escape;
void **p; void **p;
p = (void **)*context; p = (void **)context;
escape = (escape_t *)p[0]; escape = (escape_t *)p[0];
if (escape->ch != '\0') if (escape->ch != '\0')
return (EINVAL); return (EINVAL);
@ -522,14 +522,14 @@ _citrus_HZ_parse_char(void **context, const char *name __unused, const char *s)
} }
static int static int
_citrus_HZ_parse_graphic(void **context, const char *name, const char *s) _citrus_HZ_parse_graphic(void *context, const char *name, const char *s)
{ {
_HZEncodingInfo *ei; _HZEncodingInfo *ei;
escape_t *escape; escape_t *escape;
graphic_t *graphic; graphic_t *graphic;
void **p; void **p;
p = (void **)*context; p = (void **)context;
escape = (escape_t *)p[0]; escape = (escape_t *)p[0];
ei = (_HZEncodingInfo *)p[1]; ei = (_HZEncodingInfo *)p[1];
graphic = malloc(sizeof(*graphic)); graphic = malloc(sizeof(*graphic));
@ -591,13 +591,13 @@ _CITRUS_PROP_HINT_END
}; };
static int static int
_citrus_HZ_parse_escape(void **context, const char *name, const char *s) _citrus_HZ_parse_escape(void *context, const char *name, const char *s)
{ {
_HZEncodingInfo *ei; _HZEncodingInfo *ei;
escape_t *escape; escape_t *escape;
void *p[2]; void *p[2];
ei = (_HZEncodingInfo *)*context; ei = (_HZEncodingInfo *)context;
escape = malloc(sizeof(*escape)); escape = malloc(sizeof(*escape));
if (escape == NULL) if (escape == NULL)
return (EINVAL); return (EINVAL);