X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=authbind.git;a=blobdiff_plain;f=helper.c;h=a58e7aae666f30899a9673f2efbaf7b070b8bdd2;hp=77456c1b62b03528793657361d57cc3d9d1bf8cd;hb=4b19c2885bae85dee45ecfc3cfcd8d503d3f3e23;hpb=e9fb37fdd9029a2084040d6524ed54de0a6185c7 diff --git a/helper.c b/helper.c index 77456c1..a58e7aa 100644 --- a/helper.c +++ b/helper.c @@ -62,6 +62,11 @@ static void authorised(void) { else _exit(0); } +static void checkexecflagfile(const char *file) { + if (!access(file,X_OK)) authorised(); + if (errno != ENOENT) exiterrno(errno); +} + static void hex2bytes(const char *string, unsigned char *out, int len) { int i; for (i=0; i> pfxlen_thisbyte); + unsigned thaddr_thisbyte = thaddr[i]; + unsigned addr_thisbyte = ((unsigned char*)addr_any)[i]; + if ((addr_thisbyte & mask_thisbyte) != thaddr_thisbyte) + goto badline; + } + if (pfxlen_remain) badline: continue; + /* hooray */ } else { - min = fnbuf; - max = fnbuf; + const char *min, *max; + if (hyphen) { + *hyphen++ = '\0'; + min = fnbuf; + max = hyphen; + } else { + min = fnbuf; + max = fnbuf; + } + unsigned char minaddr[addrlen_any]; + unsigned char maxaddr[addrlen_any]; + if (inet_pton(af,min,minaddr) != 1 || + inet_pton(af,max,maxaddr) != 1) + continue; + if (memcmp(addr_any,minaddr,addrlen_any) < 0 || + memcmp(addr_any,maxaddr,addrlen_any) > 0) + continue; } - unsigned char minaddr[addrlen_any]; - unsigned char maxaddr[addrlen_any]; - if (inet_pton(af,min,minaddr) != 1 || - inet_pton(af,max,maxaddr) != 1) - continue; - if (memcmp(addr_any,minaddr,addrlen_any) < 0 || - memcmp(addr_any,maxaddr,addrlen_any) > 0) - continue; - sscanf(comma," %u-%u %n", - &pmin,&pmax,&nchar); - if (nchar != strlen(comma)) + if (nchar = -1, + sscanf(comma," %u-%u %n", + &pmin,&pmax,&nchar), + nchar == strlen(comma)) { + /* good */ + } else if (nchar = -1, + sscanf(comma," %u %n", + &pmin,&nchar), + nchar == strlen(comma)) { + pmax = pmin; + } else { continue; + } } if (hportpmax) continue;