mirror of
https://github.com/moparisthebest/curl
synced 2024-11-10 11:35:07 -05:00
ntlm_wb: Fix hard-coded limit on NTLM auth packet size
Bumping it to 1KiB in commit aaaf9e50ec
is all very well, but having hit
a hard limit once let's just make it cope by reallocating as necessary.
This commit is contained in:
parent
df5169fa35
commit
9008f3d564
@ -227,11 +227,11 @@ done:
|
|||||||
static CURLcode ntlm_wb_response(struct connectdata *conn,
|
static CURLcode ntlm_wb_response(struct connectdata *conn,
|
||||||
const char *input, curlntlm state)
|
const char *input, curlntlm state)
|
||||||
{
|
{
|
||||||
ssize_t size;
|
char *buf = malloc(NTLM_BUFSIZE);
|
||||||
char buf[NTLM_BUFSIZE];
|
size_t len_in = strlen(input), len_out = 0;
|
||||||
char *tmpbuf = buf;
|
|
||||||
size_t len_in = strlen(input);
|
if(!buf)
|
||||||
size_t len_out = sizeof(buf);
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
while(len_in > 0) {
|
while(len_in > 0) {
|
||||||
ssize_t written = swrite(conn->ntlm_auth_hlpr_socket, input, len_in);
|
ssize_t written = swrite(conn->ntlm_auth_hlpr_socket, input, len_in);
|
||||||
@ -246,8 +246,11 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
|
|||||||
len_in -= written;
|
len_in -= written;
|
||||||
}
|
}
|
||||||
/* Read one line */
|
/* Read one line */
|
||||||
while(len_out > 0) {
|
while(1) {
|
||||||
size = sread(conn->ntlm_auth_hlpr_socket, tmpbuf, len_out);
|
ssize_t size;
|
||||||
|
char *newbuf;
|
||||||
|
|
||||||
|
size = sread(conn->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE);
|
||||||
if(size == -1) {
|
if(size == -1) {
|
||||||
if(errno == EINTR)
|
if(errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
@ -255,22 +258,28 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
else if(size == 0)
|
else if(size == 0)
|
||||||
goto done;
|
goto done;
|
||||||
else if(tmpbuf[size - 1] == '\n') {
|
|
||||||
tmpbuf[size - 1] = '\0';
|
len_out += size;
|
||||||
|
if(buf[len_out - 1] == '\n') {
|
||||||
|
buf[len_out - 1] = '\0';
|
||||||
goto wrfinish;
|
goto wrfinish;
|
||||||
}
|
}
|
||||||
tmpbuf += size;
|
newbuf = realloc(buf, len_out + NTLM_BUFSIZE);
|
||||||
len_out -= size;
|
if(!newbuf) {
|
||||||
|
free(buf);
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
buf = newbuf;
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
wrfinish:
|
wrfinish:
|
||||||
/* Samba/winbind installed but not configured */
|
/* Samba/winbind installed but not configured */
|
||||||
if(state == NTLMSTATE_TYPE1 &&
|
if(state == NTLMSTATE_TYPE1 &&
|
||||||
size == 3 &&
|
len_out == 3 &&
|
||||||
buf[0] == 'P' && buf[1] == 'W')
|
buf[0] == 'P' && buf[1] == 'W')
|
||||||
return CURLE_REMOTE_ACCESS_DENIED;
|
return CURLE_REMOTE_ACCESS_DENIED;
|
||||||
/* invalid response */
|
/* invalid response */
|
||||||
if(size < 4)
|
if(len_out < 4)
|
||||||
goto done;
|
goto done;
|
||||||
if(state == NTLMSTATE_TYPE1 &&
|
if(state == NTLMSTATE_TYPE1 &&
|
||||||
(buf[0]!='Y' || buf[1]!='R' || buf[2]!=' '))
|
(buf[0]!='Y' || buf[1]!='R' || buf[2]!=' '))
|
||||||
@ -280,9 +289,11 @@ wrfinish:
|
|||||||
(buf[0]!='A' || buf[1]!='F' || buf[2]!=' '))
|
(buf[0]!='A' || buf[1]!='F' || buf[2]!=' '))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
conn->response_header = aprintf("NTLM %.*s", size - 4, buf + 3);
|
conn->response_header = aprintf("NTLM %.*s", len_out - 4, buf + 3);
|
||||||
|
free(buf);
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
done:
|
done:
|
||||||
|
free(buf);
|
||||||
return CURLE_REMOTE_ACCESS_DENIED;
|
return CURLE_REMOTE_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user