summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/threads.txt2169
1 files changed, 23 insertions, 2146 deletions
diff --git a/docs/threads.txt b/docs/threads.txt
index d31a56d58..4669f3761 100644
--- a/docs/threads.txt
+++ b/docs/threads.txt
@@ -1,1357 +1,45 @@
uClibc thread-safety analysis
-By Steve Thayer <sthayer@coactive.com>
-with updates by Erik Andersen <andersee@debian.org>
-Introduction:
+Things that are still known to be needed for thread safety:
-The purpose of this document is to identify the things that need to be done
-to the uClibc C library in order to make it thread-safe. The goal is to be
-able to use a pthreads thread implementation under uClinux, using the uClibc
-C library. To help identify the things that require changing, I used David R.
-Butenhof's book Programming With POSIX Threads, the source code for the
-glibc 2.1.3 C library, and the source code for the C library included in the
-Proventhreads distribution.
+ getgrgid_r <not implemented, required by SuSv3>
+ getgrnam_r <not implemented, required by SuSv3>
-References:
-Butenhof, David R., Programming With POSIX Threads, Addison Wesley Longman, Inc., Reading, MA, ISBN 0-201-63392-2, 1997.
-The GNU C library is available from the Free Software Foundation
-http://www.gnu.org/software/libc/libc.html
-Proventhreads is part of the Inferno Operating system.
-http://www.vitanuova.com/inferno/index.html
+Things that might be nice, but are not required:
+ gethostent_r <desired, but not required for SuSv3>
+ getnetbyaddr_r <desired, but not required for SuSv3>
+ getnetent_r <desired, but not required for SuSv3>
+ getnetbyname_r <desired, but not required for SuSv3>
+ getprotobynumber_r <desired, but not required for SuSv3>
+ getprotoent_r <desired, but not required for SuSv3>
+ getprotobyname_r <desired, but not required for SuSv3>
+ getnetbyaddr_r <desired, but not required for SuSv3>
+ getnetbyname_r <desired, but not required for SuSv3>
+ getnetent_r <desired, but not required for SuSv3>
+ getprotobynumber_r <desired, but not required for SuSv3>
+ getprotoent_r <desired, but not required for SuSv3>
+ getprotobyname_r <desired, but not required for SuSv3>
-1. Stdio:
-1.1 Buffer access mutexes
- The following functions are required in order to protect shared
- I/O buffers from being accessed by more than one thread at a time.
- None of these functions are currently implemented in the uClibc
- library, so they must be added.
+Functions that use static data and may still need locking:
- flockfile <implemented>
- ftrylockfile <implemented>
- funlockfile <implemented>
-
-1.2 Functions that must use buffer access mutexes, according to Butenhof
-
- The following functions are identified by Butenhof as needing to use
- buffer access mutexes. This does not represent all functions that
- need to use the mutexes.
-
- getc <mutex required>
- getchar <mutex required>
- putc <mutex required>
- putchar <mutex required>
-
-1.3 Functions from glibc (libio) that use buffer access mutexes
-
- The following functions are functions found in glibc that currently
- use the buffer access mutexes. Comments in brackets represent
- status of uClibc with regard to these functions. Most of these
- functions aren't even supported under uClibc, so no work is required.
- The rest may require the access mutex. (These must be analyzed on a
- case-by-case basis.)
-
- clearerr <mutex required>
- feof <mutex required>
- ferror <mutex required>
- fputc <mutex required>
- fputwc <not supported>
- freopen <mutex required>
- freopen64 <mutex required>
- fseek <mutex required>
- fseeko <mutex required>
- fseeko64 <mutex required>
- ftello <mutex required>
- ftello64 <mutex required>
- fwide <not supported>
- getc <mutex required>
- getchar <mutex required>
- getwc <not supported>
- getwchar <not supported>
- iofclose <not supported>
- iofflush <not supported>
- iofgetpos <not supported>
- iofgetpos64 <not supported>
- iofgets <not supported>
- iofgetws <not supported>
- iofputs <not supported>
- iofputws <not supported>
- iofread <not supported>
- iofsetpos <not supported>
- iofsetpos64 <not supported>
- ioftell <not supported>
- iofwrite <not supported>
- iogetdelim <not supported>
- iogets <not supported>
- ioputs <not supported>
- ioseekoff <not supported>
- ioseekpos <not supported>
- iosetbuffer <not supported>
- iosetvbuf <not supported>
- ioungetc <not supported>
- ioungetwc <not supported>
- oldiofclose <not supported>
- oldiofgetpos <not supported>
- oldiofgetpos64 <not supported>
- oldiofsetpos <not supported>
- oldiofsetpos64 <not supported>
- peekc <not supported>
- putc <mutex required>
- putchar <mutex required>
- putwc <not supported>
- putwchar <not supported>
- rewind <mutex required>
-
-1.4 Functions from Proventhreads that use buffer access mutexes
-
- See description above. This applies only to the C library included
- in the proventhreads distribution.
-
- clearerr <mutex required>
- fclose <mutex required>
- fflush <mutex required>
- fgetc <mutex required>
- __getc <not supported>
- fgetline <not supported>
- fgetpos <mutex required>
- fgetpos64 <mutex required>
- fgets <mutex required>
- fpurge <not supported>
- fputc <mutex required>
- __putc <not supported>
- fputs <mutex required>
- fread <mutex required>
- freopen <mutex required>
- fscanf <mutex required>
- fseek <mutex required>
- ftell <mutex required>
- fwalk <not supported>
- fwrite <mutex required>
- getc <mutex required>
- getchar <mutex required>
- putc <mutex required>
- putchar <mutex required>
- puts <mutex required>
- putw <mutex _not_ required>
- refill <not supported>
- rewind <mutex required>
- scanf <mutex required>
- setvbuf <mutex required>
- ungetc <mutex required>
- vfprintf <mutex required>
- vscanf <mutex required>
-
-1.5 Unlocked buffer access
-
- These functions get used in situations where speed is important,
- and locking isn't necessary, or for use in a section of code that
- is already locked. For example, a for-loop that makes multiple calls
- to getc could make an exlicit call to flockfile outside the loop, and
- then use getc_unlocked within the loop for speed. That way, the lock
- only needs to be grabbed and released once, rather than for each call.
-
- getc_unlocked <implemented
- getchar_unlocked <implemented
- putc_unlocked <implemented
- putchar_unlocked <implemented
-
-1.6 Additional unlocked calls made in glibc
-
- These are additional functions (not mentioned by Butenhof) that the
- glibc library uses for unlocked buffer access. Though not strictly
- necessary, these may be nice to have in uClibc.
-
- fileno_unlocked <implemented
- clearerr_unlocked <implemented
- feof_unlocked <implemented
- ferror_unlocked <implemented
- fputc_unlocked <implemented
- fgetc_unlocked <implemented
- fflush_unlocked <implemented
- fread_unlocked <implemented
- fwrite_unlocked <implemented
- fgets_unlocked <implemented
- fputs_unlocked <implemented
-
-1.7 Additional unlocked calls made in Proventhreads
-
- Proventhreads only provides the four unlocked function calls above.
-
- <none>
-
-
-2. Thread-safe functions:
-
- There are some functions in the C library standard that are
- simply not thread-safe and cannot be thread-safe using their
- current interface. For example, any function that returns a
- pointer to static data, or requires static context between
- calls. To resolve this problem, new functions were added to
- the standard that perform the same basic task, but use a new
- interface that does not require static data. These functions
- share their name with the old unsafe functions, but have an
- "_r" appended to the name. By definition, these functions are
- reentrant and thread-safe. It is important to note that these
- functions to do not depend on <pthread.h> and can be used even
- if threading is not supported.
-
-2.1 User and terminal identification:
-
- getlogin_r <implemented>
- ctermid <implemented>
- ttyname_r <implemented>
-
-
-2.2 Directory searching
-
- readdir_r <implemented>
-
-2.3 String token
-
- strtok_r <implemented>
-
-2.4 Time representation
-
- asctime_r <implemented>
- ctime_r <implemented>
- gmtime_r <implemented>
- localtime_r <implemented>
-
-2.5 Random number generation
-
- rand_r <implemented
-
-2.6 Group and user database
-
- getgrgid_r <required> <---
- getgrnam_r <required> <---
- getpwuid_r <implemented>
- getpwnam_r <implemented>
-
-2.7 Additional thread-safe functions implemented by glibc
-
- The following is a list of additional functions implemented by glibc
- that also provide thread-safe functionality. Most of these functions
- are not supported by uClibc, so there is no need to implement the
- thread-safe version. Those that do apply, but have not been
- implemented yet are highlighted.
-
- fgetpwent_r <implemented>
- getttyname_r <not supported>
- getmntent_r <implemented>
- ecvt_r <not supported>
- fcvt_r <not supported>
- qecvt_r <not supported>
- qfcvt_r <not supported>
- hcreate_r <not supported>
- hdestroy_r <not supported>
- hsearch_r <not supported>
- getspent_r <implemented>
- getspnam_r <implemented>
- sgetspent_r <implemented>
- fgetspent_r <implemented>
- gethostbyaddr_r <implemented>
- gethostbyname2_r <implemented>
- gethostbyname_r <implemented>
- gethostent_r <desired> <---
- getnetbyaddr_r <desired> <---
- getnetent_r <desired> <---
- getnetbyname_r <desired> <---
- getprotobynumber_r <desired> <---
- getprotoent_r <desired> <---
- getprotobyname_r <desired> <---
- getservbyname_r <implemented>
- getservbyport_r <implemented>
- getservent_r <implemented>
- getrpcent_r <desired> <---
- getrpcbyname_r <desired> <---
- getrpcbynumber_r <implemented>
- ether_aton_r <not supported>
- ether_ntoa_r <not supported>
- getnetgrent_r <not supported>
- getaliasent_r <not supported>
- getaliasbyname_r <not supported>
- nscd_getpw_r <not supported>
- nscd_getgr_r <not supported>
- nscd_gethst_r <not supported>
- getutent_r <desired> <---
- getutent_r_unknown <not supported>
- getutid_r_unknown <not supported>
- getutline_r_unknown <not supported>
- getutid_r <desired> <---
- getutline_r <required> <---
- getutent_r_file <not supported>
- getutid_r_file <not supported>
- getutline_r_file <not supported>
- internal_getut_r <not supported>
- getutent_r_daemon <not supported>
- getutid_r_daemon <not supported>
- getutline_r_daemon <not supported>
- ptsname_r <not supported>
- __fgetpwent_r <not supported>
- __ttyname_r <not supported>
- __getmntent_r <not supported>
- __getspent_r <not supported>
- __getspnam_r <not supported>
- __sgetspent_r <not supported>
- __fgetspent_r <not supported>
- __gethostbyaddr_r <not supported>
- __gethostbyname2_r <not supported>
- __gethostbyname_r <not supported>
- __gethostent_r <not supported
- __getnetbyaddr_r <not supported>
- __getnetent_r <not supported>
- __getnetbyname_r <not supported>
- __getprotobynumber_r <not supported>
- __getprotoent_r <not supported>
- __getprotobyname_r <not supported>
- __getservbyname_r <not supported>
- __getservbyport_r <not supported>
- __getrpcent_r <not supported>
- __getservent_r <not supported>
- __getrpcbyname_r <not supported>
- __getrpcbynumber_r <not supported>
- __getnetgrent_r <not supported>
- __internal_getnetgrent_r <not supported>
- __getaliasent_r <not supported>
- __getaliasbyname_r <not supported>
- __nscd_getpwnam_r <not supported>
- __nscd_getpwuid_r <not supported>
- __nscd_getgrgid_r <not supported>
- __nscd_getgrnam_r <not supported>
- __nscd_gethostbyaddr_r <not supported>
- __nscd_gethostbyname2_r <not supported>
- __nscd_gethostbyname_r <not supported>
- __getutent_r <not supported>
- __getutid_r <not supported>
- __getutline_r <not supported>
- __ptsname_r <not supported>
-
-
-2.8 Additional thread-safe functions implemented by Proventhreads
-
- See description above. This applies only to the C library included
- in the proventhreads distribution.
-
- inet_ntoa_r <implemented>
- gethostbyaddr_r <implemented>
- gethostbyname_r <implemented>
- gethostent_r <not supported>
- getnetbyaddr_r <desired> <---
- getnetbyname_r <desired> <---
- getnetent_r <desired> <---
- getprotobynumber_r <desired> <---
- getprotoent_r <desired> <---
- getprotobyname_r <desired> <---
- getservbyname_r <implemented>
- getservbyport_r <implemented>
- getservent_r <implemented>
-
-
-3. List of functions in uClibc that use static data structures
-
- The following is a list of static data structures found in uClibc,
- and the functions that use them. In most cases, static data is not
- thread-safe, since multiple threads can access the same data at the
- same time. This is an attempt to identify all of the static data that
- is not considered thread-safe. Some of these problems will get
- resolved by the changes outlines above.
-
- crypt/crypt.c:
-
- static struct crypt_data __crypt_data;
-
- crypt <crypt_r implemented>
- setkey <setkey_r implemented>
- encrypt <encrypt_r implemented>
-
- --------------------------------------------------------------------
-
- crypt/des.c:
-
- static u_char inv_key_perm[64];
- static u_char inv_comp_perm[56];
- static u_char u_sbox[8][64];
- static u_char u_key_perm[56];
- static u_char un_pbox[32];
- static u_int32_t en_keysl[16], en_keysr[16];
- static u_int32_t de_keysl[16], de_keysr[16];
- static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
- static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
- static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
- static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
- static u_int32_t saltbits;
-
- __des_crypt_r <implemented badly!> <---
-
- This needs to be fixed to actually be reentrant. Right now it
- just fakes it, which is pretty lame.... All the above should be
- moved into a 'struct des_context' or some such...
-
- --------------------------------------------------------------------
-
- crypt/md5.c:
-
- static const char __md5__magic[];
- static const unsigned char __md5_itoa64[];
-
- __md5_crypt_r <implemented>
-
- No problems here...
-
-
- --------------------------------------------------------------------
-
- inet/addr.c:
-
- static char buf[16];
-
- inet_ntoa <implemented>
- inet_ntoa_r <implemented>
-
- --------------------------------------------------------------------
-
- inet/getnetent.c:
-
- static FILE *netf = NULL;
- static char line[BUFSIZ+1];
- static struct netent net;
- static char *net_aliases[MAXALIASES];
-
- setnetent <mutex required>
- endnetent <mutex required>
- getnetent <mutex required>
- getnetent_r <not implemented>
-
- NOTE: setnetent and endnetent are not implemented in glibc.
-
- --------------------------------------------------------------------
-
- inet/getproto.c:
-
- static FILE *protof = NULL;
- static char line[BUFSIZ+1];
- static struct protoent proto;
- static char *proto_aliases[MAXALIASES];
- static int proto_stayopen;
-
- setprotoent <mutex required>
- endprotoent <mutex required>
- getprotoent <mutex required>
- getprotoent_r <implemented>
- getprotobyname <implemented>
- getprotobyname_r <not implemented>
- getprotobynumber <implemented>
- getprotobynumber_r <not implemented>
-
- NOTE: setprotoent and endprotoent are not implemented in glibc.
-
- --------------------------------------------------------------------
-
- inet/getservice.c:
-
- static FILE *servf = NULL;
- static char line[BUFSIZ+1];
- static struct servent serv;
- static char *serv_aliases[MAXALIASES];
- static int serv_stayopen;
-
- setservent <mutex required>
- endservent <fix mutex required>
- getservent <mutex required>
- getservent_r <implemented>
- getservbyname <mutex required>
- getservbyname_r <implemented>
- getservbyport <mutex required>
- getservbyport_r <implemented>
-
- NOTE: setservent and endservent are not implemented in glibc.
-
- --------------------------------------------------------------------
-
- static struct hostent h;
- static char buf[xxx];
-
- gethostbyname <implemented>
-
-
- static struct hostent h;
- static char buf[xxx];
-
- gethostbyname2 <implemented>
-
- static struct hostent h;
- static char buf[xxx];
-
- gethostbyaddr <implemented>
-
-
- static int __stay_open;
- static FILE * __gethostent_fp;
- static struct hostent h;
- static char buf[xxx];
-
- gethostent <mutex required>
- sethostent <mutex required>
- endhostent <mutex required>
-
- --------------------------------------------------------------------
-
- inet/rpc/auth_none.c:
-
- static struct auth_ops ops
- static struct authnone_private
-
- authnone_create <fix required> <---
- authnone_marshal <fix required> <---
-
- NOTE: This file makes a lot of use of this static variable and
- also a global allocated authentication structure. Care should
- be taken in fixing this to make it thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/auth_unix.c:
-
- static struct auth_ops auth_unix_ops
-
- authunix_create <fix required> <---
- marshal_new_auth <fix required> <---
-
- NOTE: This file makes a lot of use of this static variable and
- also a global allocated authentication structure. Care should
- be taken in fixing this to make it thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/bindresvport.c:
-
- static short port;
-
- bindresvport <fix required> <---
-
- --------------------------------------------------------------------
-
- inet/rpc/clnt_perror.c:
-
- static char *buf;
- static struct rpc_errtab rpc_errlist[]
- static struct auth_errtab auth_errlist[]
-
- NOTE: These static structures all have #if 0 around them, so they
- do not get compiled in. Hopefully, we don't have to worry about
- them right now, but prehaps a comment should be added to the code
- indicating that it is not thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/clnt_raw.c:
-
- static struct clntraw_private
- static struct clnt_ops client_ops
-
- clntraw_create <fix required> <---
- clntraw_call <fix required> <---
- clntraw_freeres <fix required> <---
-
- NOTE: This file makes a lot of use of these static variables and
- also a global allocated client structure. Care should
- be taken in fixing this to make it thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/clnt_simple.c:
-
- static struct callrpc_private
-
- callrpc <fix required> <---
-
- --------------------------------------------------------------------
-
- inet/rpc/clnt_tcp.c:
-
- static struct clnt_ops tcp_ops
-
- clnttcp_create
-
- NOTE: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- --------------------------------------------------------------------
-
- inet/rpc/clnt_udp.c:
-
- static struct clnt_ops udp_ops
-
- clntudp_bufcreate
-
- NOTE: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- --------------------------------------------------------------------
-
- inet/rpc/getrpcent.c:
-
- static char RPCDB[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- inet/rpc/pmap_clnt.c:
-
- static struct timeval timeout <fix desired> <---
- static struct timeval tottimeout <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- inet/rpc/pmap_getport.c:
-
- static struct timeval timeout <fix desired> <---
- static struct timeval tottimeout <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- inet/rpc/pmap_rmt.c:
-
- static struct timeval timeout <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- inet/rpc/rpc_dtablesize.c:
-
- static int size;
-
- _rpc_dtablesize <fix required> <---
-
- --------------------------------------------------------------------
-
- inet/rpc/rpc_prot.c:
-
- static struct xdr_discrim reply_dscrm[3] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- inet/rpc/svc.c:
-
- static SVCXPRT **xports;
- static SVCXPRT *xports[NOFILE];
- static struct svc_callout
-
- xprt_register <fix required> <---
- xprt_unregister <fix required> <---
- svc_getreqset <fix required> <---
- svc_register <fix required> <---
- svc_unregister <fix required> <---
- svc_callout <fix required> <---
-
- NOTE: This is intricate code, and care should be taken when making
- this thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/svc_auth.c:
-
- static struct svcauthsw <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- net/rpc/svc_raw.c:
-
- static struct svcraw_private
- static struct xp_ops server_ops
-
- svcraw_create <fix required> <---
- svcraw_recv <fix required> <---
- svcraw_reply <fix required> <---
- svcraw_getargs <fix required> <---
- svcraw_freeargs <fix required> <---
-
- NOTE: This is intricate code, and care should be taken when making
- this thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/svc_simple.c:
-
- static struct proglst
- static SVCXPRT *transp;
-
- registerrpc <fix required> <---
- universal <fix required> <---
-
- NOTE: This is intricate code, and care should be taken when making
- this thread-safe.
-
- --------------------------------------------------------------------
-
- inet/rpc/svc_tcp.c:
-
- static struct xp_ops svctcp_op
- static struct xp_ops svctcp_rendezvous_op
-
- svctcp_create <fix required> <---
- makefd_xprt <fix required> <---
-
- NOTE: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- static struct timeval wait_per_try
-
- readtcp <fix required> <---
-
- NOTE: This looks like a bug. This static timeout value is passed
- by reference to a select() call. According to the linux man page
- for select:
-
- "On Linux, timeout is modified to reflect the amount of
- time not slept; most other implementations do not do this.
- This causes problems both when Linux code which reads
- timeout is ported to other operating systems, and when
- code is ported to Linux that reuses a struct timeval for
- multiple selects in a loop without reinitializing it.
- Consider timeout to be undefined after select returns."
-
- Unless the implementation of select is different than that of Linux,
- this needs to be fixed!
-
- --------------------------------------------------------------------
-
- inet/rpc/svc_udp.c:
-
- static struct xp_ops svcudp_op <fix desired> (1)
-
- svcudp_bufcreate
-
- 1: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- --------------------------------------------------------------------
-
- inet/rpc/xdr.c:
-
- static char xdr_zero[BYTES_PER_XDR_UNIT] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- static u_long crud[BYTES_PER_XDR_UNIT]
-
- NOTE: This looks like it doesn't matter what's in this array.
-
- --------------------------------------------------------------------
-
- inet/rpc/xdr_float.c:
-
- static struct sgl_limits <fix desired> <---
- static struct dbl_limits <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- inet/rpc/xdr_mem.c:
-
- static struct xdr_ops xdrmem_ops <fix desired> (1)
-
- xdrmem_create
-
- 1: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- --------------------------------------------------------------------
-
- inet/rpc/xdr_rec.c:
-
- static struct xdr_ops xdrrec_ops <fix desired> (1)
-
- xdrrec_create
-
- 1: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- --------------------------------------------------------------------
-
- inet/rpc/xdr_stdio.c:
-
- static struct xdr_ops xdrstdio_ops <fix desired> (1)
-
- xdrstdio_create
-
- 1: This static structure is just a group of function pointers.
- It could probably be made const, but this might affect the function
- signature. This should be investigated further.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/boot1.c:
-
- static char *_dl_malloc_addr
- static char *_dl_mmap_zero
- static char *_dl_not_lazy
- static char *_dl_warn
- static char *_dl_trace_loaded_objects
-
- _dl_boot <fix required> <---
- _dl_malloc <fix required> <---
- _dl_fixup <fix required> <---
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/readelflib1.c:
-
- static caddr_t _dl_cache_addr
- static size_t _dl_cache_size
-
- _dl_map_cache <fix required> <---
- _dl_unmap_cache <fix required> <---
- _dl_load_shared_library <fix required> <---
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/string.h:
-
- static char local[22]
-
- _dl_simple_ltoa <fix required> <---
- _dl_simple_ltoahex <fix required> <---
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/arm/elfinterp.c:
-
- static char *_dl_reltypes[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/i386/elfinterp.c:
-
- static char *_dl_reltypes[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/m68k/elfinterp.c:
-
- static char *_dl_reltypes[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/d-link/sparc/elfinterp.c:
-
- static char *_dl_reltypes[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/libdl/dlib.c:
-
- static int dl_init
-
- _dlopen <fix required> <---
-
- static int __attribute__ ((unused)) foobar1 <fix required?> (1)
-
- NOTE: The comment for this says it all: "This is a real hack." ;-)
-
-
- static char *type[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- These are all part of the shared library loader, and are not
- used by applications directly. Therefore, fixing these is not
- a high priority item.
-
- --------------------------------------------------------------------
-
- ld.so-1/util/ldconfig.c:
-
- static header_t magic <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- static liblist_t *lib_head
-
- cache_dolib <fix required> <---
- cache_write <fix required> <---
-
- This is not actually part of the C library, and is not built by
- default, so fixing these is not a high priority item.
-
- --------------------------------------------------------------------
-
- misc/internals/tempname.c:
-
- static uint64_t value;
-
- __gen_tempname <no fix required>
-
- This is supposed to be random trash, so the more threading
- collisions the better...
-
- --------------------------------------------------------------------
-
- misc/locale/locale.c:
-
- static char C_LOCALE_NAME[]="C"; <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- static struct SAV_LOADED_LOCALE sav_loaded_locale [1]
- static struct SAV_LOADED_LOCALE * old_locale
-
- setlocale <fix required> <---
-
- NOTE: Can different threads use different locales? I don't see
- why not.
-
- --------------------------------------------------------------------
-
- misc/locale/localeconv.c:
-
- static struct lconv result;
-
- localeconv <fix required> <---
-
- NOTE: This function returns a pointer to a static data structure.
-
- static char *blank = ""; <fix desired> <---
- static char *decimal = "."; <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- misc/mntent/mntent.c:
-
- static char buff[MNTMAXSTR];
- static struct mntent mnt;
-
- getmntent <mutex required>
- getmntent_r <implemented>
-
- --------------------------------------------------------------------
-
- misc/regex/regex.c:
-
- static char re_syntax_table[CHAR_SET_SIZE];
- static int done = 0;
-
- init_syntax_table <fix required> <---
-
- static int debug;
-
- <several functions> <fix required> <---
-
- NOTE: This is used to turn on debugging, and is used in several
- functions. It will need to be fixed if you want differing debug
- levels per thread.
-
- static char reg_unset_dummy;
-
- <REG_UNSET...> <fix required> <---
-
- static fail_stack_type fail_stack;
-
- regex_compile <fix required> <---
- <FREE_VARIABLES> <fix required> <---
- <FAIL_STACK_EMPTY> <fix required> <---
- <FAIL_STACK_PTR_EMPTY> <fix required> <---
- <FAIL_STACK_FULL> <fix required> <---
- <INIT_FAIL_STACK> <fix required> <---
- <RESET_FAIL_STACK> <fix required> <---
- <DOUBLE_FAIL_STACK> <fix required> <---
- <PUSH_FAILURE_POINTER> <fix required> <---
- <PUSH_FAILURE_INT> <fix required> <---
- <PUSH_FAILURE_ELT> <fix required> <---
- <POP_FAILURE_POINTER> <fix required> <---
- <POP_FAILURE_INT> <fix required> <---
- <POP_FAILURE_ELT> <fix required> <---
- <REMAINING_AVAIL_SLOTS> <fix required> <---
-
- static int regs_allocated_size;
-
- regs_grow_registers <fix required> <---
-
- static register_info_type *reg_info;
- static register_info_type *reg_info_dummy;
- static unsigned failure_id;
- static struct re_pattern_buffer re_comp_buf;
-
- <too many to list> <fix required> <---
-
- NOTE: This is just a NASTY file for static variables. A lot of
- work needs to be done here to clean this up. But I'm not even
- sure if it matters. This code is taken directly from glibc.
-
- This code is also very large (adds over 30k to the C library
- all by itself). This file needs a complete rewrite.
-
- --------------------------------------------------------------------
-
- misc/syslog/syslog.c:
-
- static pthread_once__t _once_block = pthread_once_init;
- static pthread_mutex_t _syslog_mutex;
-
- NOTE: I think these are okay. ;-)
-
- static int LogFile = -1;
- static int connected;
- static int LogStat = 0;
- static int LogFacility = LOG_USER;
- static int LogMask = 0xff;
- static char truncate_msg[12]
- static struct sockaddr SyslogAddr;
-
- NOTE: These are already protected.
-
- --------------------------------------------------------------------
-
- misc/time/asctime.c:
-
- static char timebuf[26];
-
- asctime <asctime_r implemented>
-
- --------------------------------------------------------------------
-
- misc/time/ctime.c:
-
- static char cbuf[26];
-
- ctime <ctime_r implemented>
-
- --------------------------------------------------------------------
-
- misc/time/gmtime.c:
-
- static struct tm tmb;
-
- gmtime <gmtime_r implemented>
-
- --------------------------------------------------------------------
-
- misc/time/localtime.c:
-
- static struct tm tmb;
-
- localtime <localtime_r implemented>
-
- --------------------------------------------------------------------
-
- misc/time/mktime.c:
-
- static tz_rule tz_rules[2];
-
- tzset <fix required> <---
-
- static time_t localtime_offset;
-
- mktime <fix required> <---
-
- --------------------------------------------------------------------
-
- misc/time/tm_conv.c:
-
- static int moffset[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- misc/utmp/utent.c:
-
- static int static_fd = -1;
- static struct utmp static_utmp;
- static const char default_file_name[] = _PATH_UTMP;
- static const char *static_ut_name = (const char *) default_file_name;
-
-
- setutent <ok>
- endutent <ok>
- getutent <ok>
- getutid <ok>
- getutline <ok>
- pututline <ok>
- utmpname <ok>
- __getutent <ok>
-
- --------------------------------------------------------------------
-
- pwd_grp/__getgrent.c:
-
- static char line_buff[GR_MAX_LINE_LEN];
- static char *members[GR_MAX_MEMBERS];
- static char *line_buff = NULL;
- static char **members = NULL;
- static struct group group;
-
- __getgrent <fix required> <---
-
- --------------------------------------------------------------------
-
- pwd_grp/fgetpwent.c:
-
- static char line_buff[PWD_BUFFER_SIZE];
- static struct passwd pwd;
-
- fgetpwent <fgetpwent_r implemented>
-
- --------------------------------------------------------------------
-
- pwd_grp/getpwnam.c:
-
- static char line_buff[PWD_BUFFER_SIZE];
- static struct passwd pwd;
-
- getpwnam <getpwnam_r implemented>
-
- --------------------------------------------------------------------
-
- pwd_grp/getpwuid.c:
-
- static char line_buff[PWD_BUFFER_SIZE];
- static struct passwd pwd;
-
- getpwuid <getpwuid_r implemented>
-
- --------------------------------------------------------------------
-
- pwd_grp/grent.c:
-
- static int grp_fd = -1;
-
- setgrent <fix required> <---
- endgrent <fix required> <---
- getgrent <fix required> <---
-
- --------------------------------------------------------------------
-
- pwd_grp/pwent.c:
-
- static int pw_fd = -1;
-
- setpwent <fix required> <---
- endpwent <fix required> <---
- getpwent_r <fix required> <---
-
- NOTE: Yeah, this looks weird, but getpwent_r isn't completely
- thread-safe.
-
- static char line_buff[PWD_BUFFER_SIZE];
- static struct passwd pwd;
-
- getpwent <getpwent_r implemented> <---
-
- --------------------------------------------------------------------
-
- stdio/tmpnam.c:
-
- static char tmpnam_buffer[L_tmpnam];
-
- tmpnam <tmpnam_r implemented>
-
- --------------------------------------------------------------------
-
- stdlib/atexit.c:
-
- static vfuncp __atexit_table[__UCLIBC_MAX_ATEXIT];
- static int __atexit_count = 0;
-
- atexit_handler <fix required> <---
- atexit <fix required> <---
-
- --------------------------------------------------------------------
-
- stdlib/bsearch.c:
-
- static int _bsearch;
-
- bsearch <ok>
-
- --------------------------------------------------------------------
-
- stdlib/setenv.c:
-
- static char **last_environ;
-
- __add_to_environ <ok>
- unsetenv <ok>
- setenv <ok>
- clearenv <ok>
- putenv <ok>
-
- all ok now.
-
- --------------------------------------------------------------------
-
- stdlib/random.c:
-
- static long int seed1 = 1;
- static long int seed2 = 1;
- static long int seed3 = 1;
-
- random <fix required?> (1)
- srandom <fix required?> (1)
-
- 1: I'm not sure if it matters if these are static, since they
- are random number seeds. Who cares if more than one thread changes
- their value?
-
- --------------------------------------------------------------------
-
- stdlib/malloc/avlmacro.h
-
- static objname *__Avl_##objname##pr##_new_node;
-
- Avl_Tree_no_replace <fix required> <---
-
- NOTE: This will take a bit of study to figure out if it needs fixing.
--------------------------------------------------------------------
- stdlib/malloc/malloc.c:
-
- //static mutex_t malloc_lock = MUTEX_INITIALIZER; <---
-
- NOTE: Basically, thread support in malloc is broken and must be
- fixed. It looks like the infrastructure is there, but more
- investigation is required.
-
- --------------------------------------------------------------------
-
- stdlib/malloc-930716/malloc.c:
-
- A bunch of stuff
-
- malloc <ok>
- realloc <ok>
- free <ok>
- etc <ok>
-
- --------------------------------------------------------------------
-
- string/strerror.c:
-
- static char retbuf[48];
- static char retbuf[33];
+ libc/inet/rpc/rpc_thread.c:
- strerror <fix required> <---
- strerror_r <fix required> <---
+ __rpc_thread_variables is currently disabled, since thread
+ local storage seems to not be correctly specified as
+ weak functions.
--------------------------------------------------------------------
- string/strsignal.c:
-
- static char retbuf[28];
-
- strsignal <fix required> <---
- main <fix required> <---
-
- --------------------------------------------------------------------
-
- string/strtok.c:
-
- static char *save = 0;
-
- strtok <ok>
- strtok_r <ok>
-
- --------------------------------------------------------------------
-
- termios/tcgetsid.c:
-
- static int tiocgsid_does_not_work;
-
- tcgestsid <fix required> <---
-
- --------------------------------------------------------------------
-
- termios/ttyname.c:
-
- static char dev[] = "/dev";
-
- ttyname <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- static char name[NAME_MAX];
-
- ttyname <ttyname_r required> <---
-
- --------------------------------------------------------------------
-
- test/testsuite.h:
-
- static int failures
-
- error_msg <fix required> <---
- done_testing <fix required> <---
- init_testsuite <fix required> <---
-
- --------------------------------------------------------------------
-
- unistd/getopt.c:
-
- static int sp = 1;
-
- getopt <fix required> <---
-
- --------------------------------------------------------------------
-
unistd/getpass.c:
static char buf[PWD_BUFFER_SIZE];
@@ -1364,23 +52,6 @@ http://www.vitanuova.com/inferno/index.html
--------------------------------------------------------------------
- unistd/gnu_getopt.c:
-
- static char *nextchar;
- static enum ordering;
- static int first_nonopt;
- static int last_nonopt;
-
- _getopt_initialize <fix required> <---
- _getopt_internal <fix required> <---
- exchange <fix required> <---
-
- static struct option long_options[] <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
unistd/sysconf.c:
static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
@@ -1388,800 +59,6 @@ http://www.vitanuova.com/inferno/index.html
find_or_add_in_table <fix required?> <---
main <fix required?> <---
- NOTE: I'm not sure if this needs to be multi-threaded or not.
-
- --------------------------------------------------------------------
-
- unistd/sysconf_src.c:
-
- static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
-
- find_or_add_in_table <fix required?> <---
- main <fix required?> <---
-
- NOTE: I'm not sure if this needs to be multi-threaded or not.
-
- --------------------------------------------------------------------
-
- unistd/sysconf_i386.c:
-
- static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
-
- find_or_add_in_table <fix required?> <---
- main <fix required?> <---
-
- NOTE: I'm not sure if this needs to be multi-threaded or not.
-
- --------------------------------------------------------------------
-
-
-4. List of functions that use global variables
-
- The following is a list of functions that make use of global
- variables. Since multiple threads can access the same global
- variable at the same time, access should be considered unsafe.
- This is an attempt to identify all the areas where global
- variables are used. This does not necessarily mean that each
- of these is unsafe. It just means that there is a potential
- for them to be unsafe. If this code never runs in more than
- one thread, then there's no problem. More ivestigation will be
- required to determine if changes are really required.
-
- Global variable:
-
- __environ (misc/internals/__uClibc_main.c)
-
- __uClibc_main.c:
-
- __uClibc_main <fix required?> (1)
-
- 1: This should only get executed once, so it is probably fine.
-
- stdlib/getenv.c:
-
- getenv <fix required> <---
-
- stdlib/putenv.c:
-
- putenv <fix required> <---
-
- stdlib/setenv.c:
-
- setenv <fix required> <---
- unsetenv <fix required> <---
-
- test/args/arg_test.c:
-
- main <fix required> <---
-
- unistd/execl.c:
-
- execl <fix required> <---
-
- unistd/execlp.c:
-
- execlp <fix required> <---
-
- unistd/execv.c:
-
- execv <fix required> <---
-
- unistd/execvp.c:
-
- execvep <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __uClibc_cleanup (misc/internals/__uClibc_main.c)
-
- stdlib/abort.c:
-
- abort <fix required> <---
-
- stdlib/atexit.c:
-
- atexit_handler <fix required> <---
- atexit <fix required> <---
- exit <fix required> <---
-
- NOTE: Not sure if multiple threads can be in this code or not.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- environ (misc/internals/__uClibc_main.c)
-
- NOTE: This is a weak alias for __environ, but it doesn't ever get
- used in the uClibc library.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- timezone (misc/time/tm_conv.c)
-
- misc/time/tm_conv.c:
-
- __tm_conv <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- re_max_failures (misc/regex/regex.c)
-
- misc/regex/regex.c:
-
- DOUBLE_FAIL_STACK <fix required> <---
- regex_compile <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- re_syntax_options (misc/regex/regex.c)
-
- misc/regex/regex.c:
-
- re_set_syntax <fix required> <---
- re_compile_pattern <fix required> <---
- re_comp <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __IO_list (stdio/stdio.c)
-
- stdio/stdio.c:
-
- fflush <fix required> <---
- __fopen <fix required> <---
- fclose <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _fixed_buffers (stdio/stdio.c)
-
- stdio/stdio.c:
-
- _alloc_stdio_buffer <fix required> <---
- _free_stdio_buffer_of_file <fix required> <---
- __init_stdio <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _free_buffer_index (stdio/stdio.c)
-
- stdio/stdio.c:
-
- _alloc_stdio_buffer <fix required> <---
- _free_stdio_buffer_of_file <fix required> <---
- __init_stdio <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _free_file_list (stdio/stdio.c)
-
- stdio/stdio.c:
-
- __init_stdio <fix required> <---
- _alloc_stdio_stream <fix required> <---
- _free_stdio_stream <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _stderr (stdio/stdio.c)
-
- ld.so-1/util/ldconfig.c:
-
- warn <fix required> <---
- error <fix required> <---
- usage <fix required> <---
-
- ld.so-1/util/ldd.c:
-
- warn <fix required> <---
- error <fix required> <---
- is_bin <fix required> <---
- main <fix required> <---
-
- misc/locale/locale.c:
-
- setlocale <fix required> <---
-
- misc/regex/regex.c:
-
- printchar <fix required> <---
-
- stdio/perror.c:
-
- perror <fix required> <---
-
- stdlib/malloc/alloc.c:
-
- calloc_dbg <fix required> <---
- malloc_dbg <fix required> <---
- free_dbg <fix required> <---
-
- stdlib/malloc/malloc.c:
-
- __hunk_alloc <fix required?> (1)
- __malloc_init <fix required?> (1)
- malloc <fix required?> (1)
-
- 1: These are commented out with C++ style comments.
-
- stdlib/malloc-simple/alloc.c:
-
- calloc_dbg <fix required> <---
- malloc_dbg <fix required> <---
- free_dbg <fix required> <---
-
- string/strsignal.c:
-
- psignal <fix required> <---
-
- test/args/arg_test.c:
-
- main <fix required> <---
-
- test/assert/assert.c:
-
- main <fix required> <---
-
- unistd/getopt.c:
-
- Err <fix required> <---
-
- unistd/getpass.c:
-
- getpass <fix required> <---
-
- unistd/gnu_getopt.c:
-
- _getopt_internal <fix required> <---
-
- unistd/sysconf.c:
-
- main <fix required> <---
-
- unistd/sysconf_src.c:
-
- main <fix required> <---
-
- unistd/sysconf_i386.c:
-
- main <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _stdin (stdio/stdio.c)
-
- include/stdio.h:
-
- getchar <fix required> <---
-
- include/bits/stdio.h:
-
- getchar <fix required> <---
- getchar_unlocked <fix required> <---
-
- stdio/scanf.c:
-
- scanf <fix required> <---
- vscanf <fix required> <---
-
- stdio/stdio.c
-
- gets <fix required> <---
- getchar <fix required> <---
-
- sysdeps/linux/i386/bits/stdio.h:
-
- getchar <fix required> <---
- getchar_unlocked <fix required> <---
-
- sysdeps/linux/m68k/bits/stdio.h:
-
- getchar <fix required> <---
- getchar_unlocked <fix required> <---
-
- sysdeps/linux/sh/bits/stdio.h:
-
- getchar <fix required> <---
- getchar_unlocked <fix required> <---
-
- sysdeps/linux/sparc/bits/stdio.h:
-
- getchar <fix required> <---
- getchar_unlocked <fix required> <---
-
- unistd/getpass.c:
-
- getpass <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _stdio_streams (stdio/stdio.c)
-
- stdio/stdio.c:
-
- __init_stdio <fix required> <---
- _free_stdio_stream <fix required> <---
+ NOTE: I'm not sure if this needs to be made reentrant...
--------------------------------------------------------------------
-
- Global variable:
-
- _stdout (stdio/stdio.c)
-
- include/stdio.h:
-
- putchar <fix required> <---
-
- include/bits/stdio.h:
-
- vprintf <fix required> <---
- putchar <fix required> <---
- putchar_unlocked <fix required> <---
-
- ld.so-1/util/ldconfig.c:
-
- warn <fix required> <---
- error <fix required> <---
-
- ld.so-1/util/ldd.c:
-
- warn <fix required> <---
- error <fix required> <---
- main <fix required> <---
-
- stdio/printf.c:
-
- printf <fix required> <---
- vprintf <fix required> <---
-
- stdio/stdio.c:
-
- puts <fix required> <---
- _uClibc_fread <fix required> <---
- putchar <fix required> <---
-
- sysdeps/linux/i386/bits/stdio.h:
-
- vprintf <fix required> <---
- putchar <fix required> <---
- putchar_unlocked <fix required> <---
-
- sysdeps/linux/m68k/bits/stdio.h:
-
- vprintf <fix required> <---
- putchar <fix required> <---
- putchar_unlocked <fix required> <---
-
- sysdeps/linux/sh/bits/stdio.h:
-
- vprintf <fix required> <---
- putchar <fix required> <---
- putchar_unlocked <fix required> <---
-
- sysdeps/linux/sparc/bits/stdio.h:
-
- vprintf <fix required> <---
- putchar <fix required> <---
- putchar_unlocked <fix required> <---
-
- test/pwd_grp/test_grp.c:
-
- main <fix required> <---
-
- test/pwd_grp/test_pwd.c:
-
- main <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- dns_caught_signal (inet/resolv.c)
-
- inet/resolv.c:
-
- dns_catch_signal <fix required> <---
- dns_lookup <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- nameserver (inet/resolv.c)
- nameservers (inet/resolv.c)
-
- inet/resolv.c:
-
- open_nameservers <fix required> <---
- close_nameservers <fix required> <---
- resolve_name <fix required> <---
- gethostbyname <fix required> <---
- res_query <fix required> <---
- gethostbyaddr <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- searchdomain (inet/resolv.c)
- searchdomains (inet/resolv.c)
-
- inet/resolv.c:
-
- dns_lookup <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _net_stayopen (inet/getnetent.c)
-
- inet/getnetbyad.c:
-
- getnetbyaddr <fix required> <---
-
- inet/getnetbynm.c:
-
- getnetbyname <fix required> <---
-
- inet/getnetent.c:
-
- setnetent <fix required> <---
- endnetent <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- rpcdata (inet/rpc/getrpcent.c)
-
- inet/rpc/getrpcent.c:
-
- _rpcdata <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _null_auth (inet/rpc/rpc_commondata.c) <fix desired> <---
-
- NOTE: _null_auth is never actually initialized. It never gets written,
- only read. So it should be thread safe. But it should be declared
- as a const if that is the case. It should also be initialized.
-
- inet/rpc/auth_none.c:
-
- authnone_create
-
- inet/rpc/auth_unix.c:
-
- authunix_create
-
- inet/rpc/clnt_raw.c:
-
- clntraw_call
-
- inet/rpc/clnt_tcp.c:
-
- clnttcp_call
-
- inet/rpc/clnt_udp.c:
-
- clntudp_call
-
- inet/rpc/pmap_rmt.c:
-
- clnt_broadcast
-
- inet/rpc/svc_auth.c:
-
- _authenticate
-
- inet/rpc/svc_tcp.c:
-
- svctcp_create
-
- --------------------------------------------------------------------
-
- Global variable:
-
- rpc_createerr (inet/rpc/rpc_commondata.c)
-
- inet/rpc/clnt_generic.c:
-
- clnt_create <fix required> <---
-
- inet/rpc/clnt_perror.c:
-
- clnt_spcreateerror <fix desired?> <---
-
- NOTE: This piece of code has an "#if 0" around it.
-
- inet/rpc/clnt_simple.c:
-
- callrpc <fix required> <---
-
- inet/rpc/clnt_tcp.c:
-
- clnttcp_create <fix required> <---
-
- inet/rpc/clnt_udp.c:
-
- clntudp_bufcreate <fix required> <---
-
- inet/rpc/pmap_getport.c:
-
- pmap_getport <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- svc_fdset (inet/rpc/rpc_commondata.c)
-
- inet/rpc/svc.c:
-
- xprt_register <fix required> <---
- xprt_unregister <fix required> <---
- svc_getreq <fix required> <---
-
- inet/rpc/svc_run.c:
-
- svc_run <fix required> <---
-
- NOTE: Be careful to also fix the uses of the "svc_fds" #define.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- pl (inet/rpc/svc_simple.c)
-
- registerrpc <fix required> <---
-
- NOTE: proglst is set up to point at pl, so it needs fixing as well.
- (See proglst earlier in this document.)
-
- --------------------------------------------------------------------
-
- Global variable:
-
- _sigintr (signal/signal.c)
-
- signal/bsd_sig.c:
-
- __bsd_signal <fix required> <---
-
- signal/sigintr.c:
-
- siginterrupt <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __Avl_Block_tfree_mem_tree (stdlib/malloc/malloc.c)
-
- stdlib/malloc/malloc.c:
-
- __free_mem_del_block <fix required> <---
- bl_alloc <fix required> <---
- __malloc_init <fix required> <---
-
- NOTE: This code is very tricky stuff.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __Avl_Block_tptrs_tree (stdlib/malloc/malloc.c)
-
- stdlib/malloc/malloc.c:
-
- __bl_free <fix required> <---
- __malloc_init <fix required> <---
- free <fix required> <---
- _realloc_no_move <fix required> <---
- realloc <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __bl_last (stdlib/malloc/malloc.c)
-
- stdlib/malloc/malloc.c:
-
- COMBINE_BLOCKS <fix required> <---
- SPLIT_BLOCK <fix required> <---
- bl_mapnew <fix required> <---
- bl_alloc <fix required> <---
- __malloc_init <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __free_h (stdlib/malloc/malloc.c)
-
- stdlib/malloc/malloc.c:
-
- __hunk_alloc <fix required> <---
- __hunk_free <fix required> <---
- __malloc_init <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __malloc_initialized (stdlib/malloc/malloc.c)
-
- stdlib/malloc/malloc.c:
-
- __malloc_init <fix required> <---
- malloc <fix required> <---
- free <fix required> <---
- _realloc_no_move <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- __total_h (stdlib/malloc/malloc.c)
-
- stdlib/malloc/malloc.c:
-
- __hunk_alloc <fix required> <---
- __malloc_init <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- errno (sysdeps/linux/common/errno.c)
-
- sysdeps/linux/common/errno.c:
-
- __errno_location <fix required> <---
-
- NOTE: Obviously, errno gets used all over the place. I won't list
- them all here.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- ___brk_addr (sysdeps/linux/i386/__init_brk.c)
-
- sysdeps/linux/i386/__init_brk.c:
-
- __init_brk <fix required> <---
-
- sysdeps/linux/i386/brk.c:
-
- brk <fix required> <---
-
- sysdeps/linux/i386/sbrk.c:
-
- sbrk <fix required> <---
-
- --------------------------------------------------------------------
-
- Global variable:
-
- optarg (unistd/getopt_vars.c)
-
- extra/locale/gen_ctype_from_glibc.c:
-
- main <fix required?> (1)
-
- ld.so-1/util/ldconfig.c:
-
- main <fix required?> (1)
-
- unistd/getopt.c:
-
- getopt <fix required> <---
-
- unistd/gnu_getopt.c:
-
- _getopt_internal <fix required> <---
- main <fix required?> (1)
-
- 1: Probably not required unless this program is run on multiple
- threads.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- opterr (unistd/getopt_vars.c)
-
- ld.so-1/util/ldconfig.c:
-
- main <fix required?> (1)
-
- unistd/getopt.c:
-
- Err <fix required> <---
- getopt <fix required> <---
-
- unistd/gnu_getopt.c:
-
- _getopt_internal <fix required> <---
-
- 1: Probably not required unless this program is run on multiple
- threads.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- optind (unistd/getopt_vars.c)
-
- extra/locale/gen_ctype_from_glibc.c:
-
- main <fix required?> (1)
-
- ld.so-1/util/ldconfig.c:
-
- main <fix required?> (1)
-
- ld.so-1/util/ldd.c:
-
- main <fix required?> (1)
-
- unistd/getopt.c:
-
- Err <fix required> <---
- getopt <fix required> <---
-
- unistd/gnu_getopt.c:
-
- exchange <fix required> <---
- _getopt_initialize <fix required> <---
- _getopt_internal <fix required> <---
- main <fix required?> (1)
- main (2nd one) <fix required?> (1)
-
- 1: Probably not required unless this program is run on multiple
- threads.
-
- --------------------------------------------------------------------
-
- Global variable:
-
- optopt (unistd/getopt_vars.c)
-
- unistd/getopt.c:
-
- Err <fix required> <---
- getopt <fix required> <---
-
- unistd/gnu_getopt.c:
-
- _getopt_internal <fix required> <---
-