[curl/f15] curl.spec: add a forgotten patch

Kamil Dudka kdudka at fedoraproject.org
Tue Jan 24 12:45:33 UTC 2012


commit c6c0061504803616d87ea345200042a54932591b
Author: Kamil Dudka <kdudka at redhat.com>
Date:   Tue Jan 24 13:32:56 2012 +0100

    curl.spec: add a forgotten patch
    
    ... and a missing module non-ascii.c (so that it compiles again).

 0012-curl-7.21.3-75ca568.patch |  467 +++++++++++++++++++++++++++++++++++++++-
 curl.spec                      |    3 +-
 2 files changed, 462 insertions(+), 8 deletions(-)
---
diff --git a/0012-curl-7.21.3-75ca568.patch b/0012-curl-7.21.3-75ca568.patch
index d928513..626e045 100644
--- a/0012-curl-7.21.3-75ca568.patch
+++ b/0012-curl-7.21.3-75ca568.patch
@@ -1,4 +1,4 @@
-From d86e698610eceb600e83b164cfe94a1498570445 Mon Sep 17 00:00:00 2001
+From f0aed6743ecb954849ee6d3edd2e33a5fcb3f2e7 Mon Sep 17 00:00:00 2001
 From: Daniel Stenberg <daniel at haxx.se>
 Date: Fri, 23 Dec 2011 13:24:16 +0100
 Subject: [PATCH] URL sanitize: reject URLs containing bad data
@@ -22,13 +22,52 @@ Reported by: Dan Fandrich
 
 Signed-off-by: Kamil Dudka <kdudka at redhat.com>
 ---
- lib/escape.c |  100 ++++++++++++++++++++++++++++++++++-----------------------
- lib/escape.h |   10 ++++--
- lib/imap.c   |    7 +---
- lib/pop3.c   |    6 +---
- lib/smtp.c   |    7 ++--
- 5 files changed, 72 insertions(+), 58 deletions(-)
+ lib/Makefile.in  |    2 +-
+ lib/Makefile.inc |    4 +-
+ lib/escape.c     |  100 ++++++++++-------
+ lib/escape.h     |   10 +-
+ lib/imap.c       |    7 +-
+ lib/non-ascii.c  |  339 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ lib/non-ascii.h  |   63 ++++++++++
+ lib/pop3.c       |    6 +-
+ lib/smtp.c       |    7 +-
+ 9 files changed, 477 insertions(+), 61 deletions(-)
+ create mode 100644 lib/non-ascii.c
+ create mode 100644 lib/non-ascii.h
 
+diff --git a/lib/Makefile.in b/lib/Makefile.in
+index a79ee24..2ca5b01 100644
+--- a/lib/Makefile.in
++++ b/lib/Makefile.in
+@@ -91,7 +91,7 @@ am__objects_1 = file.lo timeval.lo base64.lo hostip.lo progress.lo \
+ 	nonblock.lo curl_memrchr.lo imap.lo pop3.lo smtp.lo \
+ 	pingpong.lo rtsp.lo curl_threads.lo warnless.lo hmac.lo \
+ 	polarssl.lo curl_rtmp.lo openldap.lo curl_gethostname.lo \
+-	gopher.lo curl_gssapi.lo
++	gopher.lo curl_gssapi.lo non-ascii.lo
+ am__objects_2 =
+ am_libcurl_la_OBJECTS = $(am__objects_1) $(am__objects_2)
+ libcurl_la_OBJECTS = $(am_libcurl_la_OBJECTS)
+diff --git a/lib/Makefile.inc b/lib/Makefile.inc
+index be13031..f57898f 100644
+--- a/lib/Makefile.inc
++++ b/lib/Makefile.inc
+@@ -21,7 +21,7 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c	\
+   socks_gssapi.c socks_sspi.c curl_sspi.c slist.c nonblock.c		\
+   curl_memrchr.c imap.c pop3.c smtp.c pingpong.c rtsp.c curl_threads.c	\
+   warnless.c hmac.c polarssl.c curl_rtmp.c openldap.c curl_gethostname.c\
+-  gopher.c curl_gssapi.c
++  gopher.c curl_gssapi.c non-ascii.c
+ 
+ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h	\
+   progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h	\
+@@ -36,5 +36,5 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h	\
+   curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h	\
+   curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h	\
+   warnless.h curl_hmac.h polarssl.h curl_rtmp.h curl_gethostname.h      \
+-  gopher.h curl_gssapi.h
++  gopher.h curl_gssapi.h non-ascii.h
+ 
 diff --git a/lib/escape.c b/lib/escape.c
 index 735e1d8..0dd5a1d 100644
 --- a/lib/escape.c
@@ -269,6 +308,420 @@ index 9c39625..c04ad11 100644
  }
  
  /* call this when the DO phase has completed */
+diff --git a/lib/non-ascii.c b/lib/non-ascii.c
+new file mode 100644
+index 0000000..a38680c
+--- /dev/null
++++ b/lib/non-ascii.c
+@@ -0,0 +1,339 @@
++/***************************************************************************
++ *                                  _   _ ____  _
++ *  Project                     ___| | | |  _ \| |
++ *                             / __| | | | |_) | |
++ *                            | (__| |_| |  _ <| |___
++ *                             \___|\___/|_| \_\_____|
++ *
++ * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel at haxx.se>, et al.
++ *
++ * This software is licensed as described in the file COPYING, which
++ * you should have received as part of this distribution. The terms
++ * are also available at http://curl.haxx.se/docs/copyright.html.
++ *
++ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
++ * copies of the Software, and permit persons to whom the Software is
++ * furnished to do so, under the terms of the COPYING file.
++ *
++ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
++ * KIND, either express or implied.
++ *
++ ***************************************************************************/
++
++#include "setup.h"
++
++#ifdef CURL_DOES_CONVERSIONS
++
++#include "non-ascii.h"
++#include "formdata.h"
++#include "sendf.h"
++#include "urldata.h"
++
++#include <curl/curl.h>
++
++#ifdef HAVE_ICONV
++#include <iconv.h>
++/* set default codesets for iconv */
++#ifndef CURL_ICONV_CODESET_OF_NETWORK
++#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1"
++#endif
++#ifndef CURL_ICONV_CODESET_FOR_UTF8
++#define CURL_ICONV_CODESET_FOR_UTF8   "UTF-8"
++#endif
++#define ICONV_ERROR  (size_t)-1
++#endif /* HAVE_ICONV */
++
++/*
++ * Curl_convert_clone() returns a malloced copy of the source string (if
++ * returning CURLE_OK), with the data converted to network format.
++ */
++CURLcode Curl_convert_clone(struct SessionHandle *data,
++                           const char *indata,
++                           size_t insize,
++                           char **outbuf)
++{
++  char *convbuf;
++  CURLcode result;
++
++  convbuf = malloc(insize);
++  if(!convbuf)
++    return CURLE_OUT_OF_MEMORY;
++
++  memcpy(convbuf, indata, insize);
++  result = Curl_convert_to_network(data, convbuf, insize);
++  if(result) {
++    free(convbuf);
++    return result;
++  }
++
++  *outbuf = convbuf; /* return the converted buffer */
++
++  return CURLE_OK;
++}
++
++/*
++ * Curl_convert_to_network() is an internal function for performing ASCII
++ * conversions on non-ASCII platforms. It convers the buffer _in place_.
++ */
++CURLcode Curl_convert_to_network(struct SessionHandle *data,
++                                 char *buffer, size_t length)
++{
++  CURLcode rc;
++
++  if(data->set.convtonetwork) {
++    /* use translation callback */
++    rc = data->set.convtonetwork(buffer, length);
++    if(rc != CURLE_OK) {
++      failf(data,
++            "CURLOPT_CONV_TO_NETWORK_FUNCTION callback returned %d: %s",
++            (int)rc, curl_easy_strerror(rc));
++    }
++    return rc;
++  }
++  else {
++#ifdef HAVE_ICONV
++    /* do the translation ourselves */
++    char *input_ptr, *output_ptr;
++    size_t in_bytes, out_bytes, rc;
++    int error;
++
++    /* open an iconv conversion descriptor if necessary */
++    if(data->outbound_cd == (iconv_t)-1) {
++      data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
++                                     CURL_ICONV_CODESET_OF_HOST);
++      if(data->outbound_cd == (iconv_t)-1) {
++        error = ERRNO;
++        failf(data,
++              "The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
++              CURL_ICONV_CODESET_OF_NETWORK,
++              CURL_ICONV_CODESET_OF_HOST,
++              error, strerror(error));
++        return CURLE_CONV_FAILED;
++      }
++    }
++    /* call iconv */
++    input_ptr = output_ptr = buffer;
++    in_bytes = out_bytes = length;
++    rc = iconv(data->outbound_cd, (const char**)&input_ptr, &in_bytes,
++               &output_ptr, &out_bytes);
++    if((rc == ICONV_ERROR) || (in_bytes != 0)) {
++      error = ERRNO;
++      failf(data,
++            "The Curl_convert_to_network iconv call failed with errno %i: %s",
++            error, strerror(error));
++      return CURLE_CONV_FAILED;
++    }
++#else
++    failf(data, "CURLOPT_CONV_TO_NETWORK_FUNCTION callback required");
++    return CURLE_CONV_REQD;
++#endif /* HAVE_ICONV */
++  }
++
++  return CURLE_OK;
++}
++
++/*
++ * Curl_convert_from_network() is an internal function for performing ASCII
++ * conversions on non-ASCII platforms. It convers the buffer _in place_.
++ */
++CURLcode Curl_convert_from_network(struct SessionHandle *data,
++                                   char *buffer, size_t length)
++{
++  CURLcode rc;
++
++  if(data->set.convfromnetwork) {
++    /* use translation callback */
++    rc = data->set.convfromnetwork(buffer, length);
++    if(rc != CURLE_OK) {
++      failf(data,
++            "CURLOPT_CONV_FROM_NETWORK_FUNCTION callback returned %d: %s",
++            (int)rc, curl_easy_strerror(rc));
++    }
++    return rc;
++  }
++  else {
++#ifdef HAVE_ICONV
++    /* do the translation ourselves */
++    char *input_ptr, *output_ptr;
++    size_t in_bytes, out_bytes, rc;
++    int error;
++
++    /* open an iconv conversion descriptor if necessary */
++    if(data->inbound_cd == (iconv_t)-1) {
++      data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
++                                    CURL_ICONV_CODESET_OF_NETWORK);
++      if(data->inbound_cd == (iconv_t)-1) {
++        error = ERRNO;
++        failf(data,
++              "The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
++              CURL_ICONV_CODESET_OF_HOST,
++              CURL_ICONV_CODESET_OF_NETWORK,
++              error, strerror(error));
++        return CURLE_CONV_FAILED;
++      }
++    }
++    /* call iconv */
++    input_ptr = output_ptr = buffer;
++    in_bytes = out_bytes = length;
++    rc = iconv(data->inbound_cd, (const char **)&input_ptr, &in_bytes,
++               &output_ptr, &out_bytes);
++    if((rc == ICONV_ERROR) || (in_bytes != 0)) {
++      error = ERRNO;
++      failf(data,
++            "Curl_convert_from_network iconv call failed with errno %i: %s",
++            error, strerror(error));
++      return CURLE_CONV_FAILED;
++    }
++#else
++    failf(data, "CURLOPT_CONV_FROM_NETWORK_FUNCTION callback required");
++    return CURLE_CONV_REQD;
++#endif /* HAVE_ICONV */
++  }
++
++  return CURLE_OK;
++}
++
++/*
++ * Curl_convert_from_utf8() is an internal function for performing UTF-8
++ * conversions on non-ASCII platforms.
++ */
++CURLcode Curl_convert_from_utf8(struct SessionHandle *data,
++                                char *buffer, size_t length)
++{
++  CURLcode rc;
++
++  if(data->set.convfromutf8) {
++    /* use translation callback */
++    rc = data->set.convfromutf8(buffer, length);
++    if(rc != CURLE_OK) {
++      failf(data,
++            "CURLOPT_CONV_FROM_UTF8_FUNCTION callback returned %d: %s",
++            (int)rc, curl_easy_strerror(rc));
++    }
++    return rc;
++  }
++  else {
++#ifdef HAVE_ICONV
++    /* do the translation ourselves */
++    const char *input_ptr;
++    char *output_ptr;
++    size_t in_bytes, out_bytes, rc;
++    int error;
++
++    /* open an iconv conversion descriptor if necessary */
++    if(data->utf8_cd == (iconv_t)-1) {
++      data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
++                                 CURL_ICONV_CODESET_FOR_UTF8);
++      if(data->utf8_cd == (iconv_t)-1) {
++        error = ERRNO;
++        failf(data,
++              "The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
++              CURL_ICONV_CODESET_OF_HOST,
++              CURL_ICONV_CODESET_FOR_UTF8,
++              error, strerror(error));
++        return CURLE_CONV_FAILED;
++      }
++    }
++    /* call iconv */
++    input_ptr = output_ptr = buffer;
++    in_bytes = out_bytes = length;
++    rc = iconv(data->utf8_cd, &input_ptr, &in_bytes,
++               &output_ptr, &out_bytes);
++    if((rc == ICONV_ERROR) || (in_bytes != 0)) {
++      error = ERRNO;
++      failf(data,
++            "The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
++            error, strerror(error));
++      return CURLE_CONV_FAILED;
++    }
++    if(output_ptr < input_ptr) {
++      /* null terminate the now shorter output string */
++      *output_ptr = 0x00;
++    }
++#else
++    failf(data, "CURLOPT_CONV_FROM_UTF8_FUNCTION callback required");
++    return CURLE_CONV_REQD;
++#endif /* HAVE_ICONV */
++  }
++
++  return CURLE_OK;
++}
++
++/*
++ * Init conversion stuff for a SessionHandle
++ */
++void Curl_convert_init(struct SessionHandle *data)
++{
++#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
++  /* conversion descriptors for iconv calls */
++  data->outbound_cd = (iconv_t)-1;
++  data->inbound_cd  = (iconv_t)-1;
++  data->utf8_cd     = (iconv_t)-1;
++#else
++  (void)data;
++#endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */
++}
++
++/*
++ * Setup conversion stuff for a SessionHandle
++ */
++void Curl_convert_setup(struct SessionHandle *data)
++{
++  data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
++                                CURL_ICONV_CODESET_OF_NETWORK);
++  data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
++                                 CURL_ICONV_CODESET_OF_HOST);
++  data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
++                             CURL_ICONV_CODESET_FOR_UTF8);
++}
++
++/*
++ * Close conversion stuff for a SessionHandle
++ */
++
++void Curl_convert_close(struct SessionHandle *data)
++{
++#ifdef HAVE_ICONV
++  /* close iconv conversion descriptors */
++  if(data->inbound_cd != (iconv_t)-1) {
++    iconv_close(data->inbound_cd);
++  }
++  if(data->outbound_cd != (iconv_t)-1) {
++    iconv_close(data->outbound_cd);
++  }
++  if(data->utf8_cd != (iconv_t)-1) {
++    iconv_close(data->utf8_cd);
++  }
++#else
++  (void)data;
++#endif /* HAVE_ICONV */
++}
++
++/*
++ * Curl_convert_form() is used from http.c, this converts any form items that
++   need to be sent in the network encoding.  Returns CURLE_OK on success.
++ */
++CURLcode Curl_convert_form(struct SessionHandle *data, struct FormData *form)
++{
++  struct FormData *next;
++  CURLcode rc;
++
++  if(!form)
++    return CURLE_OK;
++
++  if(!data)
++    return CURLE_BAD_FUNCTION_ARGUMENT;
++
++  do {
++    next=form->next;  /* the following form line */
++    if(form->type == FORM_DATA) {
++      rc = Curl_convert_to_network(data, form->line, form->length);
++      /* Curl_convert_to_network calls failf if unsuccessful */
++      if(rc != CURLE_OK)
++        return rc;
++    }
++  } while((form = next) != NULL); /* continue */
++  return CURLE_OK;
++}
++
++#endif /* CURL_DOES_CONVERSIONS */
+diff --git a/lib/non-ascii.h b/lib/non-ascii.h
+new file mode 100644
+index 0000000..6dcbe00
+--- /dev/null
++++ b/lib/non-ascii.h
+@@ -0,0 +1,63 @@
++#ifndef HEADER_CURL_NON_ASCII_H
++#define HEADER_CURL_NON_ASCII_H
++/***************************************************************************
++ *                                  _   _ ____  _
++ *  Project                     ___| | | |  _ \| |
++ *                             / __| | | | |_) | |
++ *                            | (__| |_| |  _ <| |___
++ *                             \___|\___/|_| \_\_____|
++ *
++ * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel at haxx.se>, et al.
++ *
++ * This software is licensed as described in the file COPYING, which
++ * you should have received as part of this distribution. The terms
++ * are also available at http://curl.haxx.se/docs/copyright.html.
++ *
++ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
++ * copies of the Software, and permit persons to whom the Software is
++ * furnished to do so, under the terms of the COPYING file.
++ *
++ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
++ * KIND, either express or implied.
++ *
++ ***************************************************************************/
++#include "setup.h"
++
++#ifdef CURL_DOES_CONVERSIONS
++
++#include "urldata.h"
++
++/*
++ * Curl_convert_clone() returns a malloced copy of the source string (if
++ * returning CURLE_OK), with the data converted to network format.
++ *
++ * If no conversion was needed *outbuf may be NULL.
++ */
++CURLcode Curl_convert_clone(struct SessionHandle *data,
++                            const char *indata,
++                            size_t insize,
++                            char **outbuf);
++
++void Curl_convert_init(struct SessionHandle *data);
++void Curl_convert_setup(struct SessionHandle *data);
++void Curl_convert_close(struct SessionHandle *data);
++
++CURLcode Curl_convert_to_network(struct SessionHandle *data,
++                                 char *buffer, size_t length);
++CURLcode Curl_convert_from_network(struct SessionHandle *data,
++                                 char *buffer, size_t length);
++CURLcode Curl_convert_from_utf8(struct SessionHandle *data,
++                                 char *buffer, size_t length);
++CURLcode Curl_convert_form(struct SessionHandle *data, struct FormData *form);
++#else
++#define Curl_convert_clone(a,b,c,d) ((void)a, CURLE_OK)
++#define Curl_convert_init(x) Curl_nop_stmt
++#define Curl_convert_setup(x) Curl_nop_stmt
++#define Curl_convert_close(x) Curl_nop_stmt
++#define Curl_convert_to_network(a,b,c) ((void)a, CURLE_OK)
++#define Curl_convert_from_network(a,b,c) ((void)a, CURLE_OK)
++#define Curl_convert_from_utf8(a,b,c) ((void)a, CURLE_OK)
++#define Curl_convert_form(a,b) CURLE_OK
++#endif
++
++#endif /* HEADER_CURL_NON_ASCII_H */
 diff --git a/lib/pop3.c b/lib/pop3.c
 index 9f67443..c4699e7 100644
 --- a/lib/pop3.c
diff --git a/curl.spec b/curl.spec
index bfc360a..951f9b0 100644
--- a/curl.spec
+++ b/curl.spec
@@ -40,7 +40,7 @@ Patch9: 0009-curl-7.21.3-d6f319f.patch
 Patch11: 0011-curl-7.21.1-3445fa2.patch
 
 # reject URLs containing bad data (CVE-2012-0036)
-Patch12: 0012-curl-7.21.7-75ca568.patch
+Patch12: 0012-curl-7.21.3-75ca568.patch
 
 # patch making libcurl multilib ready
 Patch101: 0101-curl-7.21.1-multilib.patch
@@ -152,6 +152,7 @@ done
 %patch9 -p1
 %patch10 -p1
 %patch11 -p1
+%patch12 -p1
 
 # Fedora patches
 %patch101 -p1


More information about the scm-commits mailing list