summaryrefslogtreecommitdiff
path: root/lib/setopt.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/setopt.c')
-rw-r--r--lib/setopt.c257
1 files changed, 47 insertions, 210 deletions
diff --git a/lib/setopt.c b/lib/setopt.c
index 394b5567e..168417738 100644
--- a/lib/setopt.c
+++ b/lib/setopt.c
@@ -60,7 +60,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-
static CURLcode setopt_set_timeout_sec(timediff_t *ptimeout_ms, long secs)
{
if(secs < 0)
@@ -854,6 +853,17 @@ static CURLcode setopt_bool(struct Curl_easy *data, CURLoption option,
return CURLE_OK;
}
+static CURLcode value_range(long *value, long below_error, long min, long max)
+{
+ if(*value < below_error)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ else if(*value < min)
+ *value = min;
+ else if(*value > max)
+ *value = max;
+ return CURLE_OK;
+}
+
static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
long arg)
{
@@ -866,21 +876,13 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
switch(option) {
case CURLOPT_DNS_CACHE_TIMEOUT:
- if(arg < -1)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- else if(arg > INT_MAX/1000)
- arg = INT_MAX/1000;
+ return setopt_set_timeout_sec(&s->dns_cache_timeout_ms, arg);
- if(arg > 0)
- arg *= 1000;
- s->dns_cache_timeout_ms = (int)arg;
- break;
case CURLOPT_CA_CACHE_TIMEOUT:
if(Curl_ssl_supports(data, SSLSUPP_CA_CACHE)) {
- if(arg < -1)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- else if(arg > INT_MAX)
- arg = INT_MAX;
+ result = value_range(&arg, -1, -1, INT_MAX);
+ if(result)
+ return result;
s->general_ssl.ca_cache_timeout = (int)arg;
}
@@ -888,64 +890,38 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
return CURLE_NOT_BUILT_IN;
break;
case CURLOPT_MAXCONNECTS:
- /*
- * Set the absolute number of maximum simultaneous alive connection that
- * libcurl is allowed to have.
- */
- if(uarg > UINT_MAX)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- s->maxconnects = (unsigned int)uarg;
+ result = value_range(&arg, 1, 1, UINT_MAX);
+ if(result)
+ return result;
+ s->maxconnects = (unsigned int)arg;
break;
case CURLOPT_SERVER_RESPONSE_TIMEOUT:
- /*
- * Option that specifies how quickly a server response must be obtained
- * before it is considered failure. For pingpong protocols.
- */
return setopt_set_timeout_sec(&s->server_response_timeout, arg);
case CURLOPT_SERVER_RESPONSE_TIMEOUT_MS:
- /*
- * Option that specifies how quickly a server response must be obtained
- * before it is considered failure. For pingpong protocols.
- */
return setopt_set_timeout_ms(&s->server_response_timeout, arg);
#ifndef CURL_DISABLE_TFTP
case CURLOPT_TFTP_BLKSIZE:
- /*
- * TFTP option that specifies the block size to use for data transmission.
- */
- if(arg < TFTP_BLKSIZE_MIN)
- arg = 512;
- else if(arg > TFTP_BLKSIZE_MAX)
- arg = TFTP_BLKSIZE_MAX;
- s->tftp_blksize = arg;
+ result = value_range(&arg, 0, TFTP_BLKSIZE_MIN, TFTP_BLKSIZE_MAX);
+ if(result)
+ return result;
+ s->tftp_blksize = (unsigned short)arg;
break;
#endif
#ifndef CURL_DISABLE_NETRC
case CURLOPT_NETRC:
- /*
- * Parse the $HOME/.netrc file
- */
if((arg < CURL_NETRC_IGNORED) || (arg >= CURL_NETRC_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->use_netrc = (unsigned char)arg;
break;
#endif
case CURLOPT_TIMECONDITION:
- /*
- * Set HTTP time condition. This must be one of the defines in the
- * curl/curl.h header file.
- */
if((arg < CURL_TIMECOND_NONE) || (arg >= CURL_TIMECOND_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->timecondition = (unsigned char)arg;
break;
case CURLOPT_TIMEVALUE:
- /*
- * This is the value to compare with the remote document with the
- * method set with CURLOPT_TIMECONDITION
- */
s->timevalue = (time_t)arg;
break;
case CURLOPT_SSLVERSION:
@@ -955,10 +931,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
return Curl_setopt_SSLVERSION(data, option, arg);
case CURLOPT_POSTFIELDSIZE:
- /*
- * The size of the POSTFIELD data to prevent libcurl to do strlen() to
- * figure it out. Enables binary posts.
- */
if(arg < -1)
return CURLE_BAD_FUNCTION_ARGUMENT;
@@ -973,34 +945,19 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
break;
#ifndef CURL_DISABLE_HTTP
case CURLOPT_FOLLOWLOCATION:
- /*
- * Follow Location: header hints on an HTTP-server.
- */
if(uarg > 3)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->http_follow_mode = (unsigned char)uarg;
break;
case CURLOPT_MAXREDIRS:
- /*
- * The maximum amount of hops you allow curl to follow Location:
- * headers. This should mostly be used to detect never-ending loops.
- */
- if(arg < -1)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- s->maxredirs = arg;
+ result = value_range(&arg, -1, 0, 0x7fff);
+ if(result)
+ return result;
+ s->maxredirs = (short)arg;
break;
case CURLOPT_POSTREDIR:
- /*
- * Set the behavior of POST when redirecting
- * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
- * CURL_REDIR_POST_301 - POST is kept as POST after 301
- * CURL_REDIR_POST_302 - POST is kept as POST after 302
- * CURL_REDIR_POST_303 - POST is kept as POST after 303
- * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
- * other - POST is kept as POST after 301 and 302
- */
if(arg < CURL_REDIR_GET_ALL)
/* no return error on too high numbers since the bitmask could be
extended in a future */
@@ -1009,9 +966,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
break;
case CURLOPT_HEADEROPT:
- /*
- * Set header option.
- */
s->sep_headers = !!(arg & CURLHEADER_SEPARATE);
break;
case CURLOPT_HTTPAUTH:
@@ -1021,13 +975,10 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
return setopt_HTTP_VERSION(data, arg);
case CURLOPT_EXPECT_100_TIMEOUT_MS:
- /*
- * Time to wait for a response to an HTTP request containing an
- * Expect: 100-continue header before sending the data anyway.
- */
- if(arg < 0)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- s->expect_100_timeout = arg;
+ result = value_range(&arg, 0, 0, 0xffff);
+ if(result)
+ return result;
+ s->expect_100_timeout = (unsigned short)arg;
break;
#endif /* ! CURL_DISABLE_HTTP */
@@ -1039,9 +990,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#endif
#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXYPORT:
- /*
- * Explicitly set HTTP proxy port number.
- */
if((arg < 0) || (arg > 65535))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->proxyport = (unsigned short)arg;
@@ -1051,9 +999,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
return httpauth(data, TRUE, uarg);
case CURLOPT_PROXYTYPE:
- /*
- * Set proxy type.
- */
if((arg < CURLPROXY_HTTP) || (arg > CURLPROXY_SOCKS5_HOSTNAME))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->proxytype = (unsigned char)arg;
@@ -1068,9 +1013,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#ifndef CURL_DISABLE_FTP
case CURLOPT_FTP_FILEMETHOD:
- /*
- * How do access files over FTP.
- */
if((arg < CURLFTPMETHOD_DEFAULT) || (arg >= CURLFTPMETHOD_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->ftp_filemethod = (unsigned char)arg;
@@ -1082,89 +1024,53 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
break;
case CURLOPT_FTPSSLAUTH:
- /*
- * Set a specific auth for FTP-SSL transfers.
- */
if((arg < CURLFTPAUTH_DEFAULT) || (arg >= CURLFTPAUTH_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->ftpsslauth = (unsigned char)arg;
break;
case CURLOPT_ACCEPTTIMEOUT_MS:
- /*
- * The maximum time for curl to wait for FTP server connect
- */
return setopt_set_timeout_ms(&s->accepttimeout, arg);
#endif /* ! CURL_DISABLE_FTP */
#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH)
case CURLOPT_FTP_CREATE_MISSING_DIRS:
- /*
- * An FTP/SFTP option that modifies an upload to create missing
- * directories on the server.
- */
- /* reserve other values for future use */
if((arg < CURLFTP_CREATE_DIR_NONE) || (arg > CURLFTP_CREATE_DIR_RETRY))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->ftp_create_missing_dirs = (unsigned char)arg;
break;
#endif /* ! CURL_DISABLE_FTP || USE_SSH */
case CURLOPT_INFILESIZE:
- /*
- * If known, this should inform curl about the file size of the
- * to-be-uploaded file.
- */
if(arg < -1)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->filesize = arg;
break;
case CURLOPT_LOW_SPEED_LIMIT:
- /*
- * The low speed limit that if transfers are below this for
- * CURLOPT_LOW_SPEED_TIME, the transfer is aborted.
- */
if(arg < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->low_speed_limit = arg;
break;
case CURLOPT_LOW_SPEED_TIME:
- /*
- * The low speed time that if transfers are below the set
- * CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted.
- */
if(arg < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->low_speed_time = arg;
break;
case CURLOPT_PORT:
- /*
- * The port number to use when getting the URL. 0 disables it.
- */
if((arg < 0) || (arg > 65535))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->use_port = (unsigned short)arg;
break;
case CURLOPT_TIMEOUT:
- /*
- * The maximum time you allow curl to use for a single transfer
- * operation.
- */
return setopt_set_timeout_sec(&s->timeout, arg);
case CURLOPT_TIMEOUT_MS:
return setopt_set_timeout_ms(&s->timeout, arg);
case CURLOPT_CONNECTTIMEOUT:
- /*
- * The maximum time you allow curl to use to connect.
- */
return setopt_set_timeout_sec(&s->connecttimeout, arg);
case CURLOPT_CONNECTTIMEOUT_MS:
return setopt_set_timeout_ms(&s->connecttimeout, arg);
case CURLOPT_RESUME_FROM:
- /*
- * Resume transfer at the given file position
- */
if(arg < -1)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->set_resume_from = arg;
@@ -1172,17 +1078,11 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#ifndef CURL_DISABLE_BINDLOCAL
case CURLOPT_LOCALPORT:
- /*
- * Set what local port to bind the socket to when performing an operation.
- */
if((arg < 0) || (arg > 65535))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->localport = curlx_sltous(arg);
break;
case CURLOPT_LOCALPORTRANGE:
- /*
- * Set number of local ports to try, starting with CURLOPT_LOCALPORT.
- */
if((arg < 0) || (arg > 65535))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->localportrange = curlx_sltous(arg);
@@ -1191,51 +1091,28 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#ifdef HAVE_GSSAPI
case CURLOPT_GSSAPI_DELEGATION:
- /*
- * GSS-API credential delegation bitmask
- */
s->gssapi_delegation = (unsigned char)uarg&
(CURLGSSAPI_DELEGATION_POLICY_FLAG|CURLGSSAPI_DELEGATION_FLAG);
break;
#endif
case CURLOPT_SSL_FALSESTART:
- /*
- * No TLS backends support false start anymore.
- */
return CURLE_NOT_BUILT_IN;
case CURLOPT_BUFFERSIZE:
- /*
- * The application kindly asks for a differently sized receive buffer.
- * If it seems reasonable, we will use it.
- */
- if(arg > READBUFFER_MAX)
- arg = READBUFFER_MAX;
- else if(arg < 1)
- arg = READBUFFER_SIZE;
- else if(arg < READBUFFER_MIN)
- arg = READBUFFER_MIN;
-
+ result = value_range(&arg, 0, READBUFFER_MIN, READBUFFER_MAX);
+ if(result)
+ return result;
s->buffer_size = (unsigned int)arg;
break;
case CURLOPT_UPLOAD_BUFFERSIZE:
- /*
- * The application kindly asks for a differently sized upload buffer.
- * Cap it to sensible.
- */
- if(arg > UPLOADBUFFER_MAX)
- arg = UPLOADBUFFER_MAX;
- else if(arg < UPLOADBUFFER_MIN)
- arg = UPLOADBUFFER_MIN;
-
+ result = value_range(&arg, 0, UPLOADBUFFER_MIN, UPLOADBUFFER_MAX);
+ if(result)
+ return result;
s->upload_buffer_size = (unsigned int)arg;
break;
case CURLOPT_MAXFILESIZE:
- /*
- * Set the maximum size of a file to download.
- */
if(arg < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->max_filesize = arg;
@@ -1243,9 +1120,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#ifdef USE_SSL
case CURLOPT_USE_SSL:
- /*
- * Make transfers attempt to use SSL/TLS.
- */
if((arg < CURLUSESSL_NONE) || (arg >= CURLUSESSL_LAST))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->use_ssl = (unsigned char)arg;
@@ -1268,12 +1142,7 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
break;
case CURLOPT_CONNECT_ONLY:
- /*
- * No data transfer.
- * (1) - only do connection
- * (2) - do first get request but get no content
- */
- if(arg > 2)
+ if(arg < 0 || arg > 2)
return CURLE_BAD_FUNCTION_ARGUMENT;
s->connect_only = !!arg;
s->connect_only_ws = (arg == 2);
@@ -1281,7 +1150,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#ifdef USE_SSH
- /* we only include SSH options if explicitly built to support SSH */
case CURLOPT_SSH_AUTH_TYPES:
s->ssh_auth_types = (int)arg;
break;
@@ -1289,9 +1157,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH)
case CURLOPT_NEW_FILE_PERMS:
- /*
- * Uses these permissions instead of 0644
- */
if((arg < 0) || (arg > 0777))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->new_file_perms = (unsigned int)arg;
@@ -1299,9 +1164,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#endif
#ifdef USE_SSH
case CURLOPT_NEW_DIRECTORY_PERMS:
- /*
- * Uses these permissions instead of 0755
- */
if((arg < 0) || (arg > 0777))
return CURLE_BAD_FUNCTION_ARGUMENT;
s->new_directory_perms = (unsigned int)arg;
@@ -1309,11 +1171,6 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
#endif
#ifdef USE_IPV6
case CURLOPT_ADDRESS_SCOPE:
- /*
- * Use this scope id when using IPv6
- * We always get longs when passed plain numericals so we should check
- * that the value fits into an unsigned 32-bit integer.
- */
#if SIZEOF_LONG > 4
if(uarg > UINT_MAX)
return CURLE_BAD_FUNCTION_ARGUMENT;
@@ -1322,17 +1179,10 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
break;
#endif
case CURLOPT_PROTOCOLS:
- /* set the bitmask for the protocols that are allowed to be used for the
- transfer, which thus helps the app which takes URLs from users or other
- external inputs and want to restrict what protocol(s) to deal with.
- Defaults to CURLPROTO_ALL. */
s->allowed_protocols = (curl_prot_t)arg;
break;
case CURLOPT_REDIR_PROTOCOLS:
- /* set the bitmask for the protocols that libcurl is allowed to follow to,
- as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol
- needs to be set in both bitmasks to be allowed to get redirected to. */
s->redir_protocols = (curl_prot_t)arg;
break;
@@ -1340,40 +1190,31 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
case CURLOPT_RTSP_REQUEST:
return setopt_RTSP_REQUEST(data, arg);
case CURLOPT_RTSP_CLIENT_CSEQ:
- /*
- * Set the CSEQ number to issue for the next RTSP request. Useful if the
- * application is resuming a previously broken connection. The CSEQ
- * will increment from this new number henceforth.
- */
data->state.rtsp_next_client_CSeq = arg;
break;
case CURLOPT_RTSP_SERVER_CSEQ:
- /* Same as the above, but for server-initiated requests */
data->state.rtsp_next_server_CSeq = arg;
break;
#endif /* ! CURL_DISABLE_RTSP */
case CURLOPT_TCP_KEEPIDLE:
- if(arg < 0)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- else if(arg > INT_MAX)
- arg = INT_MAX;
+ result = value_range(&arg, 0, 0, INT_MAX);
+ if(result)
+ return result;
s->tcp_keepidle = (int)arg;
break;
case CURLOPT_TCP_KEEPINTVL:
- if(arg < 0)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- else if(arg > INT_MAX)
- arg = INT_MAX;
+ result = value_range(&arg, 0, 0, INT_MAX);
+ if(result)
+ return result;
s->tcp_keepintvl = (int)arg;
break;
case CURLOPT_TCP_KEEPCNT:
- if(arg < 0)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- else if(arg > INT_MAX)
- arg = INT_MAX;
+ result = value_range(&arg, 0, 0, INT_MAX);
+ if(result)
+ return result;
s->tcp_keepcnt = (int)arg;
break;
case CURLOPT_SSL_ENABLE_NPN:
@@ -1436,16 +1277,12 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
/* deprecated */
break;
case CURLOPT_SSLENGINE_DEFAULT:
- /*
- * flag to set engine as default.
- */
Curl_safefree(s->str[STRING_SSL_ENGINE]);
return Curl_ssl_set_engine_default(data);
case CURLOPT_UPLOAD_FLAGS:
s->upload_flags = (unsigned char)arg;
break;
default:
- /* unknown option */
return CURLE_UNKNOWN_OPTION;
}
return CURLE_OK;