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:
parent
b85b1bbd0f
commit
64f204f9dd
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user