summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/gen/siginterrupt.c2
-rw-r--r--lib/libc/gen/signal.c2
-rw-r--r--lib/libc/iconv/Symbol.map10
-rw-r--r--lib/libc/iconv/citrus_csmapper.c6
-rw-r--r--lib/libc/iconv/citrus_iconv.c14
-rw-r--r--lib/libc/iconv/citrus_iconv.h2
-rw-r--r--lib/libc/iconv/citrus_iconv_local.h4
-rw-r--r--lib/libc/iconv/citrus_lock.h10
-rw-r--r--lib/libc/iconv/citrus_mapper.c24
-rw-r--r--lib/libc/iconv/citrus_none.c4
-rw-r--r--lib/libc/iconv/citrus_stdenc.h2
-rw-r--r--lib/libc/iconv/citrus_stdenc_local.h8
-rw-r--r--lib/libc/iconv/citrus_stdenc_template.h4
-rw-r--r--lib/libc/iconv/iconv.c21
-rw-r--r--lib/libc/locale/cXXrtomb_iconv.h3
-rw-r--r--lib/libc/locale/mbrtocXX_iconv.h3
-rw-r--r--lib/libc/stdlib/rand.c41
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
}
OpenPOWER on IntegriCloud