gnunet-svn
[Top][All Lists]
Advanced

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

[libmicrohttpd] 02/02: postprocessor: added new processing state, change


From: gnunet
Subject: [libmicrohttpd] 02/02: postprocessor: added new processing state, changed logic.
Date: Sun, 19 Sep 2021 15:06:19 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit d964b3ef85e30bd5620438e9a037b5895ecabe3e
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sun Sep 19 16:06:03 2021 +0300

    postprocessor: added new processing state, changed logic.
    
    Changed code to ensure that PP_Done is always set at the first newline char.
---
 src/microhttpd/postprocessor.c | 96 +++++++++++++++++++++++++-----------------
 1 file changed, 58 insertions(+), 38 deletions(-)

diff --git a/src/microhttpd/postprocessor.c b/src/microhttpd/postprocessor.c
index dc01b3f7..d0b018c7 100644
--- a/src/microhttpd/postprocessor.c
+++ b/src/microhttpd/postprocessor.c
@@ -48,6 +48,7 @@ enum PP_State
   PP_NextBoundary,
 
   /* url encoding-states */
+  PP_ProcessKey,
   PP_ProcessValue,
   PP_Callback,
 
@@ -512,39 +513,57 @@ post_process_urlencoded (struct MHD_PostProcessor *pp,
       abort ();
       break;
     case PP_Init:
+      /* initial phase */
+      mhd_assert (NULL == start_key);
+      mhd_assert (NULL == end_key);
+      mhd_assert (NULL == start_value);
+      mhd_assert (NULL == end_value);
+      switch (post_data[poff])
+      {
+      case '=':
+        /* Case: (no key)'=' */
+        /* Empty key with value */
+        pp->state = PP_Error;
+        continue;
+      case '&':
+        /* Case: (no key)'&' */
+        /* Empty key without value */
+        poff++;
+        continue;
+      case '\n':
+      case '\r':
+        /* Case: (no key)'\n' or (no key)'\r' */
+        pp->state = PP_Done;
+        poff++;
+        break;
+      default:
+        /* normal character, key start, advance! */
+        pp->state = PP_ProcessKey;
+        start_key = &post_data[poff];
+        pp->must_ikvi = true;
+        poff++;
+        continue;
+      }
+      break; /* end PP_Init */
+    case PP_ProcessKey:
       /* key phase */
+      mhd_assert (NULL == start_value);
+      mhd_assert (NULL == end_value);
+      mhd_assert (NULL != start_key || 0 == poff);
+      mhd_assert (0 != poff || NULL == start_key);
+      mhd_assert (NULL == end_key);
       switch (post_data[poff])
       {
       case '=':
         /* Case: 'key=' */
-        if (NULL == start_key)
-        {
-          if (0 == pp->buffer_pos)
-          {
-            /* Empty key with value */
-            pp->state = PP_Error;
-            continue;
-          }
-        }
-        else
+        if (0 != poff)
           end_key = &post_data[poff];
         poff++;
         pp->state = PP_ProcessValue;
         break;
       case '&':
         /* Case: 'key&' */
-        mhd_assert (NULL == start_value);
-        mhd_assert (NULL == end_value);
-        if (NULL == start_key)
-        {
-          if (0 == pp->buffer_pos)
-          {
-            /* Empty key without value */
-            poff++;
-            continue;
-          }
-        }
-        else
+        if (0 != poff)
           end_key = &post_data[poff];
         poff++;
         pp->state = PP_Callback;
@@ -552,25 +571,20 @@ post_process_urlencoded (struct MHD_PostProcessor *pp,
       case '\n':
       case '\r':
         /* Case: 'key\n' or 'key\r' */
-        if (NULL != start_key)
+        if (0 != poff)
           end_key = &post_data[poff];
-        poff++;
-        if (pp->must_ikvi)
-          pp->state = PP_Callback;
-        else
-          pp->state = PP_Done;
+        /* No advance here, 'PP_Done' will be selected by next 'PP_Init' phase 
*/
+        pp->state = PP_Callback;
         break;
       default:
         /* normal character, advance! */
-        if (NULL == start_key)
-        {
-          start_key = &post_data[poff];
-          pp->must_ikvi = true;
-        }
+        if (0 == poff)
+          start_key = post_data;
         poff++;
-        continue;
+        break;
       }
-      break; /* end PP_Init */
+      mhd_assert (NULL == end_key || NULL != start_key);
+      break; /* end PP_ProcessKey */
     case PP_ProcessValue:
       if (NULL == start_value)
         start_value = &post_data[poff];
@@ -602,12 +616,14 @@ post_process_urlencoded (struct MHD_PostProcessor *pp,
       case '\r':
         /* Case: 'value\n' or 'value\r' */
         end_value = &post_data[poff];
-        poff++;
         if (pp->must_ikvi ||
             (start_value != end_value) )
-          pp->state = PP_Callback;
+          pp->state = PP_Callback; /* No poff advance here to set PP_Done in 
the next iteration */
         else
+        {
+          poff++;
           pp->state = PP_Done;
+        }
         break;
       case '%':
         last_escape = &post_data[poff];
@@ -668,6 +684,10 @@ post_process_urlencoded (struct MHD_PostProcessor *pp,
           pp->must_unescape_key = true;
         }
       }
+#ifdef _DEBUG
+      else
+        mhd_assert (0 != pp->buffer_pos);
+#endif /* _DEBUG */
       if (pp->must_unescape_key)
       {
         kbuf[pp->buffer_pos] = '\0'; /* 0-terminate key */
@@ -709,7 +729,7 @@ post_process_urlencoded (struct MHD_PostProcessor *pp,
   if (NULL != start_key)
   {
     size_t key_len;
-    mhd_assert ((PP_Init == pp->state) || (NULL != end_key));
+    mhd_assert ((PP_ProcessKey == pp->state) || (NULL != end_key));
     if (NULL == end_key)
       end_key = &post_data[poff];
     key_len = end_key - start_key;

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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