2
0
mirror of https://github.com/curl/curl.git synced 2025-04-12 16:20:35 +08:00

tool: make parser reject blank arguments if not supported

Already in the getstr() function that clones the input argument.

Closes 
This commit is contained in:
Daniel Stenberg 2024-01-02 14:17:10 +01:00
parent f59223f500
commit 07bcae89d5
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
4 changed files with 157 additions and 156 deletions

@ -51,19 +51,25 @@
# define USE_WATT32
#endif
#define GetStr(str,val) do { \
if(*(str)) { \
free(*(str)); \
*(str) = NULL; \
} \
if((val)) { \
*(str) = strdup((val)); \
if(!(*(str))) { \
err = PARAM_NO_MEM; \
goto error; \
} \
} \
} while(0)
#define ALLOW_BLANK TRUE
#define DENY_BLANK FALSE
static ParameterError getstr(char **str, const char *val, bool allowblank)
{
if(*str) {
free(*str);
*str = NULL;
}
if(val) {
if(!allowblank && !val[0])
return PARAM_BLANK_STRING;
*str = strdup(val);
if(!*str)
return PARAM_NO_MEM;
}
return PARAM_OK;
}
struct LongShort {
const char *letter; /* short name option */
@ -559,7 +565,7 @@ static ParameterError GetSizeParameter(struct GlobalConfig *global,
#ifdef HAVE_WRITABLE_ARGV
static void cleanarg(argv_item_t str)
{
/* now that GetStr has copied the contents of nextarg, wipe the next
/* now that getstr has copied the contents of nextarg, wipe the next
* argument out so that the username:password isn't displayed in the
* system process list */
if(str) {
@ -624,7 +630,9 @@ static ParameterError data_urlencode(struct GlobalConfig *global,
return err;
}
else {
GetStr(&postdata, p);
err = getstr(&postdata, p, ALLOW_BLANK);
if(err)
goto error;
if(postdata)
size = strlen(postdata);
}
@ -759,6 +767,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
bool toggle = TRUE; /* how to switch boolean options, on or off. Controlled
by using --OPTION or --no-OPTION */
bool nextalloc = FALSE; /* if nextarg is allocated */
struct getout *url;
static const char *redir_protos[] = {
"http",
"https",
@ -907,48 +916,48 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case '*': /* options without a short option */
switch(subletter) {
case '4': /* --dns-ipv4-addr */
if(!curlinfo->ares_num) { /* c-ares is needed for this */
if(!curlinfo->ares_num) /* c-ares is needed for this */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
/* addr in dot notation */
GetStr(&config->dns_ipv4_addr, nextarg);
else
/* addr in dot notation */
err = getstr(&config->dns_ipv4_addr, nextarg, DENY_BLANK);
break;
case '6': /* --dns-ipv6-addr */
if(!curlinfo->ares_num) { /* c-ares is needed for this */
if(!curlinfo->ares_num) /* c-ares is needed for this */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
/* addr in dot notation */
GetStr(&config->dns_ipv6_addr, nextarg);
else
/* addr in dot notation */
err = getstr(&config->dns_ipv6_addr, nextarg, DENY_BLANK);
break;
case 'a': /* random-file */
break;
case 'b': /* egd-file */
break;
case 'B': /* OAuth 2.0 bearer token */
GetStr(&config->oauth_bearer, nextarg);
cleanarg(clearthis);
config->authtype |= CURLAUTH_BEARER;
err = getstr(&config->oauth_bearer, nextarg, DENY_BLANK);
if(!err) {
cleanarg(clearthis);
config->authtype |= CURLAUTH_BEARER;
}
break;
case 'c': /* connect-timeout */
err = secs2ms(&config->connecttimeout_ms, nextarg);
break;
case 'C': /* doh-url */
GetStr(&config->doh_url, nextarg);
if(config->doh_url && !config->doh_url[0])
/* if given a blank string, we make it NULL again */
err = getstr(&config->doh_url, nextarg, ALLOW_BLANK);
if(!err && config->doh_url && !config->doh_url[0])
/* if given a blank string, make it NULL again */
Curl_safefree(config->doh_url);
break;
case 'd': /* ciphers */
GetStr(&config->cipher_list, nextarg);
err = getstr(&config->cipher_list, nextarg, DENY_BLANK);
break;
case 'D': /* --dns-interface */
if(!curlinfo->ares_num) /* c-ares is needed for this */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
else
/* interface name */
GetStr(&config->dns_interface, nextarg);
err = getstr(&config->dns_interface, nextarg, DENY_BLANK);
break;
case 'e': /* --disable-epsv */
config->disable_epsv = toggle;
@ -964,23 +973,27 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
else
/* IP addrs of DNS servers */
GetStr(&config->dns_servers, nextarg);
err = getstr(&config->dns_servers, nextarg, DENY_BLANK);
break;
case 'g': /* --trace */
GetStr(&global->trace_dump, nextarg);
if(global->tracetype && (global->tracetype != TRACE_BIN))
warnf(global, "--trace overrides an earlier trace/verbose option");
global->tracetype = TRACE_BIN;
err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
if(!err) {
if(global->tracetype && (global->tracetype != TRACE_BIN))
warnf(global, "--trace overrides an earlier trace/verbose option");
global->tracetype = TRACE_BIN;
}
break;
case 'G': /* --npn */
warnf(global, "--npn is no longer supported");
break;
case 'h': /* --trace-ascii */
GetStr(&global->trace_dump, nextarg);
if(global->tracetype && (global->tracetype != TRACE_ASCII))
warnf(global,
"--trace-ascii overrides an earlier trace/verbose option");
global->tracetype = TRACE_ASCII;
err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
if(!err) {
if(global->tracetype && (global->tracetype != TRACE_ASCII))
warnf(global,
"--trace-ascii overrides an earlier trace/verbose option");
global->tracetype = TRACE_ASCII;
}
break;
case 'H': /* --alpn */
config->noalpn = (!toggle)?TRUE:FALSE;
@ -1146,7 +1159,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'S': /* ipfs gateway url */
GetStr(&config->ipfs_gateway, nextarg);
err = getstr(&config->ipfs_gateway, nextarg, DENY_BLANK);
break;
case 't': /* --proxy-ntlm */
@ -1164,7 +1177,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'V': /* --aws-sigv4 */
config->authtype |= CURLAUTH_AWS_SIGV4;
GetStr(&config->aws_sigv4, nextarg);
err = getstr(&config->aws_sigv4, nextarg, DENY_BLANK);
break;
case 'v': /* --stderr */
@ -1172,7 +1185,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'w': /* --interface */
/* interface */
GetStr(&config->iface, nextarg);
err = getstr(&config->iface, nextarg, DENY_BLANK);
break;
case 'x': /* --krb */
/* kerberos level string */
@ -1180,13 +1193,13 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->krblevel, nextarg);
err = getstr(&config->krblevel, nextarg, DENY_BLANK);
break;
case 'X': /* --haproxy-protocol */
config->haproxy_protocol = toggle;
break;
case 'P': /* --haproxy-clientip */
GetStr(&config->haproxy_clientip, nextarg);
err = getstr(&config->haproxy_clientip, nextarg, DENY_BLANK);
break;
case 'y': /* --max-filesize */
{
@ -1208,9 +1221,6 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->xattr = toggle;
break;
case '@': /* the URL! */
{
struct getout *url;
if(!config->url_get)
config->url_get = config->url_list;
@ -1236,10 +1246,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
}
/* fill in the URL */
GetStr(&url->url, nextarg);
err = getstr(&url->url, nextarg, DENY_BLANK);
url->flags |= GETOUT_URL;
}
}
break;
case '$': /* more options without a short option */
switch(subletter) {
@ -1258,20 +1267,20 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'c': /* --socks5 specifies a socks5 proxy to use, and resolves
the name locally and passes on the resolved address */
GetStr(&config->proxy, nextarg);
err = getstr(&config->proxy, nextarg, DENY_BLANK);
config->proxyver = CURLPROXY_SOCKS5;
break;
case 't': /* --socks4 specifies a socks4 proxy to use */
GetStr(&config->proxy, nextarg);
err = getstr(&config->proxy, nextarg, DENY_BLANK);
config->proxyver = CURLPROXY_SOCKS4;
break;
case 'T': /* --socks4a specifies a socks4a proxy to use */
GetStr(&config->proxy, nextarg);
err = getstr(&config->proxy, nextarg, DENY_BLANK);
config->proxyver = CURLPROXY_SOCKS4A;
break;
case '2': /* --socks5-hostname specifies a socks5 proxy and enables name
resolving with the proxy */
GetStr(&config->proxy, nextarg);
err = getstr(&config->proxy, nextarg, DENY_BLANK);
config->proxyver = CURLPROXY_SOCKS5_HOSTNAME;
break;
case 'd': /* --tcp-nodelay option */
@ -1314,7 +1323,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'm': /* --ftp-account */
GetStr(&config->ftp_account, nextarg);
err = getstr(&config->ftp_account, nextarg, DENY_BLANK);
break;
case 'n': /* --proxy-anyauth */
config->proxyanyauth = toggle;
@ -1366,7 +1375,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
}
case 'u': /* --ftp-alternative-to-user */
GetStr(&config->ftp_alternative_to_user, nextarg);
err = getstr(&config->ftp_alternative_to_user, nextarg, DENY_BLANK);
break;
case 'v': /* --ssl-reqd */
if(toggle && !feature_ssl) {
@ -1399,11 +1408,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
warnf(global,
"--libcurl option was disabled at build-time");
err = PARAM_OPTION_UNKNOWN;
break;
#else
GetStr(&global->libcurl, nextarg);
break;
err = getstr(&global->libcurl, nextarg, DENY_BLANK);
#endif
break;
case '#': /* --raw */
config->raw = toggle;
break;
@ -1424,21 +1432,21 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case '5': /* --noproxy */
/* This specifies the noproxy list */
GetStr(&config->noproxy, nextarg);
err = getstr(&config->noproxy, nextarg, ALLOW_BLANK);
break;
case '7': /* --socks5-gssapi-nec */
config->socks5_gssapi_nec = toggle;
break;
case '8': /* --proxy1.0 */
/* http 1.0 proxy */
GetStr(&config->proxy, nextarg);
err = getstr(&config->proxy, nextarg, DENY_BLANK);
config->proxyver = CURLPROXY_HTTP_1_0;
break;
case '9': /* --tftp-blksize */
err = str2unum(&config->tftp_blksize, nextarg);
break;
case 'A': /* --mail-from */
GetStr(&config->mail_from, nextarg);
err = getstr(&config->mail_from, nextarg, DENY_BLANK);
break;
case 'B': /* --mail-rcpt */
/* append receiver to a list */
@ -1466,14 +1474,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->gssapi_delegation = delegation(config, nextarg);
break;
case 'H': /* --mail-auth */
GetStr(&config->mail_auth, nextarg);
err = getstr(&config->mail_auth, nextarg, DENY_BLANK);
break;
case 'J': /* --metalink */
errorf(global, "--metalink is disabled");
err = PARAM_BAD_USE;
break;
case '6': /* --sasl-authzid */
GetStr(&config->sasl_authzid, nextarg);
err = getstr(&config->sasl_authzid, nextarg, DENY_BLANK);
break;
case 'K': /* --sasl-ir */
config->sasl_ir = toggle;
@ -1487,20 +1495,21 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'M': /* --unix-socket */
config->abstract_unix_socket = FALSE;
GetStr(&config->unix_socket_path, nextarg);
err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
break;
case 'N': /* --path-as-is */
config->path_as_is = toggle;
break;
case 'O': /* --proxy-service-name */
GetStr(&config->proxy_service_name, nextarg);
err = getstr(&config->proxy_service_name, nextarg, DENY_BLANK);
break;
case 'P': /* --service-name */
GetStr(&config->service_name, nextarg);
err = getstr(&config->service_name, nextarg, DENY_BLANK);
break;
case 'Q': /* --proto-default */
GetStr(&config->proto_default, nextarg);
err = check_protocol(config->proto_default);
err = getstr(&config->proto_default, nextarg, DENY_BLANK);
if(!err)
err = check_protocol(config->proto_default);
break;
case 'R': /* --expect100-timeout */
err = secs2ms(&config->expect100timeout_ms, nextarg);
@ -1513,7 +1522,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'W': /* --abstract-unix-socket */
config->abstract_unix_socket = TRUE;
GetStr(&config->unix_socket_path, nextarg);
err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
break;
case 'X': /* --tls-max */
err = str2tls_max(&config->ssl_version_max, nextarg);
@ -1632,10 +1641,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->ssl_version = CURL_SSLVERSION_TLSv1_3;
break;
case 'A': /* --tls13-ciphers */
GetStr(&config->cipher13_list, nextarg);
err = getstr(&config->cipher13_list, nextarg, DENY_BLANK);
break;
case 'B': /* --proxy-tls13-ciphers */
GetStr(&config->proxy_cipher13_list, nextarg);
err = getstr(&config->proxy_cipher13_list, nextarg, DENY_BLANK);
break;
}
break;
@ -1661,7 +1670,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'A':
/* This specifies the User-Agent name */
GetStr(&config->useragent, nextarg);
err = getstr(&config->useragent, nextarg, ALLOW_BLANK);
break;
case 'b':
switch(subletter) {
@ -1669,13 +1678,13 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(!feature_altsvc)
err = PARAM_LIBCURL_DOESNT_SUPPORT;
else
GetStr(&config->altsvc, nextarg);
err = getstr(&config->altsvc, nextarg, ALLOW_BLANK);
break;
case 'b': /* --hsts */
if(!feature_hsts)
err = PARAM_LIBCURL_DOESNT_SUPPORT;
else
GetStr(&config->hsts, nextarg);
err = getstr(&config->hsts, nextarg, ALLOW_BLANK);
break;
default: /* --cookie string coming up: */
if(nextarg[0] == '@') {
@ -1696,7 +1705,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'c':
/* get the file name to dump all cookies in */
GetStr(&config->cookiejar, nextarg);
err = getstr(&config->cookiejar, nextarg, DENY_BLANK);
break;
case 'C':
/* This makes us continue an ftp transfer at given position */
@ -1806,7 +1815,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
}
}
else {
GetStr(&postdata, nextarg);
err = getstr(&postdata, nextarg, ALLOW_BLANK);
if(err)
break;
if(postdata)
size = strlen(postdata);
}
@ -1860,7 +1871,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'D':
/* dump-header to given file name */
GetStr(&config->headerfile, nextarg);
err = getstr(&config->headerfile, nextarg, DENY_BLANK);
break;
case 'e':
{
@ -1874,7 +1885,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
else
config->autoreferer = FALSE;
ptr = *nextarg ? nextarg : NULL;
GetStr(&config->referer, ptr);
err = getstr(&config->referer, ptr, ALLOW_BLANK);
}
break;
case 'E':
@ -1884,7 +1895,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
GetFileAndPassword(nextarg, &config->cert, &config->key_passwd);
break;
case 'a': /* --cacert CA info PEM file */
GetStr(&config->cacert, nextarg);
err = getstr(&config->cacert, nextarg, DENY_BLANK);
break;
case 'G': /* --ca-native */
config->native_ca_store = toggle;
@ -1893,43 +1904,43 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->proxy_native_ca_store = toggle;
break;
case 'b': /* cert file type */
GetStr(&config->cert_type, nextarg);
err = getstr(&config->cert_type, nextarg, DENY_BLANK);
break;
case 'c': /* private key file */
GetStr(&config->key, nextarg);
err = getstr(&config->key, nextarg, DENY_BLANK);
break;
case 'd': /* private key file type */
GetStr(&config->key_type, nextarg);
err = getstr(&config->key_type, nextarg, DENY_BLANK);
break;
case 'e': /* private key passphrase */
GetStr(&config->key_passwd, nextarg);
err = getstr(&config->key_passwd, nextarg, DENY_BLANK);
cleanarg(clearthis);
break;
case 'f': /* crypto engine */
GetStr(&config->engine, nextarg);
if(config->engine && curl_strequal(config->engine, "list")) {
err = getstr(&config->engine, nextarg, DENY_BLANK);
if(!err &&
config->engine && curl_strequal(config->engine, "list")) {
err = PARAM_ENGINES_REQUESTED;
break;
}
break;
case 'g': /* CA cert directory */
GetStr(&config->capath, nextarg);
err = getstr(&config->capath, nextarg, DENY_BLANK);
break;
case 'h': /* --pubkey public key file */
GetStr(&config->pubkey, nextarg);
err = getstr(&config->pubkey, nextarg, DENY_BLANK);
break;
case 'i': /* --hostpubmd5 md5 of the host public key */
GetStr(&config->hostpubmd5, nextarg);
if(!config->hostpubmd5 || strlen(config->hostpubmd5) != 32) {
err = PARAM_BAD_USE;
break;
err = getstr(&config->hostpubmd5, nextarg, DENY_BLANK);
if(!err) {
if(!config->hostpubmd5 || strlen(config->hostpubmd5) != 32)
err = PARAM_BAD_USE;
}
break;
case 'F': /* --hostpubsha256 sha256 of the host public key */
GetStr(&config->hostpubsha256, nextarg);
err = getstr(&config->hostpubsha256, nextarg, DENY_BLANK);
break;
case 'j': /* CRL file */
GetStr(&config->crlfile, nextarg);
err = getstr(&config->crlfile, nextarg, DENY_BLANK);
break;
case 'k': /* TLS username */
if(!feature_tls_srp) {
@ -1937,7 +1948,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->tls_username, nextarg);
err = getstr(&config->tls_username, nextarg, DENY_BLANK);
cleanarg(clearthis);
break;
case 'l': /* TLS password */
@ -1946,7 +1957,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->tls_password, nextarg);
err = getstr(&config->tls_password, nextarg, ALLOW_BLANK);
cleanarg(clearthis);
break;
case 'm': /* TLS authentication type */
@ -1954,11 +1965,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->tls_authtype, nextarg);
if(!curl_strequal(config->tls_authtype, "SRP")) {
err = getstr(&config->tls_authtype, nextarg, DENY_BLANK);
if(!err && !curl_strequal(config->tls_authtype, "SRP"))
err = PARAM_LIBCURL_DOESNT_SUPPORT; /* only support TLS-SRP */
break;
}
break;
case 'n': /* no empty SSL fragments, --ssl-allow-beast */
if(feature_ssl)
@ -1976,11 +1985,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'p': /* Pinned public key DER file */
GetStr(&config->pinnedpubkey, nextarg);
err = getstr(&config->pinnedpubkey, nextarg, DENY_BLANK);
break;
case 'P': /* proxy pinned public key */
GetStr(&config->proxy_pinnedpubkey, nextarg);
err = getstr(&config->proxy_pinnedpubkey, nextarg, DENY_BLANK);
break;
case 'q': /* --cert-status */
@ -2015,7 +2024,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->proxy_tls_username, nextarg);
err = getstr(&config->proxy_tls_username, nextarg, ALLOW_BLANK);
break;
case 'v': /* TLS password for proxy */
@ -2024,7 +2033,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->proxy_tls_password, nextarg);
err = getstr(&config->proxy_tls_password, nextarg, DENY_BLANK);
break;
case 'w': /* TLS authentication type for proxy */
@ -2032,11 +2041,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
}
GetStr(&config->proxy_tls_authtype, nextarg);
if(!curl_strequal(config->proxy_tls_authtype, "SRP")) {
err = getstr(&config->proxy_tls_authtype, nextarg, DENY_BLANK);
if(!err && !curl_strequal(config->proxy_tls_authtype, "SRP"))
err = PARAM_LIBCURL_DOESNT_SUPPORT; /* only support TLS-SRP */
break;
}
break;
case 'x': /* certificate file for proxy */
@ -2046,28 +2053,28 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'y': /* cert file type for proxy */
GetStr(&config->proxy_cert_type, nextarg);
err = getstr(&config->proxy_cert_type, nextarg, DENY_BLANK);
break;
case 'z': /* private key file for proxy */
GetStr(&config->proxy_key, nextarg);
err = getstr(&config->proxy_key, nextarg, ALLOW_BLANK);
break;
case '0': /* private key file type for proxy */
GetStr(&config->proxy_key_type, nextarg);
err = getstr(&config->proxy_key_type, nextarg, DENY_BLANK);
break;
case '1': /* private key passphrase for proxy */
GetStr(&config->proxy_key_passwd, nextarg);
err = getstr(&config->proxy_key_passwd, nextarg, ALLOW_BLANK);
cleanarg(clearthis);
break;
case '2': /* ciphers for proxy */
GetStr(&config->proxy_cipher_list, nextarg);
err = getstr(&config->proxy_cipher_list, nextarg, DENY_BLANK);
break;
case '3': /* CRL file for proxy */
GetStr(&config->proxy_crlfile, nextarg);
err = getstr(&config->proxy_crlfile, nextarg, DENY_BLANK);
break;
case '4': /* no empty SSL fragments for proxy */
@ -2076,15 +2083,15 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case '5': /* --login-options */
GetStr(&config->login_options, nextarg);
err = getstr(&config->login_options, nextarg, ALLOW_BLANK);
break;
case '6': /* CA info PEM file for proxy */
GetStr(&config->proxy_cacert, nextarg);
err = getstr(&config->proxy_cacert, nextarg, DENY_BLANK);
break;
case '7': /* CA cert directory for proxy */
GetStr(&config->proxy_capath, nextarg);
err = getstr(&config->proxy_capath, nextarg, DENY_BLANK);
break;
case '8': /* allow insecure SSL connects for proxy */
@ -2113,15 +2120,15 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'C':
GetStr(&config->etag_save_file, nextarg);
err = getstr(&config->etag_save_file, nextarg, DENY_BLANK);
break;
case 'D':
GetStr(&config->etag_compare_file, nextarg);
err = getstr(&config->etag_compare_file, nextarg, DENY_BLANK);
break;
case 'E':
GetStr(&config->ssl_ec_curves, nextarg);
err = getstr(&config->ssl_ec_curves, nextarg, DENY_BLANK);
break;
default: /* unknown flag */
@ -2181,7 +2188,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'G': /* HTTP GET */
if(subletter == 'a') { /* --request-target */
GetStr(&config->request_target, nextarg);
err = getstr(&config->request_target, nextarg, DENY_BLANK);
}
else
config->use_httpget = toggle;
@ -2310,7 +2317,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->netrc_opt = toggle;
break;
case 'e': /* netrc-file */
GetStr(&config->netrc_file, nextarg);
err = getstr(&config->netrc_file, nextarg, DENY_BLANK);
break;
default:
/* pick info from .netrc, if this is used for http, curl will
@ -2330,7 +2337,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
}
else if(subletter == 'b') { /* --output-dir */
GetStr(&config->output_dir, nextarg);
err = getstr(&config->output_dir, nextarg, DENY_BLANK);
break;
}
else if(subletter == 'c') { /* --clobber / --no-clobber */
@ -2340,8 +2347,6 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
FALLTHROUGH();
case 'o': /* --output */
/* output file */
{
struct getout *url;
if(!config->url_out)
config->url_out = config->url_list;
if(config->url_out) {
@ -2370,12 +2375,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
/* fill in the outfile */
if('o' == letter) {
if(!*nextarg) {
warnf(global, "output file name has no length");
err = PARAM_BAD_USE;
break;
}
GetStr(&url->outfile, nextarg);
err = getstr(&url->outfile, nextarg, DENY_BLANK);
url->flags &= ~GETOUT_USEREMOTE; /* switch off */
}
else {
@ -2386,15 +2386,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
url->flags &= ~GETOUT_USEREMOTE; /* switch off */
}
url->flags |= GETOUT_OUTFILE;
}
break;
break;
case 'P':
/* This makes the FTP sessions use PORT instead of PASV */
/* use <eth0> or <192.168.10.10> style addresses. Anything except
this will make us try to get the "default" address.
NOTE: this is a changed behavior since the released 4.1!
*/
GetStr(&config->ftpport, nextarg);
err = getstr(&config->ftpport, nextarg, DENY_BLANK);
break;
case 'p':
/* proxy tunnel for non-http protocols */
@ -2459,7 +2458,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
}
tmp_range++;
}
GetStr(&config->range, nextarg);
err = getstr(&config->range, nextarg, DENY_BLANK);
}
break;
case 'R':
@ -2478,8 +2477,6 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'T':
/* we are uploading */
{
struct getout *url;
if(!config->url_ul)
config->url_ul = config->url_list;
if(config->url_ul) {
@ -2508,18 +2505,17 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
url->flags |= GETOUT_NOUPLOAD;
else {
/* "-" equals stdin, but keep the string around for now */
GetStr(&url->infile, nextarg);
err = getstr(&url->infile, nextarg, DENY_BLANK);
}
}
break;
break;
case 'u':
/* user:password */
GetStr(&config->userpwd, nextarg);
err = getstr(&config->userpwd, nextarg, ALLOW_BLANK);
cleanarg(clearthis);
break;
case 'U':
/* Proxy user:password */
GetStr(&config->proxyuserpwd, nextarg);
err = getstr(&config->proxyuserpwd, nextarg, ALLOW_BLANK);
cleanarg(clearthis);
break;
case 'v':
@ -2527,14 +2523,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
/* the '%' thing here will cause the trace get sent to stderr */
Curl_safefree(global->trace_dump);
global->trace_dump = strdup("%");
if(!global->trace_dump) {
if(!global->trace_dump)
err = PARAM_NO_MEM;
break;
else {
if(global->tracetype && (global->tracetype != TRACE_PLAIN))
warnf(global,
"-v, --verbose overrides an earlier trace/verbose option");
global->tracetype = TRACE_PLAIN;
}
if(global->tracetype && (global->tracetype != TRACE_PLAIN))
warnf(global,
"-v, --verbose overrides an earlier trace/verbose option");
global->tracetype = TRACE_PLAIN;
}
else
/* verbose is disabled here */
@ -2578,16 +2574,16 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
warnf(global, "Failed to read %s", fname);
}
else
GetStr(&config->writeout, nextarg);
err = getstr(&config->writeout, nextarg, DENY_BLANK);
break;
case 'x':
switch(subletter) {
case 'a': /* --preproxy */
GetStr(&config->preproxy, nextarg);
err = getstr(&config->preproxy, nextarg, DENY_BLANK);
break;
default:
/* --proxy */
GetStr(&config->proxy, nextarg);
err = getstr(&config->proxy, nextarg, ALLOW_BLANK);
if(config->proxyver != CURLPROXY_HTTPS2)
config->proxyver = CURLPROXY_HTTP;
break;
@ -2595,7 +2591,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'X':
/* set custom request */
GetStr(&config->customrequest, nextarg);
err = getstr(&config->customrequest, nextarg, DENY_BLANK);
break;
case 'y':
/* low speed time */

@ -49,6 +49,7 @@ typedef enum {
PARAM_CONTDISP_RESUME_FROM, /* --continue-at and --remote-header-name */
PARAM_READ_ERROR,
PARAM_EXPAND_ERROR, /* --expand problem */
PARAM_BLANK_STRING,
PARAM_LAST
} ParameterError;

@ -78,6 +78,8 @@ const char *param2text(int res)
return "error encountered when reading a file";
case PARAM_EXPAND_ERROR:
return "variable expansion failure";
case PARAM_BLANK_STRING:
return "blank argument where content is expected";
default:
return "unknown error";
}

@ -134,6 +134,8 @@ static ParameterError getnum(long *val, const char *str, int base)
if(str) {
char *endptr = NULL;
long num;
if(!str[0])
return PARAM_BLANK_STRING;
errno = 0;
num = strtol(str, &endptr, base);
if(errno == ERANGE)