Add some more necessary locks

This commit is contained in:
Justine Tunney 2022-06-12 22:20:59 -07:00
parent 8b72490431
commit 91953dd308
9 changed files with 29 additions and 15 deletions

View file

@ -21,6 +21,7 @@
/** /**
* Frees addresses returned by getaddrinfo(). * Frees addresses returned by getaddrinfo().
* @threadsafe
*/ */
int freeaddrinfo(struct addrinfo *ai) { int freeaddrinfo(struct addrinfo *ai) {
struct addrinfo *next; struct addrinfo *next;

View file

@ -41,6 +41,7 @@
* @param res receives a pointer that must be freed with freeaddrinfo(), * @param res receives a pointer that must be freed with freeaddrinfo(),
* and won't be modified if -1 is returned * and won't be modified if -1 is returned
* @return 0 on success or EAI_xxx value * @return 0 on success or EAI_xxx value
* @threadsafe
*/ */
int getaddrinfo(const char *name, const char *service, int getaddrinfo(const char *name, const char *service,
const struct addrinfo *hints, struct addrinfo **res) { const struct addrinfo *hints, struct addrinfo **res) {

View file

@ -23,6 +23,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/dns/hoststxt.h" #include "libc/dns/hoststxt.h"
#include "libc/fmt/fmt.h" #include "libc/fmt/fmt.h"
#include "libc/intrin/pthread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nt/systeminfo.h" #include "libc/nt/systeminfo.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
@ -32,6 +33,7 @@
static struct HostsTxt *g_hoststxt; static struct HostsTxt *g_hoststxt;
static struct HostsTxtInitialStaticMemory { static struct HostsTxtInitialStaticMemory {
struct HostsTxt ht; struct HostsTxt ht;
pthread_mutex_t lock;
struct HostsTxtEntry entries[8]; struct HostsTxtEntry entries[8];
char strings[64]; char strings[64];
} g_hoststxt_init; } g_hoststxt_init;
@ -53,6 +55,7 @@ static textwindows dontinline char *GetNtHostsTxtPath(char *pathbuf,
* Returns hosts.txt map. * Returns hosts.txt map.
* *
* @note yoinking realloc() ensures there's no size limits * @note yoinking realloc() ensures there's no size limits
* @threadsafe
*/ */
const struct HostsTxt *GetHostsTxt(void) { const struct HostsTxt *GetHostsTxt(void) {
FILE *f; FILE *f;
@ -60,6 +63,7 @@ const struct HostsTxt *GetHostsTxt(void) {
char pathbuf[PATH_MAX]; char pathbuf[PATH_MAX];
struct HostsTxtInitialStaticMemory *init; struct HostsTxtInitialStaticMemory *init;
init = &g_hoststxt_init; init = &g_hoststxt_init;
pthread_mutex_lock(&init->lock);
if (!g_hoststxt) { if (!g_hoststxt) {
g_hoststxt = &init->ht; g_hoststxt = &init->ht;
init->ht.entries.n = pushpop(ARRAYLEN(init->entries)); init->ht.entries.n = pushpop(ARRAYLEN(init->entries));
@ -78,5 +82,6 @@ const struct HostsTxt *GetHostsTxt(void) {
fclose(f); fclose(f);
} }
} }
pthread_mutex_unlock(&init->lock);
return g_hoststxt; return g_hoststxt;
} }

View file

@ -20,6 +20,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/dns/resolvconf.h" #include "libc/dns/resolvconf.h"
#include "libc/fmt/fmt.h" #include "libc/fmt/fmt.h"
#include "libc/intrin/pthread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/sock/sock.h" #include "libc/sock/sock.h"
@ -28,17 +29,20 @@
static struct ResolvConf *g_resolvconf; static struct ResolvConf *g_resolvconf;
static struct ResolvConfInitialStaticMemory { static struct ResolvConfInitialStaticMemory {
struct ResolvConf rv; struct ResolvConf rv;
pthread_mutex_t lock;
struct sockaddr_in nameservers[3]; struct sockaddr_in nameservers[3];
} g_resolvconf_init; } g_resolvconf_init;
/** /**
* Returns singleton with DNS server address. * Returns singleton with DNS server address.
* @threadsafe
*/ */
const struct ResolvConf *GetResolvConf(void) { const struct ResolvConf *GetResolvConf(void) {
int rc; int rc;
FILE *f; FILE *f;
struct ResolvConfInitialStaticMemory *init; struct ResolvConfInitialStaticMemory *init;
init = &g_resolvconf_init; init = &g_resolvconf_init;
pthread_mutex_lock(&init->lock);
if (!g_resolvconf) { if (!g_resolvconf) {
g_resolvconf = &init->rv; g_resolvconf = &init->rv;
pushmov(&init->rv.nameservers.n, ARRAYLEN(init->nameservers)); pushmov(&init->rv.nameservers.n, ARRAYLEN(init->nameservers));
@ -58,5 +62,6 @@ const struct ResolvConf *GetResolvConf(void) {
/* TODO(jart): Elevate robustness. */ /* TODO(jart): Elevate robustness. */
} }
} }
pthread_mutex_unlock(&init->lock);
return g_resolvconf; return g_resolvconf;
} }

View file

@ -47,6 +47,7 @@
* @return -1 on error, or positive port number * @return -1 on error, or positive port number
* @note aliases are read from file for comparison, but not returned. * @note aliases are read from file for comparison, but not returned.
* @see LookupServicesByPort * @see LookupServicesByPort
* @threadsafe
*/ */
int LookupServicesByName(const char *servname, char *servproto, int LookupServicesByName(const char *servname, char *servproto,
size_t servprotolen, char *buf, size_t bufsize, size_t servprotolen, char *buf, size_t bufsize,

View file

@ -37,6 +37,7 @@ void __cxa_printexits(FILE *f, void *pred) {
fprintf(f, " GLOBAL DESTRUCTORS \n"); fprintf(f, " GLOBAL DESTRUCTORS \n");
fprintf(f, " callback arg pred \n"); fprintf(f, " callback arg pred \n");
fprintf(f, "---------------------- ------------------ ------------------\n"); fprintf(f, "---------------------- ------------------ ------------------\n");
__cxa_lock();
if ((b = __cxa_blocks.p)) { if ((b = __cxa_blocks.p)) {
do { do {
mask = b->mask; mask = b->mask;
@ -56,5 +57,6 @@ void __cxa_printexits(FILE *f, void *pred) {
} }
} while ((b = b->next)); } while ((b = b->next));
} }
__cxa_unlock();
fprintf(f, "\n"); fprintf(f, "\n");
} }

View file

@ -127,10 +127,6 @@
// Loads address of errno into %rcx // Loads address of errno into %rcx
.macro .errno .macro .errno
call __errno_location call __errno_location
// cs
// cs
// cs
// mov $__errno,%eax
.endm .endm
// Post-Initialization Read-Only (PIRO) BSS section. // Post-Initialization Read-Only (PIRO) BSS section.

View file

@ -124,6 +124,16 @@ cosmo: push %rbp
.weak ape_stack_align .weak ape_stack_align
#endif #endif
#if IsAsan()
.init.start 305,_init_symbols
push %rdi
push %rsi
call __init_symbols
pop %rsi
pop %rdi
.init.end 305,_init_symbols
#endif
#ifdef __PG__ #ifdef __PG__
.init.start 306,_init_ftrace .init.start 306,_init_ftrace
push %rdi push %rdi
@ -135,16 +145,6 @@ cosmo: push %rbp
.init.end 306,_init_ftrace .init.end 306,_init_ftrace
#endif #endif
#if IsAsan()
.init.start 306,_init_symbols
push %rdi
push %rsi
call __init_symbols
pop %rsi
pop %rdi
.init.end 306,_init_symbols
#endif
#if IsModeDbg() #if IsModeDbg()
#ifdef SYSDEBUG #ifdef SYSDEBUG
.init.start 307,_init_printargs .init.start 307,_init_printargs

View file

@ -20,6 +20,8 @@
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/log/log.h" #include "libc/log/log.h"
#include "libc/runtime/internal.h"
#include "libc/runtime/runtime.h"
#include "libc/sock/internal.h" #include "libc/sock/internal.h"
#include "libc/sock/sock.h" #include "libc/sock/sock.h"
#include "libc/sysv/consts/af.h" #include "libc/sysv/consts/af.h"
@ -42,6 +44,7 @@ void _firewall(const void *addr, uint32_t addrsize) {
*p++ = '\n'; *p++ = '\n';
write(2, b, p - b); write(2, b, p - b);
if (weaken(__die)) weaken(__die)(); if (weaken(__die)) weaken(__die)();
abort(); __restorewintty();
_Exit(66);
} }
} }