Resolves: CVE-2023-28322 - unify the upload/method handling
This commit is contained in:
		
							parent
							
								
									40387c061f
								
							
						
					
					
						commit
						d0d9c1f19b
					
				
							
								
								
									
										420
									
								
								0030-curl-7.76.1-CVE-2023-28322.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										420
									
								
								0030-curl-7.76.1-CVE-2023-28322.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,420 @@ | |||||||
|  | From 47f0d37bfc008c088416f3dcca802c9e087d9bf1 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Daniel Stenberg <daniel@haxx.se> | ||||||
|  | Date: Tue, 25 Apr 2023 08:28:01 +0200 | ||||||
|  | Subject: [PATCH] lib: unify the upload/method handling | ||||||
|  | 
 | ||||||
|  | By making sure we set state.upload based on the set.method value and not | ||||||
|  | independently as set.upload, we reduce confusion and mixup risks, both | ||||||
|  | internally and externally. | ||||||
|  | ---
 | ||||||
|  |  lib/curl_rtmp.c    | 4 ++-- | ||||||
|  |  lib/file.c         | 4 ++-- | ||||||
|  |  lib/ftp.c          | 8 ++++---- | ||||||
|  |  lib/http.c         | 4 ++-- | ||||||
|  |  lib/imap.c         | 6 +++--- | ||||||
|  |  lib/rtsp.c         | 4 ++-- | ||||||
|  |  lib/setopt.c       | 6 ++---- | ||||||
|  |  lib/smb.c          | 6 +++--- | ||||||
|  |  lib/smtp.c         | 4 ++-- | ||||||
|  |  lib/tftp.c         | 8 ++++---- | ||||||
|  |  lib/transfer.c     | 4 ++-- | ||||||
|  |  lib/urldata.h      | 2 +- | ||||||
|  |  lib/vssh/libssh.c  | 6 +++--- | ||||||
|  |  lib/vssh/libssh2.c | 6 +++--- | ||||||
|  |  lib/vssh/wolfssh.c | 2 +- | ||||||
|  |  15 files changed, 36 insertions(+), 38 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c
 | ||||||
|  | index 2679a2cdc1afe..406fb42ac0f44 100644
 | ||||||
|  | --- a/lib/curl_rtmp.c
 | ||||||
|  | +++ b/lib/curl_rtmp.c
 | ||||||
|  | @@ -231,7 +231,7 @@ static CURLcode rtmp_connect(struct Curl_easy *data, bool *done)
 | ||||||
|  |    /* We have to know if it's a write before we send the | ||||||
|  |     * connect request packet | ||||||
|  |     */ | ||||||
|  | -  if(data->set.upload)
 | ||||||
|  | +  if(data->state.upload)
 | ||||||
|  |      r->Link.protocol |= RTMP_FEATURE_WRITE; | ||||||
|  |   | ||||||
|  |    /* For plain streams, use the buffer toggle trick to keep data flowing */ | ||||||
|  | @@ -263,7 +263,7 @@ static CURLcode rtmp_do(struct Curl_easy *data, bool *done)
 | ||||||
|  |    if(!RTMP_ConnectStream(r, 0)) | ||||||
|  |      return CURLE_FAILED_INIT; | ||||||
|  |   | ||||||
|  | -  if(data->set.upload) {
 | ||||||
|  | +  if(data->state.upload) {
 | ||||||
|  |      Curl_pgrsSetUploadSize(data, data->state.infilesize); | ||||||
|  |      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET); | ||||||
|  |    } | ||||||
|  | diff --git a/lib/file.c b/lib/file.c
 | ||||||
|  | index 51c5d07ce40ab..c751e8861a99b 100644
 | ||||||
|  | --- a/lib/file.c
 | ||||||
|  | +++ b/lib/file.c
 | ||||||
|  | @@ -240,7 +240,7 @@ static CURLcode file_connect(struct Curl_easy *data, bool *done)
 | ||||||
|  |    file->freepath = real_path; /* free this when done */ | ||||||
|  |   | ||||||
|  |    file->fd = fd; | ||||||
|  | -  if(!data->set.upload && (fd == -1)) {
 | ||||||
|  | +  if(!data->state.upload && (fd == -1)) {
 | ||||||
|  |      failf(data, "Couldn't open file %s", data->state.up.path); | ||||||
|  |      file_done(data, CURLE_FILE_COULDNT_READ_FILE, FALSE); | ||||||
|  |      return CURLE_FILE_COULDNT_READ_FILE; | ||||||
|  | @@ -422,7 +422,7 @@ static CURLcode file_do(struct Curl_easy *data, bool *done)
 | ||||||
|  |   | ||||||
|  |    Curl_pgrsStartNow(data); | ||||||
|  |   | ||||||
|  | -  if(data->set.upload)
 | ||||||
|  | +  if(data->state.upload)
 | ||||||
|  |      return file_upload(data); | ||||||
|  |   | ||||||
|  |    file = data->req.p.file; | ||||||
|  | diff --git a/lib/ftp.c b/lib/ftp.c
 | ||||||
|  | index f50d7baf622f8..4ff68cc454cbc 100644
 | ||||||
|  | --- a/lib/ftp.c
 | ||||||
|  | +++ b/lib/ftp.c
 | ||||||
|  | @@ -1381,7 +1381,7 @@ static CURLcode ftp_state_prepare_transfer(struct Curl_easy *data)
 | ||||||
|  |                                 data->set.str[STRING_CUSTOMREQUEST]? | ||||||
|  |                                 data->set.str[STRING_CUSTOMREQUEST]: | ||||||
|  |                                 (data->state.list_only?"NLST":"LIST")); | ||||||
|  | -      else if(data->set.upload)
 | ||||||
|  | +      else if(data->state.upload)
 | ||||||
|  |          result = Curl_pp_sendf(data, &ftpc->pp, "PRET STOR %s", | ||||||
|  |                                 conn->proto.ftpc.file); | ||||||
|  |        else | ||||||
|  | @@ -3368,7 +3368,7 @@ static CURLcode ftp_done(struct Curl_easy *data, CURLcode status,
 | ||||||
|  |      /* the response code from the transfer showed an error already so no | ||||||
|  |         use checking further */ | ||||||
|  |      ; | ||||||
|  | -  else if(data->set.upload) {
 | ||||||
|  | +  else if(data->state.upload) {
 | ||||||
|  |      if((-1 != data->state.infilesize) && | ||||||
|  |         (data->state.infilesize != data->req.writebytecount) && | ||||||
|  |         !data->set.crlf && | ||||||
|  | @@ -3640,7 +3640,7 @@ static CURLcode ftp_do_more(struct Curl_easy *data, int *completep)
 | ||||||
|  |                             connected back to us */ | ||||||
|  |        } | ||||||
|  |      } | ||||||
|  | -    else if(data->set.upload) {
 | ||||||
|  | +    else if(data->state.upload) {
 | ||||||
|  |        result = ftp_nb_type(data, conn, data->state.prefer_ascii, | ||||||
|  |                             FTP_STOR_TYPE); | ||||||
|  |        if(result) | ||||||
|  | @@ -4217,7 +4217,7 @@ CURLcode ftp_parse_url_path(struct Curl_easy *data)
 | ||||||
|  |      ftpc->file = NULL; /* instead of point to a zero byte, | ||||||
|  |                              we make it a NULL pointer */ | ||||||
|  |   | ||||||
|  | -  if(data->set.upload && !ftpc->file && (ftp->transfer == PPTRANSFER_BODY)) {
 | ||||||
|  | +  if(data->state.upload && !ftpc->file && (ftp->transfer == PPTRANSFER_BODY)) {
 | ||||||
|  |      /* We need a file name when uploading. Return error! */ | ||||||
|  |      failf(data, "Uploading to a URL without a file name!"); | ||||||
|  |      free(rawPath); | ||||||
|  | diff --git a/lib/http.c b/lib/http.c
 | ||||||
|  | index 80e43f6f361e8..bffdd3468536d 100644
 | ||||||
|  | --- a/lib/http.c
 | ||||||
|  | +++ b/lib/http.c
 | ||||||
|  | @@ -2112,7 +2112,7 @@ void Curl_http_method(struct Curl_easy *data, struct connectdata *conn,
 | ||||||
|  |    Curl_HttpReq httpreq = data->state.httpreq; | ||||||
|  |    const char *request; | ||||||
|  |    if((conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_FTP)) && | ||||||
|  | -     data->set.upload)
 | ||||||
|  | +     data->state.upload)
 | ||||||
|  |      httpreq = HTTPREQ_PUT; | ||||||
|  |   | ||||||
|  |    /* Now set the 'request' pointer to the proper request string */ | ||||||
|  | @@ -2423,7 +2423,7 @@ CURLcode Curl_http_body(struct Curl_easy *data, struct connectdata *conn,
 | ||||||
|  |      if((conn->handler->protocol & PROTO_FAMILY_HTTP) && | ||||||
|  |         (((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) && | ||||||
|  |           http->postsize < 0) || | ||||||
|  | -        ((data->set.upload || httpreq == HTTPREQ_POST) &&
 | ||||||
|  | +        ((data->state.upload || httpreq == HTTPREQ_POST) &&
 | ||||||
|  |           data->state.infilesize == -1))) { | ||||||
|  |        if(conn->bits.authneg) | ||||||
|  |          /* don't enable chunked during auth neg */ | ||||||
|  | diff --git a/lib/imap.c b/lib/imap.c
 | ||||||
|  | index c2f675d4b2618..1952e66a1efcd 100644
 | ||||||
|  | --- a/lib/imap.c
 | ||||||
|  | +++ b/lib/imap.c
 | ||||||
|  | @@ -1511,11 +1511,11 @@ static CURLcode imap_done(struct Curl_easy *data, CURLcode status,
 | ||||||
|  |      result = status;         /* use the already set error code */ | ||||||
|  |    } | ||||||
|  |    else if(!data->set.connect_only && !imap->custom && | ||||||
|  | -          (imap->uid || imap->mindex || data->set.upload ||
 | ||||||
|  | +          (imap->uid || imap->mindex || data->state.upload ||
 | ||||||
|  |            data->set.mimepost.kind != MIMEKIND_NONE)) { | ||||||
|  |      /* Handle responses after FETCH or APPEND transfer has finished */ | ||||||
|  |   | ||||||
|  | -    if(!data->set.upload && data->set.mimepost.kind == MIMEKIND_NONE)
 | ||||||
|  | +    if(!data->state.upload && data->set.mimepost.kind == MIMEKIND_NONE)
 | ||||||
|  |        state(data, IMAP_FETCH_FINAL); | ||||||
|  |      else { | ||||||
|  |        /* End the APPEND command first by sending an empty line */ | ||||||
|  | @@ -1581,7 +1581,7 @@ static CURLcode imap_perform(struct Curl_easy *data, bool *connected,
 | ||||||
|  |      selected = TRUE; | ||||||
|  |   | ||||||
|  |    /* Start the first command in the DO phase */ | ||||||
|  | -  if(data->set.upload || data->set.mimepost.kind != MIMEKIND_NONE)
 | ||||||
|  | +  if(data->state.upload || data->set.mimepost.kind != MIMEKIND_NONE)
 | ||||||
|  |      /* APPEND can be executed directly */ | ||||||
|  |      result = imap_perform_append(data); | ||||||
|  |    else if(imap->custom && (selected || !imap->mailbox)) | ||||||
|  | diff --git a/lib/rtsp.c b/lib/rtsp.c
 | ||||||
|  | index ea99d720ec4eb..ccd7264b00e74 100644
 | ||||||
|  | --- a/lib/rtsp.c
 | ||||||
|  | +++ b/lib/rtsp.c
 | ||||||
|  | @@ -493,7 +493,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
 | ||||||
|  |       rtspreq == RTSPREQ_SET_PARAMETER || | ||||||
|  |       rtspreq == RTSPREQ_GET_PARAMETER) { | ||||||
|  |   | ||||||
|  | -    if(data->set.upload) {
 | ||||||
|  | +    if(data->state.upload) {
 | ||||||
|  |        putsize = data->state.infilesize; | ||||||
|  |        data->state.httpreq = HTTPREQ_PUT; | ||||||
|  |   | ||||||
|  | @@ -512,7 +512,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
 | ||||||
|  |          result = | ||||||
|  |            Curl_dyn_addf(&req_buffer, | ||||||
|  |                          "Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n", | ||||||
|  | -                        (data->set.upload ? putsize : postsize));
 | ||||||
|  | +                        (data->state.upload ? putsize : postsize));
 | ||||||
|  |          if(result) | ||||||
|  |            return result; | ||||||
|  |        } | ||||||
|  | diff --git a/lib/setopt.c b/lib/setopt.c
 | ||||||
|  | index 38f5711e44191..0c3b9634d1192 100644
 | ||||||
|  | --- a/lib/setopt.c
 | ||||||
|  | +++ b/lib/setopt.c
 | ||||||
|  | @@ -333,8 +333,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
 | ||||||
|  |       * We want to sent data to the remote host. If this is HTTP, that equals | ||||||
|  |       * using the PUT request. | ||||||
|  |       */ | ||||||
|  | -    data->set.upload = (0 != va_arg(param, long)) ? TRUE : FALSE;
 | ||||||
|  | -    if(data->set.upload) {
 | ||||||
|  | +    arg = va_arg(param, long);
 | ||||||
|  | +    if(arg) {
 | ||||||
|  |        /* If this is HTTP, PUT is what's needed to "upload" */ | ||||||
|  |        data->set.method = HTTPREQ_PUT; | ||||||
|  |        data->set.opt_no_body = FALSE; /* this is implied */ | ||||||
|  | @@ -628,7 +628,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
 | ||||||
|  |      } | ||||||
|  |      else | ||||||
|  |        data->set.method = HTTPREQ_GET; | ||||||
|  | -    data->set.upload = FALSE;
 | ||||||
|  |      break; | ||||||
|  |   | ||||||
|  |    case CURLOPT_HTTPPOST: | ||||||
|  | @@ -888,7 +887,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
 | ||||||
|  |       */ | ||||||
|  |      if(va_arg(param, long)) { | ||||||
|  |        data->set.method = HTTPREQ_GET; | ||||||
|  | -      data->set.upload = FALSE; /* switch off upload */
 | ||||||
|  |        data->set.opt_no_body = FALSE; /* this is implied */ | ||||||
|  |      } | ||||||
|  |      break; | ||||||
|  | diff --git a/lib/smb.c b/lib/smb.c
 | ||||||
|  | index a1e444ee6b97e..d6822213529bc 100644
 | ||||||
|  | --- a/lib/smb.c
 | ||||||
|  | +++ b/lib/smb.c
 | ||||||
|  | @@ -530,7 +530,7 @@ static CURLcode smb_send_open(struct Curl_easy *data)
 | ||||||
|  |    byte_count = strlen(req->path); | ||||||
|  |    msg.name_length = smb_swap16((unsigned short)byte_count); | ||||||
|  |    msg.share_access = smb_swap32(SMB_FILE_SHARE_ALL); | ||||||
|  | -  if(data->set.upload) {
 | ||||||
|  | +  if(data->state.upload) {
 | ||||||
|  |      msg.access = smb_swap32(SMB_GENERIC_READ | SMB_GENERIC_WRITE); | ||||||
|  |      msg.create_disposition = smb_swap32(SMB_FILE_OVERWRITE_IF); | ||||||
|  |    } | ||||||
|  | @@ -813,7 +813,7 @@ static CURLcode smb_request_state(struct Curl_easy *data, bool *done)
 | ||||||
|  |      smb_m = (const struct smb_nt_create_response*) msg; | ||||||
|  |      req->fid = smb_swap16(smb_m->fid); | ||||||
|  |      data->req.offset = 0; | ||||||
|  | -    if(data->set.upload) {
 | ||||||
|  | +    if(data->state.upload) {
 | ||||||
|  |        data->req.size = data->state.infilesize; | ||||||
|  |        Curl_pgrsSetUploadSize(data, data->req.size); | ||||||
|  |        next_state = SMB_UPLOAD; | ||||||
|  | diff --git a/lib/smtp.c b/lib/smtp.c
 | ||||||
|  | index 7a030308d4689..c182cace742d7 100644
 | ||||||
|  | --- a/lib/smtp.c
 | ||||||
|  | +++ b/lib/smtp.c
 | ||||||
|  | @@ -1419,7 +1419,7 @@ static CURLcode smtp_done(struct Curl_easy *data, CURLcode status,
 | ||||||
|  |      result = status;         /* use the already set error code */ | ||||||
|  |    } | ||||||
|  |    else if(!data->set.connect_only && data->set.mail_rcpt && | ||||||
|  | -          (data->set.upload || data->set.mimepost.kind)) {
 | ||||||
|  | +          (data->state.upload || data->set.mimepost.kind)) {
 | ||||||
|  |      /* Calculate the EOB taking into account any terminating CRLF from the | ||||||
|  |         previous line of the email or the CRLF of the DATA command when there | ||||||
|  |         is "no mail data". RFC-5321, sect. 4.1.1.4. | ||||||
|  | @@ -1511,7 +1511,7 @@ static CURLcode smtp_perform(struct Curl_easy *data, bool *connected,
 | ||||||
|  |    smtp->eob = 2; | ||||||
|  |   | ||||||
|  |    /* Start the first command in the DO phase */ | ||||||
|  | -  if((data->set.upload || data->set.mimepost.kind) && data->set.mail_rcpt)
 | ||||||
|  | +  if((data->state.upload || data->set.mimepost.kind) && data->set.mail_rcpt)
 | ||||||
|  |      /* MAIL transfer */ | ||||||
|  |      result = smtp_perform_mail(data); | ||||||
|  |    else | ||||||
|  | diff --git a/lib/tftp.c b/lib/tftp.c
 | ||||||
|  | index 164d3c723c5b9..8ed1b887b4d21 100644
 | ||||||
|  | --- a/lib/tftp.c
 | ||||||
|  | +++ b/lib/tftp.c
 | ||||||
|  | @@ -370,7 +370,7 @@ static CURLcode tftp_parse_option_ack(struct tftp_state_data *state,
 | ||||||
|  |   | ||||||
|  |        /* tsize should be ignored on upload: Who cares about the size of the | ||||||
|  |           remote file? */ | ||||||
|  | -      if(!data->set.upload) {
 | ||||||
|  | +      if(!data->state.upload) {
 | ||||||
|  |          if(!tsize) { | ||||||
|  |            failf(data, "invalid tsize -:%s:- value in OACK packet", value); | ||||||
|  |            return CURLE_TFTP_ILLEGAL; | ||||||
|  | @@ -451,7 +451,7 @@ static CURLcode tftp_send_first(struct tftp_state_data *state,
 | ||||||
|  |        return result; | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | -    if(data->set.upload) {
 | ||||||
|  | +    if(data->state.upload) {
 | ||||||
|  |        /* If we are uploading, send an WRQ */ | ||||||
|  |        setpacketevent(&state->spacket, TFTP_EVENT_WRQ); | ||||||
|  |        state->data->req.upload_fromhere = | ||||||
|  | @@ -486,7 +486,7 @@ static CURLcode tftp_send_first(struct tftp_state_data *state,
 | ||||||
|  |      if(!data->set.tftp_no_options) { | ||||||
|  |        char buf[64]; | ||||||
|  |        /* add tsize option */ | ||||||
|  | -      if(data->set.upload && (data->state.infilesize != -1))
 | ||||||
|  | +      if(data->state.upload && (data->state.infilesize != -1))
 | ||||||
|  |          msnprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T, | ||||||
|  |                    data->state.infilesize); | ||||||
|  |        else | ||||||
|  | @@ -540,7 +540,7 @@ static CURLcode tftp_send_first(struct tftp_state_data *state,
 | ||||||
|  |      break; | ||||||
|  |   | ||||||
|  |    case TFTP_EVENT_OACK: | ||||||
|  | -    if(data->set.upload) {
 | ||||||
|  | +    if(data->state.upload) {
 | ||||||
|  |        result = tftp_connect_for_tx(state, event); | ||||||
|  |      } | ||||||
|  |      else { | ||||||
|  | diff --git a/lib/transfer.c b/lib/transfer.c
 | ||||||
|  | index e9ab8fbf09510..cb69f3365855a 100644
 | ||||||
|  | --- a/lib/transfer.c
 | ||||||
|  | +++ b/lib/transfer.c
 | ||||||
|  | @@ -1293,6 +1293,7 @@ void Curl_init_CONNECT(struct Curl_easy *data)
 | ||||||
|  |  { | ||||||
|  |    data->state.fread_func = data->set.fread_func_set; | ||||||
|  |    data->state.in = data->set.in_set; | ||||||
|  | +  data->state.upload = (data->state.httpreq == HTTPREQ_PUT);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | @@ -1801,7 +1801,6 @@ CURLcode Curl_follow(struct Curl_easy *data,
 | ||||||
|  |           data->state.httpreq != HTTPREQ_POST_MIME) || | ||||||
|  |          !(data->set.keep_post & CURL_REDIR_POST_303))) { | ||||||
|  |        data->state.httpreq = HTTPREQ_GET; | ||||||
|  | -      data->set.upload = false;
 | ||||||
|  |        infof(data, "Switch to %s\n", | ||||||
|  |              data->set.opt_no_body?"HEAD":"GET"); | ||||||
|  |      } | ||||||
|  | @@ -1770,7 +1770,7 @@ CURLcode Curl_retry_request(struct Curl_easy *data, char **url)
 | ||||||
|  |   | ||||||
|  |    /* if we're talking upload, we can't do the checks below, unless the protocol | ||||||
|  |       is HTTP as when uploading over HTTP we will still get a response */ | ||||||
|  | -  if(data->set.upload &&
 | ||||||
|  | +  if(data->state.upload &&
 | ||||||
|  |       !(conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_RTSP))) | ||||||
|  |      return CURLE_OK; | ||||||
|  |   | ||||||
|  | diff --git a/lib/urldata.h b/lib/urldata.h
 | ||||||
|  | index cca992a0295aa..a8580bdb66fe8 100644
 | ||||||
|  | --- a/lib/urldata.h
 | ||||||
|  | +++ b/lib/urldata.h
 | ||||||
|  | @@ -1494,6 +1494,7 @@ struct UrlState {
 | ||||||
|  |    BIT(url_alloc);   /* URL string is malloc()'ed */ | ||||||
|  |    BIT(referer_alloc); /* referer string is malloc()ed */ | ||||||
|  |    BIT(wildcard_resolve); /* Set to true if any resolve change is a wildcard */ | ||||||
|  | +  BIT(upload);         /* upload request */
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | @@ -1838,7 +1839,6 @@ struct UserDefined {
 | ||||||
|  |    BIT(http_auto_referer); /* set "correct" referer when following | ||||||
|  |                               location: */ | ||||||
|  |    BIT(opt_no_body);    /* as set with CURLOPT_NOBODY */ | ||||||
|  | -  BIT(upload);         /* upload request */
 | ||||||
|  |    BIT(verbose);        /* output verbosity */ | ||||||
|  |    BIT(krb);            /* Kerberos connection requested */ | ||||||
|  |    BIT(reuse_forbid);   /* forbidden to be reused, close after use */ | ||||||
|  | diff --git a/lib/vssh/libssh.c b/lib/vssh/libssh.c
 | ||||||
|  | index b31f741ba9492..d60edaa303642 100644
 | ||||||
|  | --- a/lib/vssh/libssh.c
 | ||||||
|  | +++ b/lib/vssh/libssh.c
 | ||||||
|  | @@ -1209,7 +1209,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      case SSH_SFTP_TRANS_INIT: | ||||||
|  | -      if(data->set.upload)
 | ||||||
|  | +      if(data->state.upload)
 | ||||||
|  |          state(data, SSH_SFTP_UPLOAD_INIT); | ||||||
|  |        else { | ||||||
|  |          if(protop->path[strlen(protop->path)-1] == '/') | ||||||
|  | @@ -1802,7 +1802,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |        /* Functions from the SCP subsystem cannot handle/return SSH_AGAIN */ | ||||||
|  |        ssh_set_blocking(sshc->ssh_session, 1); | ||||||
|  |   | ||||||
|  | -      if(data->set.upload) {
 | ||||||
|  | +      if(data->state.upload) {
 | ||||||
|  |          if(data->state.infilesize < 0) { | ||||||
|  |            failf(data, "SCP requires a known file size for upload"); | ||||||
|  |            sshc->actualcode = CURLE_UPLOAD_FAILED; | ||||||
|  | @@ -1907,7 +1907,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |          break; | ||||||
|  |        } | ||||||
|  |      case SSH_SCP_DONE: | ||||||
|  | -      if(data->set.upload)
 | ||||||
|  | +      if(data->state.upload)
 | ||||||
|  |          state(data, SSH_SCP_SEND_EOF); | ||||||
|  |        else | ||||||
|  |          state(data, SSH_SCP_CHANNEL_FREE); | ||||||
|  | diff --git a/lib/vssh/libssh2.c b/lib/vssh/libssh2.c
 | ||||||
|  | index f1154dc47a74e..f2e5352d1fd3a 100644
 | ||||||
|  | --- a/lib/vssh/libssh2.c
 | ||||||
|  | +++ b/lib/vssh/libssh2.c
 | ||||||
|  | @@ -2019,7 +2019,7 @@ static CURLcode ssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      case SSH_SFTP_TRANS_INIT: | ||||||
|  | -      if(data->set.upload)
 | ||||||
|  | +      if(data->state.upload)
 | ||||||
|  |          state(data, SSH_SFTP_UPLOAD_INIT); | ||||||
|  |        else { | ||||||
|  |          if(sshp->path[strlen(sshp->path)-1] == '/') | ||||||
|  | @@ -2691,7 +2691,7 @@ static CURLcode ssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |          break; | ||||||
|  |        } | ||||||
|  |   | ||||||
|  | -      if(data->set.upload) {
 | ||||||
|  | +      if(data->state.upload) {
 | ||||||
|  |          if(data->state.infilesize < 0) { | ||||||
|  |            failf(data, "SCP requires a known file size for upload"); | ||||||
|  |            sshc->actualcode = CURLE_UPLOAD_FAILED; | ||||||
|  | @@ -2831,7 +2831,7 @@ static CURLcode ssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |      break; | ||||||
|  |   | ||||||
|  |      case SSH_SCP_DONE: | ||||||
|  | -      if(data->set.upload)
 | ||||||
|  | +      if(data->state.upload)
 | ||||||
|  |          state(data, SSH_SCP_SEND_EOF); | ||||||
|  |        else | ||||||
|  |          state(data, SSH_SCP_CHANNEL_FREE); | ||||||
|  | diff --git a/lib/vssh/wolfssh.c b/lib/vssh/wolfssh.c
 | ||||||
|  | index 17d59ecd23bc8..2ca91b7363b1d 100644
 | ||||||
|  | --- a/lib/vssh/wolfssh.c
 | ||||||
|  | +++ b/lib/vssh/wolfssh.c
 | ||||||
|  | @@ -557,7 +557,7 @@ static CURLcode wssh_statemach_act(struct Curl_easy *data, bool *block)
 | ||||||
|  |        } | ||||||
|  |        break; | ||||||
|  |      case SSH_SFTP_TRANS_INIT: | ||||||
|  | -      if(data->set.upload)
 | ||||||
|  | +      if(data->state.upload)
 | ||||||
|  |          state(data, SSH_SFTP_UPLOAD_INIT); | ||||||
|  |        else { | ||||||
|  |          if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/') | ||||||
| @ -1,7 +1,7 @@ | |||||||
| Summary: A utility for getting files from remote servers (FTP, HTTP, and others) | Summary: A utility for getting files from remote servers (FTP, HTTP, and others) | ||||||
| Name: curl | Name: curl | ||||||
| Version: 7.76.1 | Version: 7.76.1 | ||||||
| Release: 25%{?dist} | Release: 26%{?dist} | ||||||
| License: MIT | License: MIT | ||||||
| Source: https://curl.se/download/%{name}-%{version}.tar.xz | Source: https://curl.se/download/%{name}-%{version}.tar.xz | ||||||
| 
 | 
 | ||||||
| @ -89,6 +89,9 @@ Patch28:  0028-curl-7.76.1-CVE-2023-27536.patch | |||||||
| # fix SSH connection too eager reuse still (CVE-2023-27538) | # fix SSH connection too eager reuse still (CVE-2023-27538) | ||||||
| Patch29:  0029-curl-7.76.1-CVE-2023-27538.patch | Patch29:  0029-curl-7.76.1-CVE-2023-27538.patch | ||||||
| 
 | 
 | ||||||
|  | # unify the upload/method handling (CVE-2023-28322) | ||||||
|  | Patch30:  0030-curl-7.76.1-CVE-2023-28322.patch | ||||||
|  | 
 | ||||||
| # patch making libcurl multilib ready | # patch making libcurl multilib ready | ||||||
| Patch101: 0101-curl-7.32.0-multilib.patch | Patch101: 0101-curl-7.32.0-multilib.patch | ||||||
| 
 | 
 | ||||||
| @ -292,6 +295,7 @@ be installed. | |||||||
| %patch27 -p1 | %patch27 -p1 | ||||||
| %patch28 -p1 | %patch28 -p1 | ||||||
| %patch29 -p1 | %patch29 -p1 | ||||||
|  | %patch30 -p1 | ||||||
| 
 | 
 | ||||||
| # Fedora patches | # Fedora patches | ||||||
| %patch101 -p1 | %patch101 -p1 | ||||||
| @ -517,6 +521,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la | |||||||
| %{_libdir}/libcurl.so.4.[0-9].[0-9].minimal | %{_libdir}/libcurl.so.4.[0-9].[0-9].minimal | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Mon Jun 12 2023 Jacek Migacz <jmigacz@redhat.com> - 7.76.1-26 | ||||||
|  | - unify the upload/method handling (CVE-2023-28322) | ||||||
|  | 
 | ||||||
| * Wed Apr 12 2023 Kamil Dudka <kdudka@redhat.com> - 7.76.1-25 | * Wed Apr 12 2023 Kamil Dudka <kdudka@redhat.com> - 7.76.1-25 | ||||||
| - adapt the fix of CVE-2023-27535 for RHEL 9 curl | - adapt the fix of CVE-2023-27535 for RHEL 9 curl | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user