gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22608 - gnunet/src/gns


From: gnunet
Subject: [GNUnet-SVN] r22608 - gnunet/src/gns
Date: Wed, 11 Jul 2012 17:17:17 +0200

Author: grothoff
Date: 2012-07-11 17:17:17 +0200 (Wed, 11 Jul 2012)
New Revision: 22608

Modified:
   gnunet/src/gns/gnunet-gns-proxy.c
Log:
-breaking proxy as well

Modified: gnunet/src/gns/gnunet-gns-proxy.c
===================================================================
--- gnunet/src/gns/gnunet-gns-proxy.c   2012-07-11 15:06:03 UTC (rev 22607)
+++ gnunet/src/gns/gnunet-gns-proxy.c   2012-07-11 15:17:17 UTC (rev 22608)
@@ -64,6 +64,7 @@
   gnutls_x509_privkey_t key;
 };
 
+#define MAX_PEM_SIZE (10 * 1024)
 
 /**
  * Structure for GNS certificates
@@ -71,10 +72,10 @@
 struct ProxyGNSCertificate
 {
   /* The certificate as PEM */
-  char cert[10 * 1024];
+  char cert[MAX_PEM_SIZE];
 
   /* The private key as PEM */
-  char key[10 * 1024];
+  char key[MAX_PEM_SIZE];
 };
 
 
@@ -350,15 +351,13 @@
 int
 is_tld(const char* name, const char* tld)
 {
-  int offset = 0;
+  size_t offset;
 
-  if (strlen(name) <= strlen(tld))
-  {
-    return GNUNET_NO;
-  }
+  if (strlen(name) <= strlen(tld))  
+    return GNUNET_NO;  
 
-  offset = strlen(name)-strlen(tld);
-  if (strcmp (name+offset, tld) != 0)
+  offset = strlen(name) - strlen(tld);
+  if (0 != strcmp (name+offset, tld))
   {
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
                "%s is not in .%s TLD\n", name, tld);
@@ -396,7 +395,7 @@
               const char *key,
               const char *value)
 {
-  struct ProxyCurlTask *ctask = (struct ProxyCurlTask *) cls;
+  struct ProxyCurlTask *ctask = cls;
   char* buf = ctask->host;
   char* cstr;
   const char* hdr_val;
@@ -471,8 +470,8 @@
 
   memcpy (hdr_generic, buffer, bytes);
   hdr_generic[bytes] = '\0';
-  /*remove crlf*/
-  if (hdr_generic[bytes-1] == '\n')
+  /* remove crlf */
+  if ('\n' == hdr_generic[bytes-1])
     hdr_generic[bytes-1] = '\0';
 
   if (hdr_generic[bytes-2] == '\r')
@@ -623,13 +622,12 @@
 /**
  * Task that simply runs MHD main loop
  *
- * @param cls NULL
+ * @param cls NULL --- FIXME: interesting...
  * @param tc task context
  */
 static void
 run_mhd (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-
   struct MhdHttpList *hd = cls;
 
   //for (hd=mhd_httpd_head; hd != NULL; hd = hd->next)
@@ -652,6 +650,17 @@
   const char *cbuf = ptr;
   size_t total;
   struct ProxyCurlTask *ctask = ctx;
+  
+  if (NULL == ctask->response)
+  {
+    /* FIXME: get total size from curl (if available) */
+    ctask->response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN,
+                                                        20 /* 20 bytes IO 
buffers!? */,
+                                                        &mhd_content_cb,
+                                                        ctask,
+                                                        NULL);
+    
+  }
 
   //MHD_run (httpd);
   ctask->ready_to_queue = GNUNET_YES;
@@ -695,8 +704,7 @@
 
   //GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
   //            "cURL chunk:\n%s\n", (char*)ctask->buffer);
-  //run_mhd (NULL, NULL);
-  GNUNET_SCHEDULER_add_now (&run_mhd, ctask->mhd);
+  run_mhd_now (ctask->mhd);
   return total;
 }
 
@@ -713,10 +721,8 @@
  * @param tc task context
  */
 static void
-mhd_content_free (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+mhd_content_free (struct ProxyCurlTask *ctask)
 {
-  struct ProxyCurlTask *ctask = cls;
-
   if (NULL != ctask->headers)
     curl_slist_free_all (ctask->headers);
 
@@ -727,7 +733,6 @@
     MHD_destroy_response (ctask->response);
 
   GNUNET_free (ctask);
-
 }
 
 
@@ -797,8 +802,9 @@
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "MHD: sending response for %s\n", ctask->url);
     ctask->download_in_progress = GNUNET_NO;
-    GNUNET_SCHEDULER_add_now (&mhd_content_free, ctask);
+    run_mhd_now (ctask->mhd);
     GNUNET_SCHEDULER_add_now (&run_mhd, ctask->mhd);
+    mhd_content_free (ctask);
     total_mhd_connections--;
     return MHD_CONTENT_READER_END_OF_STREAM;
   }
@@ -809,8 +815,8 @@
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "MHD: sending error response\n");
     ctask->download_in_progress = GNUNET_NO;
-    GNUNET_SCHEDULER_add_now (&mhd_content_free, ctask);
-    GNUNET_SCHEDULER_add_now (&run_mhd, ctask->mhd);
+    run_mhd_now (ctask->mhd);
+    mhd_content_free (ctask);
     total_mhd_connections--;
     return MHD_CONTENT_READER_END_WITH_ERROR;
   }
@@ -883,7 +889,7 @@
             ctask->is_postprocessing = GNUNET_NO;
             return strlen (ctask->pp_buf);
           }
-          
+          // OOPS!
           return 0;
         }
 
@@ -918,6 +924,7 @@
               ctask->is_postprocessing = GNUNET_YES;
               ctask->pp_finished = GNUNET_YES;
               GNUNET_SCHEDULER_add_now (&run_mhd, ctask->mhd);
+             // WTF?
               return 0;
             }
             goto copy_data;
@@ -935,7 +942,7 @@
                                  &local_shorten_zone,
                                  &local_gns_zone,
                                  &process_shorten,
-                                 ctask);
+                                 ctask); // FIXME: use after free of 'ctask'?
 
         return 0;
       }
@@ -1413,13 +1420,13 @@
   const char* page = "<html><head><title>gnoxy</title>"\
                       "</head><body>cURL fail</body></html>";
   
-  char curlurl[512];
+  char curlurl[512]; // buffer overflow!
   int ret = MHD_YES;
 
   struct ProxyCurlTask *ctask;
   
   //FIXME handle
-  if (0 != strcmp (meth, "GET"))
+  if (0 != strcasecmp (meth, MHD_HTTP_METHOD_GET))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "%s NOT IMPLEMENTED!\n", meth);
@@ -1439,12 +1446,13 @@
     ctask->mhd = hd;
     *con_cls = ctask;
     
-    if (curl_multi == NULL)
-    curl_multi = curl_multi_init ();
+    // FIXME: probably not best here, also never free'ed...
+    if (NULL == curl_multi)
+      curl_multi = curl_multi_init ();
 
     ctask->curl = curl_easy_init();
   
-    if ((ctask->curl == NULL) || (curl_multi == NULL))
+    if ((NULL == ctask->curl) || (NULL == curl_multi)) // ugh, curl_multi init 
failure check MUCH earlier
     {
       ctask->response = MHD_create_response_from_buffer (strlen (page),
                                                 (void*)page,
@@ -1457,23 +1465,11 @@
       return ret;
     }
   
-    ctask->prev = NULL;
-    ctask->next = NULL;
-    ctask->headers = NULL;
-    ctask->resolver = NULL;
-    ctask->buffer_ptr = NULL;
     ctask->download_in_progress = GNUNET_YES;
-    ctask->download_successful = GNUNET_NO;
     ctask->buf_status = BUF_WAIT_FOR_CURL;
-    ctask->bytes_in_buffer = 0;
-    ctask->parse_content = GNUNET_NO;
     ctask->connection = con;
-    ctask->ready_to_queue = MHD_NO;
-    ctask->fin = GNUNET_NO;
-    ctask->headers = NULL;
     ctask->curl_response_code = MHD_HTTP_OK;
 
-
     MHD_get_connection_values (con,
                                MHD_HEADER_KIND,
                                &con_val_iter, ctask);
@@ -1509,43 +1505,22 @@
                               ctask->host,
                               &process_get_authority,
                               ctask);
-
-    ctask->response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN,
-                                                  20,
-                                                  &mhd_content_cb,
-                                                  ctask,
-                                                  NULL);
-    
     ctask->ready_to_queue = GNUNET_NO;
     ctask->fin = GNUNET_NO;
     return MHD_YES;
   }
 
   ctask = (struct ProxyCurlTask *) *con_cls;
-
-  if (ctask->fin == GNUNET_YES)
-    return MHD_YES;
-
-  if (ctask->ready_to_queue == GNUNET_YES)
-  {
-    ctask->fin = GNUNET_YES;
-
-    ret = MHD_queue_response (con, ctask->curl_response_code, ctask->response);
-    GNUNET_SCHEDULER_add_now (&run_mhd, ctask->mhd);
-    return ret;
-  }
-
-  
-  
-  
-  //MHD_destroy_response (response);
-
-  //return ret;
-  return MHD_YES;
+  GNUNET_break (GNUNET_YES != ctask->fin);
+  if (GNUNET_YES != ctask->ready_to_queue)
+    return MHD_YES; /* wait longer */
+  ctask->fin = GNUNET_YES;
+  ret = MHD_queue_response (con, ctask->curl_response_code, ctask->response);
+  run_mhd_now (ctask->mhd);
+  return ret;
 }
 
 
-
 /**
  * run all httpd
  */
@@ -1625,13 +1600,20 @@
 {
   struct MhdHttpList *hd = cls;
   
-  hd->httpd_task = GNUNET_SCHEDULER_NO_TASK;
-  
+  hd->httpd_task = GNUNET_SCHEDULER_NO_TASK; 
   MHD_run (hd->daemon);
   run_httpd (hd);
 }
 
 
+static void
+run_mhd_now (struct MhdHttpList *hd)
+{
+  GNUNET_SCHEDULER_cancel (hd->httpd_task);
+  hd->httpd_task = GNUNET_SCHEDULER_add_now (&do_httpd, hd);
+}
+
+
 /**
  * Read data from socket
  *
@@ -1846,23 +1828,17 @@
 get_file_size (const char* filename)
 {
   FILE *fp;
+  long size;
 
-  fp = fopen (filename, "rb");
-  if (fp)
-  {
-    long size;
-
-    if ((0 != fseek (fp, 0, SEEK_END)) || (-1 == (size = ftell (fp))))
-      size = 0;
-
-    fclose (fp);
-
-    return size;
-  }
-  
-  return 0;
+  if (NULL == (fp = fopen (filename, "rb")))
+    return 0; 
+  if ((0 != fseek (fp, 0, SEEK_END)) || (-1 == (size = ftell (fp))))
+    size = 0;  
+  fclose (fp);  
+  return size;
 }
 
+
 /**
  * Read file in filename
  *
@@ -1871,64 +1847,57 @@
  * @return data
  */
 static char*
-load_file (const char* filename, unsigned int* size)
+load_file (const char* filename, 
+          unsigned int* size)
 {
-  FILE *fp;
   char *buffer;
+  uint64_t fsize;
 
-  *size = get_file_size (filename);
-  if (*size == 0)
+  if (GNUNET_OK !=
+      GNUNET_DISK_file_size (filename, &fsize,
+                            GNUNET_YES, GNUNET_YES))
     return NULL;
-
-  fp = fopen (filename, "rb");
-  if (!fp)
+  if (fsize > MAX_PEM_SIZE)
     return NULL;
-
+  *size = (unsigned int) fsize;
   buffer = GNUNET_malloc (*size);
-  if (!buffer)
+  if (fsize != GNUNET_DISK_fn_read (filename, buffer, (size_t) fsize))
   {
-    fclose (fp);
+    GNUNET_free (buffer);
     return NULL;
   }
-
-  if (*size != fread (buffer, 1, *size, fp))
-  {
-    GNUNET_free (buffer);
-    buffer = NULL;
-  }
-
-  fclose (fp);
   return buffer;
 }
 
+
 /**
  * Load PEM key from file
  *
  * @param key where to store the data
  * @param keyfile path to the PEM file
+ * @return GNUNET_OK on success
  */
-static void
-load_key_from_file (gnutls_x509_privkey_t key, char* keyfile)
+static int
+load_key_from_file (gnutls_x509_privkey_t key, const char* keyfile)
 {
   gnutls_datum_t key_data;
-  key_data.data = NULL;
   int ret;
 
-  key_data.data = (unsigned char*)load_file (keyfile, &key_data.size);
-
+  key_data.data = (unsigned char*) load_file (keyfile, &key_data.size);
   ret = gnutls_x509_privkey_import (key, &key_data,
                                     GNUTLS_X509_FMT_PEM);
-  
   if (GNUTLS_E_SUCCESS != ret)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unable to import private key %s(ret=%d)\n", key_data.data, 
ret);
+                _("Unable to import private key from file `%s'\n"),
+               keyfile);
     GNUNET_break (0);
   }
-
   GNUNET_free (key_data.data);
+  return (GNUTLS_E_SUCCESS != ret) ? GNUNET_SYSERR : GNUNET_OK;
 }
 
+
 /**
  * Load cert from file
  *
@@ -2091,21 +2060,18 @@
  * @return MHD_YES on success
  */
 static int
-add_handle_to_ssl_mhd (struct GNUNET_NETWORK_Handle *h, char* domain)
+add_handle_to_ssl_mhd (struct GNUNET_NETWORK_Handle *h, const char* domain)
 {
   struct MhdHttpList *hd = NULL;
   struct ProxyGNSCertificate *pgc;
   struct NetworkHandleList *nh;
 
-  for (hd = mhd_httpd_head; hd != NULL; hd = hd->next)
-  {
+  for (hd = mhd_httpd_head; NULL != hd; hd = hd->next)
     if (0 == strcmp (hd->domain, domain))
       break;
-  }
 
   if (NULL == hd)
-  {
-    
+  {    
     pgc = generate_gns_certificate (domain);
     
     hd = GNUNET_malloc (sizeof (struct MhdHttpList));
@@ -2118,7 +2084,7 @@
                 "No previous SSL instance found... starting new one for %s\n",
                 domain);
 
-    hd->daemon = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_SSL, 4444,
+    hd->daemon = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_SSL, 0,
             &accept_cb, NULL,
             &create_response, hd,
             MHD_OPTION_LISTEN_SOCKET, GNUNET_NETWORK_get_fd (mhd_unix_socket),
@@ -2744,8 +2710,12 @@
   gnutls_x509_crt_init (&proxy_ca.cert);
   gnutls_x509_privkey_init (&proxy_ca.key);
   
-  load_cert_from_file (proxy_ca.cert, cafile);
-  load_key_from_file (proxy_ca.key, cafile);
+  if ( (GNUNET_OK != load_cert_from_file (proxy_ca.cert, cafile)) ||
+       (GNUNET_OK != load_key_from_file (proxy_ca.key, cafile)) )
+  {
+    // FIXME: release resources...
+    return;
+  }
 
   GNUNET_free_non_null (cafile_cfg);
   
@@ -2938,3 +2908,7 @@
 
   return ret;
 }
+
+
+
+




reply via email to

[Prev in Thread] Current Thread [Next in Thread]