diff options
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/gen/siginterrupt.c | 2 | ||||
-rw-r--r-- | lib/libc/gen/signal.c | 2 | ||||
-rw-r--r-- | lib/libc/iconv/Symbol.map | 10 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_csmapper.c | 6 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_iconv.c | 14 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_iconv.h | 2 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_iconv_local.h | 4 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_lock.h | 10 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_mapper.c | 24 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_none.c | 4 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_stdenc.h | 2 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_stdenc_local.h | 8 | ||||
-rw-r--r-- | lib/libc/iconv/citrus_stdenc_template.h | 4 | ||||
-rw-r--r-- | lib/libc/iconv/iconv.c | 21 | ||||
-rw-r--r-- | lib/libc/locale/cXXrtomb_iconv.h | 3 | ||||
-rw-r--r-- | lib/libc/locale/mbrtocXX_iconv.h | 3 | ||||
-rw-r--r-- | lib/libc/stdlib/rand.c | 41 |
17 files changed, 99 insertions, 61 deletions
diff --git a/lib/libc/gen/siginterrupt.c b/lib/libc/gen/siginterrupt.c index dde474c..fde33ca 100644 --- a/lib/libc/gen/siginterrupt.c +++ b/lib/libc/gen/siginterrupt.c @@ -46,7 +46,7 @@ int siginterrupt(sig, flag) int sig, flag; { - extern sigset_t _sigintr; + extern sigset_t _sigintr __hidden; struct sigaction sa; int ret; diff --git a/lib/libc/gen/signal.c b/lib/libc/gen/signal.c index c93633e..ee96dcc 100644 --- a/lib/libc/gen/signal.c +++ b/lib/libc/gen/signal.c @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" -sigset_t _sigintr; /* shared with siginterrupt */ +sigset_t _sigintr __hidden; /* shared with siginterrupt */ sig_t signal(s, a) diff --git a/lib/libc/iconv/Symbol.map b/lib/libc/iconv/Symbol.map index 73e0e22..82be46f 100644 --- a/lib/libc/iconv/Symbol.map +++ b/lib/libc/iconv/Symbol.map @@ -17,6 +17,16 @@ FBSD_1.2 { libiconvlist; }; +FBSD_1.3 { + iconv; + iconv_open; + iconv_close; + iconv_open_into; + iconv_set_relocation_prefix; + iconvctl; + iconvlist; +}; + FBSDprivate_1.0 { _citrus_bcs_convert_to_lower; _citrus_bcs_convert_to_upper; diff --git a/lib/libc/iconv/citrus_csmapper.c b/lib/libc/iconv/citrus_csmapper.c index 5e0a01a..e2d10d5 100644 --- a/lib/libc/iconv/citrus_csmapper.c +++ b/lib/libc/iconv/citrus_csmapper.c @@ -58,6 +58,8 @@ static struct _citrus_mapper_area *maparea = NULL; +static pthread_rwlock_t ma_lock = PTHREAD_RWLOCK_INITIALIZER; + #define CS_ALIAS _PATH_CSMAPPER "/charset.alias" #define CS_PIVOT _PATH_CSMAPPER "/charset.pivot" @@ -314,7 +316,7 @@ get_none(struct _citrus_mapper_area *__restrict ma, { int ret; - WLOCK; + WLOCK(&ma_lock); if (csm_none) { *rcsm = csm_none; ret = 0; @@ -329,7 +331,7 @@ get_none(struct _citrus_mapper_area *__restrict ma, *rcsm = csm_none; ret = 0; quit: - UNLOCK; + UNLOCK(&ma_lock); return (ret); } diff --git a/lib/libc/iconv/citrus_iconv.c b/lib/libc/iconv/citrus_iconv.c index 04acccf..31cf7df 100644 --- a/lib/libc/iconv/citrus_iconv.c +++ b/lib/libc/iconv/citrus_iconv.c @@ -68,11 +68,13 @@ static int shared_max_reuse, shared_num_unused; static _CITRUS_HASH_HEAD(, _citrus_iconv_shared, CI_HASH_SIZE) shared_pool; static TAILQ_HEAD(, _citrus_iconv_shared) shared_unused; +static pthread_rwlock_t ci_lock = PTHREAD_RWLOCK_INITIALIZER; + static __inline void init_cache(void) { - WLOCK; + WLOCK(&ci_lock); if (!isinit) { _CITRUS_HASH_INIT(&shared_pool, CI_HASH_SIZE); TAILQ_INIT(&shared_unused); @@ -83,7 +85,7 @@ init_cache(void) shared_max_reuse = CI_INITIAL_MAX_REUSE; isinit = true; } - UNLOCK; + UNLOCK(&ci_lock); } static __inline void @@ -195,7 +197,7 @@ get_shared(struct _citrus_iconv_shared * __restrict * __restrict rci, snprintf(convname, sizeof(convname), "%s/%s", src, dst); - WLOCK; + WLOCK(&ci_lock); /* lookup alread existing entry */ hashval = hash_func(convname); @@ -222,7 +224,7 @@ get_shared(struct _citrus_iconv_shared * __restrict * __restrict rci, *rci = ci; quit: - UNLOCK; + UNLOCK(&ci_lock); return (ret); } @@ -231,7 +233,7 @@ static void release_shared(struct _citrus_iconv_shared * __restrict ci) { - WLOCK; + WLOCK(&ci_lock); ci->ci_used_count--; if (ci->ci_used_count == 0) { /* put it into unused list */ @@ -247,7 +249,7 @@ release_shared(struct _citrus_iconv_shared * __restrict ci) } } - UNLOCK; + UNLOCK(&ci_lock); } /* diff --git a/lib/libc/iconv/citrus_iconv.h b/lib/libc/iconv/citrus_iconv.h index 99604e9..ac14ac3 100644 --- a/lib/libc/iconv/citrus_iconv.h +++ b/lib/libc/iconv/citrus_iconv.h @@ -52,7 +52,7 @@ __END_DECLS */ static __inline int _citrus_iconv_convert(struct _citrus_iconv * __restrict cv, - char * __restrict * __restrict in, size_t * __restrict inbytes, + const char * __restrict * __restrict in, size_t * __restrict inbytes, char * __restrict * __restrict out, size_t * __restrict outbytes, uint32_t flags, size_t * __restrict nresults) { diff --git a/lib/libc/iconv/citrus_iconv_local.h b/lib/libc/iconv/citrus_iconv_local.h index 081a708..52ac825 100644 --- a/lib/libc/iconv/citrus_iconv_local.h +++ b/lib/libc/iconv/citrus_iconv_local.h @@ -45,7 +45,7 @@ static void _citrus_##_m_##_iconv_uninit_shared \ (struct _citrus_iconv_shared *); \ static int _citrus_##_m_##_iconv_convert \ (struct _citrus_iconv * __restrict, \ - char * __restrict * __restrict, \ + const char * __restrict * __restrict, \ size_t * __restrict, \ char * __restrict * __restrict, \ size_t * __restrict outbytes, \ @@ -74,7 +74,7 @@ typedef void (*_citrus_iconv_uninit_shared_t) (struct _citrus_iconv_shared *); typedef int (*_citrus_iconv_convert_t) (struct _citrus_iconv * __restrict, - char *__restrict* __restrict, size_t * __restrict, + const char *__restrict* __restrict, size_t * __restrict, char * __restrict * __restrict, size_t * __restrict, uint32_t, size_t * __restrict); typedef int (*_citrus_iconv_init_context_t)(struct _citrus_iconv *); diff --git a/lib/libc/iconv/citrus_lock.h b/lib/libc/iconv/citrus_lock.h index ad9443a..3950644 100644 --- a/lib/libc/iconv/citrus_lock.h +++ b/lib/libc/iconv/citrus_lock.h @@ -27,9 +27,7 @@ #include <pthread.h> -static pthread_rwlock_t lock; - -#define WLOCK if (__isthreaded) \ - pthread_rwlock_wrlock(&lock); -#define UNLOCK if (__isthreaded) \ - pthread_rwlock_unlock(&lock); +#define WLOCK(lock) if (__isthreaded) \ + pthread_rwlock_wrlock(lock); +#define UNLOCK(lock) if (__isthreaded) \ + pthread_rwlock_unlock(lock); diff --git a/lib/libc/iconv/citrus_mapper.c b/lib/libc/iconv/citrus_mapper.c index b5ae96d..b1ee8fb 100644 --- a/lib/libc/iconv/citrus_mapper.c +++ b/lib/libc/iconv/citrus_mapper.c @@ -55,6 +55,8 @@ #define CM_HASH_SIZE 101 #define REFCOUNT_PERSISTENT -1 +static pthread_rwlock_t cm_lock = PTHREAD_RWLOCK_INITIALIZER; + struct _citrus_mapper_area { _CITRUS_HASH_HEAD(, _citrus_mapper, CM_HASH_SIZE) ma_cache; char *ma_dir; @@ -75,7 +77,7 @@ _citrus_mapper_create_area( char path[PATH_MAX]; int ret; - WLOCK; + WLOCK(&cm_lock); if (*rma != NULL) { ret = 0; @@ -96,7 +98,7 @@ _citrus_mapper_create_area( ma->ma_dir = strdup(area); if (ma->ma_dir == NULL) { ret = errno; - free(ma->ma_dir); + free(ma); goto quit; } _CITRUS_HASH_INIT(&ma->ma_cache, CM_HASH_SIZE); @@ -104,7 +106,7 @@ _citrus_mapper_create_area( *rma = ma; ret = 0; quit: - UNLOCK; + UNLOCK(&cm_lock); return (ret); } @@ -316,7 +318,7 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma, variable = NULL; - WLOCK; + WLOCK(&cm_lock); /* search in the cache */ hashval = hash_func(mapname); @@ -337,9 +339,9 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma, goto quit; /* open mapper */ - UNLOCK; + UNLOCK(&cm_lock); ret = mapper_open(ma, &cm, module, variable); - WLOCK; + WLOCK(&cm_lock); if (ret) goto quit; cm->cm_key = strdup(mapname); @@ -356,7 +358,7 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma, *rcm = cm; ret = 0; quit: - UNLOCK; + UNLOCK(&cm_lock); return (ret); } @@ -370,7 +372,7 @@ _citrus_mapper_close(struct _citrus_mapper *cm) { if (cm) { - WLOCK; + WLOCK(&cm_lock); if (cm->cm_refcount == REFCOUNT_PERSISTENT) goto quit; if (cm->cm_refcount > 0) { @@ -381,7 +383,7 @@ _citrus_mapper_close(struct _citrus_mapper *cm) } mapper_close(cm); quit: - UNLOCK; + UNLOCK(&cm_lock); } } @@ -393,7 +395,7 @@ void _citrus_mapper_set_persistent(struct _citrus_mapper * __restrict cm) { - WLOCK; + WLOCK(&cm_lock); cm->cm_refcount = REFCOUNT_PERSISTENT; - UNLOCK; + UNLOCK(&cm_lock); } diff --git a/lib/libc/iconv/citrus_none.c b/lib/libc/iconv/citrus_none.c index 9ec4bd3..4f9b254 100644 --- a/lib/libc/iconv/citrus_none.c +++ b/lib/libc/iconv/citrus_none.c @@ -83,7 +83,7 @@ _citrus_NONE_stdenc_init_state(struct _citrus_stdenc * __restrict ce __unused, static int _citrus_NONE_stdenc_mbtocs(struct _citrus_stdenc * __restrict ce __unused, - _csid_t *csid, _index_t *idx, char **s, size_t n, + _csid_t *csid, _index_t *idx, const char **s, size_t n, void *ps __unused, size_t *nresult, struct iconv_hooks *hooks) { @@ -159,7 +159,7 @@ _citrus_NONE_stdenc_cstomb(struct _citrus_stdenc * __restrict ce __unused, static int _citrus_NONE_stdenc_mbtowc(struct _citrus_stdenc * __restrict ce __unused, - _wc_t * __restrict pwc, char ** __restrict s, size_t n, + _wc_t * __restrict pwc, const char ** __restrict s, size_t n, void * __restrict pspriv __unused, size_t * __restrict nresult, struct iconv_hooks *hooks) { diff --git a/lib/libc/iconv/citrus_stdenc.h b/lib/libc/iconv/citrus_stdenc.h index 50f4dff..28fa29d 100644 --- a/lib/libc/iconv/citrus_stdenc.h +++ b/lib/libc/iconv/citrus_stdenc.h @@ -69,7 +69,7 @@ _citrus_stdenc_init_state(struct _citrus_stdenc * __restrict ce, static __inline int _citrus_stdenc_mbtocs(struct _citrus_stdenc * __restrict ce, _citrus_csid_t * __restrict csid, _citrus_index_t * __restrict idx, - char ** __restrict s, size_t n, void * __restrict ps, + const char ** __restrict s, size_t n, void * __restrict ps, size_t * __restrict nresult, struct iconv_hooks *hooks) { diff --git a/lib/libc/iconv/citrus_stdenc_local.h b/lib/libc/iconv/citrus_stdenc_local.h index 141abff..7b627a0 100644 --- a/lib/libc/iconv/citrus_stdenc_local.h +++ b/lib/libc/iconv/citrus_stdenc_local.h @@ -55,7 +55,7 @@ static int _citrus_##_e_##_stdenc_mbtocs \ (struct _citrus_stdenc * __restrict, \ _citrus_csid_t * __restrict, \ _citrus_index_t * __restrict, \ - char ** __restrict, size_t, \ + const char ** __restrict, size_t, \ void * __restrict, size_t * __restrict, \ struct iconv_hooks *); \ static int _citrus_##_e_##_stdenc_cstomb \ @@ -66,7 +66,7 @@ static int _citrus_##_e_##_stdenc_cstomb \ static int _citrus_##_e_##_stdenc_mbtowc \ (struct _citrus_stdenc * __restrict, \ _citrus_wc_t * __restrict, \ - char ** __restrict, size_t, \ + const char ** __restrict, size_t, \ void * __restrict, size_t * __restrict, \ struct iconv_hooks *); \ static int _citrus_##_e_##_stdenc_wctomb \ @@ -106,7 +106,7 @@ typedef int (*_citrus_stdenc_init_state_t) typedef int (*_citrus_stdenc_mbtocs_t) (struct _citrus_stdenc * __restrict, _citrus_csid_t * __restrict, _citrus_index_t * __restrict, - char ** __restrict, size_t, + const char ** __restrict, size_t, void * __restrict, size_t * __restrict, struct iconv_hooks *); typedef int (*_citrus_stdenc_cstomb_t) @@ -116,7 +116,7 @@ typedef int (*_citrus_stdenc_cstomb_t) typedef int (*_citrus_stdenc_mbtowc_t) (struct _citrus_stdenc * __restrict, _citrus_wc_t * __restrict, - char ** __restrict, size_t, + const char ** __restrict, size_t, void * __restrict, size_t * __restrict, struct iconv_hooks *); typedef int (*_citrus_stdenc_wctomb_t) diff --git a/lib/libc/iconv/citrus_stdenc_template.h b/lib/libc/iconv/citrus_stdenc_template.h index 9a05fa7..21bc5cc 100644 --- a/lib/libc/iconv/citrus_stdenc_template.h +++ b/lib/libc/iconv/citrus_stdenc_template.h @@ -112,7 +112,7 @@ _FUNCNAME(stdenc_init_state)(struct _citrus_stdenc * __restrict ce, static int _FUNCNAME(stdenc_mbtocs)(struct _citrus_stdenc * __restrict ce, _citrus_csid_t * __restrict csid, _citrus_index_t * __restrict idx, - char ** __restrict s, size_t n, void * __restrict ps, + const char ** __restrict s, size_t n, void * __restrict ps, size_t * __restrict nresult, struct iconv_hooks *hooks) { wchar_t wc; @@ -151,7 +151,7 @@ _FUNCNAME(stdenc_cstomb)(struct _citrus_stdenc * __restrict ce, static int _FUNCNAME(stdenc_mbtowc)(struct _citrus_stdenc * __restrict ce, - _citrus_wc_t * __restrict wc, char ** __restrict s, size_t n, + _citrus_wc_t * __restrict wc, const char ** __restrict s, size_t n, void * __restrict ps, size_t * __restrict nresult, struct iconv_hooks *hooks) { diff --git a/lib/libc/iconv/iconv.c b/lib/libc/iconv/iconv.c index 99cfc37..9b28ff6 100644 --- a/lib/libc/iconv/iconv.c +++ b/lib/libc/iconv/iconv.c @@ -47,16 +47,13 @@ #include "citrus_hash.h" #include "citrus_iconv.h" -#ifdef __weak_alias -__weak_alias(libiconv, _iconv) -__weak_alias(libiconv_open, _iconv_open) -__weak_alias(libiconv_open_into, _iconv_open_into) -__weak_alias(libiconv_close, _iconv_close) -__weak_alias(libiconvlist, _iconvlist) -__weak_alias(libiconvctl, _iconvctl) -__weak_alias(libiconv_set_relocation_prefix, _iconv_set_relocation_prefix) -__weak_alias(iconv_canonicalize, _iconv_canonicalize) -#endif +__weak_reference(libiconv, iconv); +__weak_reference(libiconv_open, iconv_open); +__weak_reference(libiconv_open_into, iconv_open_into); +__weak_reference(libiconv_close, iconv_close); +__weak_reference(libiconvlist, iconvlist); +__weak_reference(libiconvctl, iconvctl); +__weak_reference(libiconv_set_relocation_prefix, iconv_set_relocation_prefix); #define ISBADF(_h_) (!(_h_) || (_h_) == (iconv_t)-1) @@ -133,7 +130,7 @@ libiconv_close(iconv_t handle) } size_t -libiconv(iconv_t handle, char **in, size_t *szin, char **out, size_t *szout) +libiconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout) { size_t ret; int err; @@ -154,7 +151,7 @@ libiconv(iconv_t handle, char **in, size_t *szin, char **out, size_t *szout) } size_t -__iconv(iconv_t handle, char **in, size_t *szin, char **out, +__iconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout, uint32_t flags, size_t *invalids) { size_t ret; diff --git a/lib/libc/locale/cXXrtomb_iconv.h b/lib/libc/locale/cXXrtomb_iconv.h index d6e7ce0..0ea553b 100644 --- a/lib/libc/locale/cXXrtomb_iconv.h +++ b/lib/libc/locale/cXXrtomb_iconv.h @@ -57,7 +57,8 @@ cXXrtomb_l(char * __restrict s, charXX_t c, mbstate_t * __restrict ps, { _ConversionState *cs; struct _citrus_iconv *handle; - char *src, *dst; + const char *src; + char *dst; size_t srcleft, dstleft, invlen; int err; diff --git a/lib/libc/locale/mbrtocXX_iconv.h b/lib/libc/locale/mbrtocXX_iconv.h index 9eb6f68..ac85a5a 100644 --- a/lib/libc/locale/mbrtocXX_iconv.h +++ b/lib/libc/locale/mbrtocXX_iconv.h @@ -99,7 +99,8 @@ mbrtocXX_l(charXX_t * __restrict pc, const char * __restrict s, size_t n, /* Convert as few characters to the dst buffer as possible. */ for (i = 0; ; i++) { - char *src, *dst; + const char *src; + char *dst; size_t srcleft, dstleft, invlen; int err; diff --git a/lib/libc/stdlib/rand.c b/lib/libc/stdlib/rand.c index f9c9b56..4f4aa8d 100644 --- a/lib/libc/stdlib/rand.c +++ b/lib/libc/stdlib/rand.c @@ -67,15 +67,15 @@ do_rand(unsigned long *ctx) */ long hi, lo, x; - /* Can't be initialized with 0, so use another value. */ - if (*ctx == 0) - *ctx = 123459876; + /* Must be in [1, 0x7ffffffe] range at this point. */ hi = *ctx / 127773; lo = *ctx % 127773; x = 16807 * lo - 2836 * hi; if (x < 0) x += 0x7fffffff; - return ((*ctx = x) % ((u_long)RAND_MAX + 1)); + *ctx = x; + /* Transform to [0, 0x7ffffffd] range. */ + return (x - 1); #endif /* !USE_WEAK_SEEDING */ } @@ -83,15 +83,32 @@ do_rand(unsigned long *ctx) int rand_r(unsigned int *ctx) { - u_long val = (u_long) *ctx; - int r = do_rand(&val); + u_long val; + int r; - *ctx = (unsigned int) val; +#ifdef USE_WEAK_SEEDING + val = *ctx; +#else + /* Transform to [1, 0x7ffffffe] range. */ + val = (*ctx % 0x7ffffffe) + 1; +#endif + r = do_rand(&val); + +#ifdef USE_WEAK_SEEDING + *ctx = (unsigned int)val; +#else + *ctx = (unsigned int)(val - 1); +#endif return (r); } -static u_long next = 1; +static u_long next = +#ifdef USE_WEAK_SEEDING + 1; +#else + 2; +#endif int rand() @@ -104,6 +121,10 @@ srand(seed) u_int seed; { next = seed; +#ifndef USE_WEAK_SEEDING + /* Transform to [1, 0x7ffffffe] range. */ + next = (next % 0x7ffffffe) + 1; +#endif } @@ -125,6 +146,10 @@ sranddev() mib[0] = CTL_KERN; mib[1] = KERN_ARND; sysctl(mib, 2, (void *)&next, &len, NULL, 0); +#ifndef USE_WEAK_SEEDING + /* Transform to [1, 0x7ffffffe] range. */ + next = (next % 0x7ffffffe) + 1; +#endif } |