1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-05 12:22:11 +03:00

util/rfc1738_unescape(): return end pointer or NULL on error

At present we don't detect errors, but when we do we'll return NULL.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
Douglas Bagnall
2018-02-17 10:46:44 +13:00
committed by Douglas Bagnall
parent 6ef6ddce5a
commit a4c853a7de
5 changed files with 32 additions and 12 deletions

View File

@ -193,8 +193,8 @@ rfc1738_escape_part(TALLOC_CTX *mem_ctx, const char *url)
* rfc1738_unescape() - Converts escaped characters (%xy numbers) in * rfc1738_unescape() - Converts escaped characters (%xy numbers) in
* given the string. %% is a %. %ab is the 8-bit hexadecimal number "ab" * given the string. %% is a %. %ab is the 8-bit hexadecimal number "ab"
*/ */
_PUBLIC_ void
rfc1738_unescape(char *s) _PUBLIC_ char *rfc1738_unescape(char *s)
{ {
char hexnum[3]; char hexnum[3];
int i, j; /* i is write, j is read */ int i, j; /* i is write, j is read */
@ -222,4 +222,5 @@ rfc1738_unescape(char *s)
} }
} }
s[i] = '\0'; s[i] = '\0';
return s + i;
} }

View File

@ -225,7 +225,7 @@ _PUBLIC_ char *hex_encode_talloc(TALLOC_CTX *mem_ctx, const unsigned char *buff_
/** /**
Unescape a URL encoded string, in place. Unescape a URL encoded string, in place.
**/ **/
_PUBLIC_ void rfc1738_unescape(char *buf); _PUBLIC_ char *rfc1738_unescape(char *buf);
/** /**

View File

@ -698,12 +698,16 @@ static char *
uri_unescape_alloc(const char *uritok) uri_unescape_alloc(const char *uritok)
{ {
char *ret; char *ret;
char *end;
ret = (char *) SMB_STRDUP(uritok); ret = (char *) SMB_STRDUP(uritok);
if (!ret) { if (!ret) {
return NULL; return NULL;
} }
rfc1738_unescape(ret); end = rfc1738_unescape(ret);
if (end == NULL) {
free(ret);
return NULL;
}
return ret; return ret;
} }

View File

@ -1260,7 +1260,7 @@ static void manage_squid_basic_request(enum stdio_helper_mode stdio_helper_mode,
struct ntlm_auth_state *state, struct ntlm_auth_state *state,
char *buf, int length, void **private2) char *buf, int length, void **private2)
{ {
char *user, *pass; char *user, *pass;
user=buf; user=buf;
pass=(char *)memchr(buf,' ',length); pass=(char *)memchr(buf,' ',length);
@ -1273,8 +1273,20 @@ static void manage_squid_basic_request(enum stdio_helper_mode stdio_helper_mode,
pass++; pass++;
if (state->helper_mode == SQUID_2_5_BASIC) { if (state->helper_mode == SQUID_2_5_BASIC) {
rfc1738_unescape(user); char *end = rfc1738_unescape(user);
rfc1738_unescape(pass); if (end == NULL || (end - user) != strlen(user)) {
DEBUG(2, ("Badly rfc1738 encoded username: %s; "
"denying access\n", user));
printf("ERR\n");
return;
}
end = rfc1738_unescape(pass);
if (end == NULL || (end - pass) != strlen(pass)) {
DEBUG(2, ("Badly encoded password for %s; "
"denying access\n", user));
printf("ERR\n");
return;
}
} }
if (check_plaintext_auth(user, pass, False)) { if (check_plaintext_auth(user, pass, False)) {

View File

@ -412,7 +412,7 @@ _PUBLIC_ struct composite_context *ldap_connect_send(struct ldap_connection *con
if (strequal(protocol, "ldapi")) { if (strequal(protocol, "ldapi")) {
struct socket_address *unix_addr; struct socket_address *unix_addr;
char path[1025]; char path[1025];
char *end = NULL;
NTSTATUS status = socket_create("unix", SOCKET_TYPE_STREAM, &state->sock, 0); NTSTATUS status = socket_create("unix", SOCKET_TYPE_STREAM, &state->sock, 0);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
return NULL; return NULL;
@ -439,15 +439,18 @@ _PUBLIC_ struct composite_context *ldap_connect_send(struct ldap_connection *con
return result; return result;
} }
rfc1738_unescape(path); end = rfc1738_unescape(path);
if (end == NULL) {
composite_error(state->ctx,
NT_STATUS_INVALID_PARAMETER);
return result;
}
unix_addr = socket_address_from_strings(state, state->sock->backend_name, unix_addr = socket_address_from_strings(state, state->sock->backend_name,
path, 0); path, 0);
if (composite_nomem(unix_addr, result)) { if (composite_nomem(unix_addr, result)) {
return result; return result;
} }
ctx = socket_connect_send(state->sock, NULL, unix_addr, ctx = socket_connect_send(state->sock, NULL, unix_addr,
0, result->event_ctx); 0, result->event_ctx);
ctx->async.fn = ldap_connect_recv_unix_conn; ctx->async.fn = ldap_connect_recv_unix_conn;