mirror of
https://github.com/curl/curl.git
synced 2025-03-13 15:37:04 +08:00
smb: Moved the URL decoding into a separate function
This commit is contained in:
parent
864f17d894
commit
36d45eabc0
86
lib/smb.c
86
lib/smb.c
@ -57,6 +57,7 @@ static CURLcode smb_done(struct connectdata *conn, CURLcode status,
|
|||||||
static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
|
static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
|
||||||
static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
|
static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
|
||||||
int numsocks);
|
int numsocks);
|
||||||
|
static CURLcode smb_parse_url_path(struct connectdata *conn);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SMB handler interface
|
* SMB handler interface
|
||||||
@ -176,10 +177,7 @@ struct smb_request {
|
|||||||
|
|
||||||
static CURLcode smb_setup(struct connectdata *conn)
|
static CURLcode smb_setup(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
|
||||||
struct smb_request *req;
|
struct smb_request *req;
|
||||||
char *slash;
|
|
||||||
char *path;
|
|
||||||
|
|
||||||
/* Initialize the request state */
|
/* Initialize the request state */
|
||||||
conn->data->req.protop = req = calloc(1, sizeof(struct smb_request));
|
conn->data->req.protop = req = calloc(1, sizeof(struct smb_request));
|
||||||
@ -189,40 +187,8 @@ static CURLcode smb_setup(struct connectdata *conn)
|
|||||||
req->state = SMB_REQUESTING;
|
req->state = SMB_REQUESTING;
|
||||||
req->result = CURLE_OK;
|
req->result = CURLE_OK;
|
||||||
|
|
||||||
/* URL decode the path */
|
/* Parse the URL path */
|
||||||
result = Curl_urldecode(conn->data, conn->data->state.path, 0, &path, NULL,
|
return smb_parse_url_path(conn);
|
||||||
TRUE);
|
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
/* Parse the share and path */
|
|
||||||
req->share = strdup((*path == '/' || *path == '\\') ? path + 1 : path);
|
|
||||||
if(!req->share) {
|
|
||||||
Curl_safefree(path);
|
|
||||||
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
slash = strchr(req->share, '/');
|
|
||||||
if(!slash)
|
|
||||||
slash = strchr(req->share, '\\');
|
|
||||||
|
|
||||||
if(!slash) {
|
|
||||||
Curl_safefree(path);
|
|
||||||
|
|
||||||
return CURLE_URL_MALFORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
*slash++ = 0;
|
|
||||||
req->path = slash;
|
|
||||||
for(; *slash; slash++) {
|
|
||||||
if(*slash == '/')
|
|
||||||
*slash = '\\';
|
|
||||||
}
|
|
||||||
|
|
||||||
Curl_safefree(path);
|
|
||||||
|
|
||||||
return CURLE_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode smb_connect(struct connectdata *conn, bool *done)
|
static CURLcode smb_connect(struct connectdata *conn, bool *done)
|
||||||
@ -883,4 +849,50 @@ static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
|
|||||||
return GETSOCK_READSOCK(0);
|
return GETSOCK_READSOCK(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CURLcode smb_parse_url_path(struct connectdata *conn)
|
||||||
|
{
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
struct smb_request *req = data->req.protop;
|
||||||
|
char *path;
|
||||||
|
char *slash;
|
||||||
|
|
||||||
|
/* URL decode the path */
|
||||||
|
result = Curl_urldecode(data, data->state.path, 0, &path, NULL, TRUE);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* Parse the path for the share */
|
||||||
|
req->share = strdup((*path == '/' || *path == '\\') ? path + 1 : path);
|
||||||
|
if(!req->share) {
|
||||||
|
Curl_safefree(path);
|
||||||
|
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
slash = strchr(req->share, '/');
|
||||||
|
if(!slash)
|
||||||
|
slash = strchr(req->share, '\\');
|
||||||
|
|
||||||
|
/* The share must be present */
|
||||||
|
if(!slash) {
|
||||||
|
Curl_safefree(path);
|
||||||
|
|
||||||
|
return CURLE_URL_MALFORMAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the path for the file path converting any forward slashes into
|
||||||
|
backslashes */
|
||||||
|
*slash++ = 0;
|
||||||
|
req->path = slash;
|
||||||
|
for(; *slash; slash++) {
|
||||||
|
if(*slash == '/')
|
||||||
|
*slash = '\\';
|
||||||
|
}
|
||||||
|
|
||||||
|
Curl_safefree(path);
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_SMB && USE_NTLM && USE_WINDOWS_SSPI */
|
#endif /* CURL_DISABLE_SMB && USE_NTLM && USE_WINDOWS_SSPI */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user