about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-02-18 18:44:38 -0800
committerEric Wong <normalperson@yhbt.net>2010-02-18 19:30:51 -0800
commit4347b8987732b5bea83ddb8fb9605cf2c4a1c2fe (patch)
tree1b173bd6184ef285122cfafb872260183f1eed27
parent3e80ccb60e2b3632916094ac436806ab1cf03b11 (diff)
downloadunicorn-4347b8987732b5bea83ddb8fb9605cf2c4a1c2fe.tar.gz
We never come close to the signed limits anywhere, so it
should be safe either way, but make paranoid compiler settings
less noisy if possible.
-rw-r--r--ext/unicorn_http/common_field_optimization.h6
-rw-r--r--ext/unicorn_http/ext_help.h4
-rw-r--r--ext/unicorn_http/unicorn_http.rl13
3 files changed, 11 insertions, 12 deletions
diff --git a/ext/unicorn_http/common_field_optimization.h b/ext/unicorn_http/common_field_optimization.h
index 850fb90..42c5430 100644
--- a/ext/unicorn_http/common_field_optimization.h
+++ b/ext/unicorn_http/common_field_optimization.h
@@ -67,7 +67,7 @@ static void init_common_fields(void)
   char tmp[64];
   memcpy(tmp, HTTP_PREFIX, HTTP_PREFIX_LEN);
 
-  for(i = 0; i < ARRAY_SIZE(common_http_fields); cf++, i++) {
+  for(i = ARRAY_SIZE(common_http_fields); --i >= 0; cf++) {
     /* Rack doesn't like certain headers prefixed with "HTTP_" */
     if (!strcmp("CONTENT_LENGTH", cf->name) ||
         !strcmp("CONTENT_TYPE", cf->name)) {
@@ -87,8 +87,8 @@ static VALUE find_common_field(const char *field, size_t flen)
   int i;
   struct common_field *cf = common_http_fields;
 
-  for(i = 0; i < ARRAY_SIZE(common_http_fields); i++, cf++) {
-    if (cf->len == flen && !memcmp(cf->name, field, flen))
+  for(i = ARRAY_SIZE(common_http_fields); --i >= 0; cf++) {
+    if (cf->len == (long)flen && !memcmp(cf->name, field, flen))
       return cf->value;
   }
   return Qnil;
diff --git a/ext/unicorn_http/ext_help.h b/ext/unicorn_http/ext_help.h
index 7df73f7..888bd36 100644
--- a/ext/unicorn_http/ext_help.h
+++ b/ext/unicorn_http/ext_help.h
@@ -47,7 +47,7 @@ static void rb_18_str_set_len(VALUE str, long len)
 #  define rb_str_modify(x) do {} while (0)
 #endif /* ! defined(HAVE_RB_STR_MODIFY) */
 
-static inline int str_cstr_eq(VALUE val, const char *ptr, size_t len)
+static inline int str_cstr_eq(VALUE val, const char *ptr, long len)
 {
   return (RSTRING_LEN(val) == len && !memcmp(ptr, RSTRING_PTR(val), len));
 }
@@ -56,7 +56,7 @@ static inline int str_cstr_eq(VALUE val, const char *ptr, size_t len)
   str_cstr_eq(val, const_str, sizeof(const_str) - 1)
 
 /* strcasecmp isn't locale independent */
-static int str_cstr_case_eq(VALUE val, const char *ptr, size_t len)
+static int str_cstr_case_eq(VALUE val, const char *ptr, long len)
 {
   if (RSTRING_LEN(val) == len) {
     const char *v = RSTRING_PTR(val);
diff --git a/ext/unicorn_http/unicorn_http.rl b/ext/unicorn_http/unicorn_http.rl
index a95224c..eeef5e1 100644
--- a/ext/unicorn_http/unicorn_http.rl
+++ b/ext/unicorn_http/unicorn_http.rl
@@ -236,10 +236,9 @@ static void write_value(VALUE req, struct http_parser *hp,
     rb_hash_aset(req, g_http_host, STR_NEW(mark, fpc));
   }
   action request_uri {
-    size_t len = LEN(mark, fpc);
     VALUE str;
 
-    VALIDATE_MAX_LENGTH(len, REQUEST_URI);
+    VALIDATE_MAX_LENGTH(LEN(mark, fpc), REQUEST_URI);
     str = rb_hash_aset(req, g_request_uri, STR_NEW(mark, fpc));
     /*
      * "OPTIONS * HTTP/1.1\r\n" is a valid request, but we can't have '*'
@@ -263,9 +262,8 @@ static void write_value(VALUE req, struct http_parser *hp,
   action http_version { http_version(hp, req, PTR_TO(mark), LEN(mark, fpc)); }
   action request_path {
     VALUE val;
-    size_t len = LEN(mark, fpc);
 
-    VALIDATE_MAX_LENGTH(len, REQUEST_PATH);
+    VALIDATE_MAX_LENGTH(LEN(mark, fpc), REQUEST_PATH);
     val = rb_hash_aset(req, g_request_path, STR_NEW(mark, fpc));
 
     /* rack says PATH_INFO must start with "/" or be empty */
@@ -314,13 +312,13 @@ static void write_value(VALUE req, struct http_parser *hp,
 
   action skip_chunk_data {
   skip_chunk_data_hack: {
-    size_t nr = MIN(hp->len.chunk, REMAINING);
+    size_t nr = MIN((size_t)hp->len.chunk, REMAINING);
     memcpy(RSTRING_PTR(req) + hp->s.dest_offset, fpc, nr);
     hp->s.dest_offset += nr;
     hp->len.chunk -= nr;
     p += nr;
     assert(hp->len.chunk >= 0 && "negative chunk length");
-    if (hp->len.chunk > REMAINING) {
+    if ((size_t)hp->len.chunk > REMAINING) {
       HP_FL_SET(hp, INCHUNK);
       goto post_exec;
     } else {
@@ -360,7 +358,8 @@ static void http_parser_execute(struct http_parser *hp,
   p = buffer+off;
   pe = buffer+len;
 
-  assert(pe - p == len - off && "pointers aren't same distance");
+  assert((void *)(pe - p) == (void *)(len - off) &&
+         "pointers aren't same distance");
 
   if (HP_FL_TEST(hp, INCHUNK)) {
     HP_FL_UNSET(hp, INCHUNK);