aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Uzunov <andrey.uzunov@gmail.com>2013-12-28 18:43:28 +0000
committerAndrey Uzunov <andrey.uzunov@gmail.com>2013-12-28 18:43:28 +0000
commitc81afd7682d237044b5869791c72824877546d60 (patch)
treeb2ba8a6684e63bacc2432323c28a4d2bf484edfe
parentd064f75e0d63f098cfe9f7e3c0e4dfb930445ace (diff)
downloadlibmicrohttpd-c81afd7682d237044b5869791c72824877546d60.tar.gz
libmicrohttpd-c81afd7682d237044b5869791c72824877546d60.zip
spdy: fixed bug when adding header with NULL value
-rw-r--r--src/examples/spdy_fileserver.c22
-rw-r--r--src/microspdy/structures.c21
-rw-r--r--src/testspdy/test_struct_namevalue.c2
3 files changed, 31 insertions, 14 deletions
diff --git a/src/examples/spdy_fileserver.c b/src/examples/spdy_fileserver.c
index 024bb644..adff832a 100644
--- a/src/examples/spdy_fileserver.c
+++ b/src/examples/spdy_fileserver.c
@@ -44,18 +44,24 @@ char* basedir;
44 44
45#define GET_MIME_TYPE(fname, mime) do {\ 45#define GET_MIME_TYPE(fname, mime) do {\
46 unsigned int __len = strlen(fname);\ 46 unsigned int __len = strlen(fname);\
47 if (__len < 4 || '.' != (fname)[__len - 4]) break;\ 47 if (__len < 4 || '.' != (fname)[__len - 4]) \
48 const char * __ext = &(fname)[__len - 3];\
49 if(0 == strcmp(__ext, "jpg")) (mime) = strdup("image/jpeg");\
50 else if(0 == strcmp(__ext, "png")) (mime) = strdup("image/png");\
51 else if(0 == strcmp(__ext, "css")) (mime) = strdup("text/css");\
52 else if(0 == strcmp(__ext, "gif")) (mime) = strdup("image/gif");\
53 else if(0 == strcmp(__ext, "htm")) (mime) = strdup("text/html");\
54 else \
55 { \ 48 { \
56 (mime) = strdup("application/octet-stream");\ 49 (mime) = strdup("application/octet-stream");\
57 printf("MIME for %s is applic...\n", (fname));\ 50 printf("MIME for %s is applic...\n", (fname));\
58 }\ 51 }\
52 else {\
53 const char * __ext = &(fname)[__len - 3];\
54 if(0 == strcmp(__ext, "jpg")) (mime) = strdup("image/jpeg");\
55 else if(0 == strcmp(__ext, "png")) (mime) = strdup("image/png");\
56 else if(0 == strcmp(__ext, "css")) (mime) = strdup("text/css");\
57 else if(0 == strcmp(__ext, "gif")) (mime) = strdup("image/gif");\
58 else if(0 == strcmp(__ext, "htm")) (mime) = strdup("text/html");\
59 else \
60 { \
61 (mime) = strdup("application/octet-stream");\
62 printf("MIME for %s is applic...\n", (fname));\
63 }\
64 }\
59 if(NULL == (mime))\ 65 if(NULL == (mime))\
60 {\ 66 {\
61 printf("no memory\n");\ 67 printf("no memory\n");\
diff --git a/src/microspdy/structures.c b/src/microspdy/structures.c
index 089bfd2b..05e33993 100644
--- a/src/microspdy/structures.c
+++ b/src/microspdy/structures.c
@@ -64,8 +64,10 @@ SPDY_name_value_add (struct SPDY_NameValue *container,
64 char **temp_value; 64 char **temp_value;
65 char *temp_string; 65 char *temp_string;
66 66
67 if(NULL == container || NULL == name || 0 == (len = strlen(name))) 67 if(NULL == container || NULL == name || NULL == value || 0 == (len = strlen(name)))
68 return SPDY_INPUT_ERROR; 68 return SPDY_INPUT_ERROR;
69 //TODO there is old code handling value==NULL
70 //update it to handle strlen(value)==0
69 71
70 for(i=0; i<len; ++i) 72 for(i=0; i<len; ++i)
71 { 73 {
@@ -85,7 +87,9 @@ SPDY_name_value_add (struct SPDY_NameValue *container,
85 free(container->name); 87 free(container->name);
86 return SPDY_NO; 88 return SPDY_NO;
87 } 89 }
88 if (NULL == (container->value[0] = strdup (value))) 90 /*if(NULL == value)
91 container->value[0] = NULL;
92 else */if (NULL == (container->value[0] = strdup (value)))
89 { 93 {
90 free(container->value); 94 free(container->value);
91 free(container->name); 95 free(container->name);
@@ -125,7 +129,9 @@ SPDY_name_value_add (struct SPDY_NameValue *container,
125 free(pair); 129 free(pair);
126 return SPDY_NO; 130 return SPDY_NO;
127 } 131 }
128 if (NULL == (pair->value[0] = strdup (value))) 132 /*if(NULL == value)
133 pair->value[0] = NULL;
134 else */if (NULL == (pair->value[0] = strdup (value)))
129 { 135 {
130 free(pair->value); 136 free(pair->value);
131 free(pair->name); 137 free(pair->name);
@@ -477,6 +483,8 @@ SPDYF_name_value_to_stream(struct SPDY_NameValue * container[],
477 483
478 for(i=0; i<iterator->num_values; ++i) 484 for(i=0; i<iterator->num_values; ++i)
479 { 485 {
486 //if(NULL == iterator->value[i])
487 // continue;
480 size += strlen(iterator->value[i]); // string 488 size += strlen(iterator->value[i]); // string
481 if(i/* || !strlen(iterator->value[i])*/) ++size; //NULL separator 489 if(i/* || !strlen(iterator->value[i])*/) ++size; //NULL separator
482 } 490 }
@@ -518,8 +526,11 @@ SPDYF_name_value_to_stream(struct SPDY_NameValue * container[],
518 ++offset; 526 ++offset;
519 //if(!i) continue; 527 //if(!i) continue;
520 } 528 }
521 strncpy(*stream + offset, iterator->value[i], strlen(iterator->value[i])); 529 //else if(NULL != iterator->value[i])
522 offset += strlen(iterator->value[i]); 530 //{
531 strncpy(*stream + offset, iterator->value[i], strlen(iterator->value[i]));
532 offset += strlen(iterator->value[i]);
533 //}
523 } 534 }
524 value_size = offset - value_offset - 4; 535 value_size = offset - value_offset - 4;
525 value_size = htonl(value_size); 536 value_size = htonl(value_size);
diff --git a/src/testspdy/test_struct_namevalue.c b/src/testspdy/test_struct_namevalue.c
index dbd60e5b..01356071 100644
--- a/src/testspdy/test_struct_namevalue.c
+++ b/src/testspdy/test_struct_namevalue.c
@@ -165,7 +165,7 @@ main()
165 SPDY_name_value_destroy(container); 165 SPDY_name_value_destroy(container);
166 166
167 //check everything with NULL values 167 //check everything with NULL values
168 for(i=0; i<6; ++i) 168 for(i=0; i<7; ++i)
169 { 169 {
170 printf("%i ",i); 170 printf("%i ",i);
171 ob1 = (i & 4) ? data : NULL; 171 ob1 = (i & 4) ? data : NULL;