diff options
author | Andrey Uzunov <andrey.uzunov@gmail.com> | 2013-12-28 18:43:28 +0000 |
---|---|---|
committer | Andrey Uzunov <andrey.uzunov@gmail.com> | 2013-12-28 18:43:28 +0000 |
commit | c81afd7682d237044b5869791c72824877546d60 (patch) | |
tree | b2ba8a6684e63bacc2432323c28a4d2bf484edfe | |
parent | d064f75e0d63f098cfe9f7e3c0e4dfb930445ace (diff) | |
download | libmicrohttpd-c81afd7682d237044b5869791c72824877546d60.tar.gz libmicrohttpd-c81afd7682d237044b5869791c72824877546d60.zip |
spdy: fixed bug when adding header with NULL value
-rw-r--r-- | src/examples/spdy_fileserver.c | 22 | ||||
-rw-r--r-- | src/microspdy/structures.c | 21 | ||||
-rw-r--r-- | src/testspdy/test_struct_namevalue.c | 2 |
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; |