chiark / gitweb /
Fix coredump bug.
[authbind.git] / libauthbind.c
index dd5c4841c314ff22f3d14768deb1e4926e9a4302..dc004a33ad3fb4ab7dc308099f5b20c72b50f91b 100644 (file)
@@ -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))
 
 #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;
 
   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);
   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;
   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;
 }
 
 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);
 }
   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) ||
   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",
     return old_bind(fd,addr,addrlen);
 
   sprintf(addrarg,"%08lx",