libssh: make atime/mtime date overflow return error

Closes #9328
This commit is contained in:
Daniel Stenberg 2022-08-17 10:51:07 +02:00
parent 5357686fdf
commit c988ec9f41
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -2911,47 +2911,34 @@ static void sftp_quote_stat(struct Curl_easy *data)
}
sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
}
else if(strncasecompare(cmd, "atime", 5)) {
else if(strncasecompare(cmd, "atime", 5) ||
strncasecompare(cmd, "mtime", 5)) {
time_t date = Curl_getdate_capped(sshc->quote_path1);
bool fail = FALSE;
if(date == -1) {
failf(data, "incorrect date format for %.*s", 5, cmd);
fail = TRUE;
}
#if SIZEOF_TIME_T > 4
else if(date > 0xffffffff) {
failf(data, "date overflow");
fail = TRUE; /* avoid setting a capped time */
}
#endif
if(fail) {
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
failf(data, "Syntax error: incorrect access date format");
state(data, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
return;
}
#if SIZEOF_TIME_T > 4
if(date > 0xffffffff)
; /* avoid setting a capped time */
else
#endif
{
if(strncasecompare(cmd, "atime", 5))
sshc->quote_attrs->atime = (uint32_t)date;
sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
}
}
else if(strncasecompare(cmd, "mtime", 5)) {
time_t date = Curl_getdate_capped(sshc->quote_path1);
if(date == -1) {
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
failf(data, "Syntax error: incorrect modification date format");
state(data, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
return;
}
#if SIZEOF_TIME_T > 4
if(date > 0xffffffff)
; /* avoid setting a capped time */
else
#endif
{
else /* mtime */
sshc->quote_attrs->mtime = (uint32_t)date;
sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
}
sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
}
/* Now send the completed structure... */