Make builtin ident service work if the request arrives in more than
one packet. Also check that the whole request has been recieved before processing it. The patch isn't the exact one from the PR, but a slight varient suggested by Brian. PR: 16086 Submitted by: Hajimu UMEMOTO <ume@mahoroba.org> Reviewed by: green
This commit is contained in:
parent
ac03480440
commit
7d37a2e661
@ -343,14 +343,14 @@ ident_stream(s, sep) /* Ident service (AKA "auth") */
|
||||
struct timeval tv = {
|
||||
10,
|
||||
0
|
||||
};
|
||||
}, to;
|
||||
struct passwd *pw = NULL;
|
||||
fd_set fdset;
|
||||
char buf[BUFSIZE], *cp = NULL, *p, **av, *osname = NULL, garbage[7];
|
||||
char buf[BUFSIZE], *cp = NULL, *p, **av, *osname = NULL, garbage[7], e;
|
||||
char *fallback = NULL;
|
||||
socklen_t socklen;
|
||||
ssize_t ssize;
|
||||
size_t size;
|
||||
size_t size, bufsiz;
|
||||
int c, fflag = 0, nflag = 0, rflag = 0, argc = 0, usedfallback = 0;
|
||||
int gflag = 0, getcredfail = 0, onreadlen;
|
||||
u_short lport, fport;
|
||||
@ -450,19 +450,42 @@ ident_stream(s, sep) /* Ident service (AKA "auth") */
|
||||
* "local_port , foreign_port\r\n" (with local being the
|
||||
* server's port and foreign being the client's.)
|
||||
*/
|
||||
gettimeofday(&to, NULL);
|
||||
to.tv_sec += tv.tv_sec;
|
||||
if ((to.tv_usec += tv.tv_usec) >= 1000000) {
|
||||
to.tv_usec -= 1000000;
|
||||
to.tv_sec++;
|
||||
}
|
||||
|
||||
size = 0;
|
||||
bufsiz = sizeof(buf) - 1;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(s, &fdset);
|
||||
if (select(s + 1, &fdset, NULL, NULL, &tv) == -1)
|
||||
iderror(0, 0, s, errno);
|
||||
if (ioctl(s, FIONREAD, &onreadlen) == -1)
|
||||
iderror(0, 0, s, errno);
|
||||
if (onreadlen >= sizeof(buf))
|
||||
onreadlen = sizeof(buf) - 1;
|
||||
ssize = read(s, buf, (size_t)onreadlen);
|
||||
if (ssize == -1)
|
||||
iderror(0, 0, s, errno);
|
||||
buf[ssize] = '\0';
|
||||
if (sscanf(buf, "%hu , %hu", &lport, &fport) != 2)
|
||||
while (bufsiz > 0 && (size == 0 || buf[size - 1] != '\n')) {
|
||||
gettimeofday(&tv, NULL);
|
||||
tv.tv_sec = to.tv_sec - tv.tv_sec;
|
||||
tv.tv_usec = to.tv_usec - tv.tv_usec;
|
||||
if (tv.tv_usec < 0) {
|
||||
tv.tv_usec += 1000000;
|
||||
tv.tv_sec--;
|
||||
}
|
||||
if (tv.tv_sec < 0)
|
||||
break;
|
||||
FD_SET(s, &fdset);
|
||||
if (select(s + 1, &fdset, NULL, NULL, &tv) == -1)
|
||||
iderror(0, 0, s, errno);
|
||||
if (ioctl(s, FIONREAD, &onreadlen) == -1)
|
||||
iderror(0, 0, s, errno);
|
||||
if (onreadlen > bufsiz)
|
||||
onreadlen = bufsiz;
|
||||
ssize = read(s, &buf[size], (size_t)onreadlen);
|
||||
if (ssize == -1)
|
||||
iderror(0, 0, s, errno);
|
||||
bufsiz -= ssize;
|
||||
size += ssize;
|
||||
}
|
||||
buf[size] = '\0';
|
||||
/* Read two characters, and check for a delimiting character */
|
||||
if (sscanf(buf, "%hu , %hu%c", &lport, &fport, &e) != 3 || isdigit(e))
|
||||
iderror(0, 0, s, 0);
|
||||
if (gflag) {
|
||||
cp = garbage;
|
||||
|
Loading…
Reference in New Issue
Block a user