X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=authbind.git;a=blobdiff_plain;f=libauthbind.c;h=dc004a33ad3fb4ab7dc308099f5b20c72b50f91b;hp=dd5c4841c314ff22f3d14768deb1e4926e9a4302;hb=76d3668c8bd60ab6ee79687940d06485fe4d4930;hpb=a942b07a4483cfa4a5f0a8307e3b6239f7f44998;ds=sidebyside diff --git a/libauthbind.c b/libauthbind.c index dd5c484..dc004a3 100644 --- a/libauthbind.c +++ b/libauthbind.c @@ -40,13 +40,11 @@ typedef int bindfn_type(int fd, const struct sockaddr *addr, socklen_t addrlen); #define STDERRSTR_CONST(m) write(2,m,sizeof(m)-1) #define STDERRSTR_STRING(m) write(2,m,strlen(m)) -static int find_any(const char *name, anyfn_type **keep) { +static anyfn_type *find_any(const char *name) { static const char *dlerr; anyfn_type *kv; - if (*keep) return 0; - kv= dlsym(RTLD_NEXT,name); - if (kv) { *keep= kv; return 0; } + kv= dlsym(RTLD_NEXT,name); if (kv) return kv; dlerr= dlerror(); if (!dlerr) dlerr= "dlsym() failed for no reason"; STDERRSTR_CONST("libauthbind: error finding original version of "); STDERRSTR_STRING(name); @@ -54,14 +52,14 @@ static int find_any(const char *name, anyfn_type **keep) { STDERRSTR_STRING(dlerr); STDERRSTR_STRING("\n"); errno= ENOSYS; - return -1; + return 0; } static bindfn_type find_bind, *old_bind= find_bind; int find_bind(int fd, const struct sockaddr *addr, socklen_t addrlen) { anyfn_type *anyfn; - if (find_any("bind",&anyfn)) return -1; + anyfn= find_any("bind"); if (!anyfn) return -1; old_bind= (bindfn_type*)anyfn; return old_bind(fd,addr,addrlen); } @@ -149,7 +147,8 @@ int bind(int fd, const struct sockaddr *addr, socklen_t addrlen) { int status; if (addr->sa_family != AF_INET || addrlen != sizeof(struct sockaddr_in) || - ntohs(((struct sockaddr_in*)addr)->sin_port) >= IPPORT_RESERVED/2 || !geteuid()) + !geteuid() || ((struct sockaddr_in*)addr)->sin_port == 0 || + ntohs(((struct sockaddr_in*)addr)->sin_port) >= IPPORT_RESERVED/2) return old_bind(fd,addr,addrlen); sprintf(addrarg,"%08lx",