416 Commits

Author SHA1 Message Date
James Coglan 9a26f9cda3 Initial attempts at getting fuzzing set up with AFL and libfuzzer. 2017-02-13 00:23:48 +00:00
James Coglan 17749524ec Silence warnings emitted under -W2. 2017-01-11 22:37:52 +00:00
James Coglan 60e4027c59 Extract the parsing/unparsing code from Hybi into Ruby classes that match the C API, drop the Native driver and allow Hybi to take options for which parsers to use. 2017-01-06 09:11:37 +00:00
James Coglan 5c15da3a32 Set up C extension for running tests through valgrind. 2017-01-05 23:49:44 +00:00
James Coglan 319275d07b Free the allocated Observer if allocating a Parser fails. 2017-01-05 22:26:48 +00:00
James Coglan bfcc911a81 Replace the Queue_scan function and callback with an external iterator that exposes the values. 2017-01-05 21:58:46 +00:00
James Coglan 914dadb973 Port the frame serializer to C. 2017-01-05 21:38:26 +00:00
James Coglan f36fe01a19 The parser opcode checking functions should take an opcode, not a Parser. 2016-12-31 17:57:37 +00:00
James Coglan 3f54340819 Add a C program to pass all the Autobahn test data through the parser directly, not via Ruby. We can use this to test the parser with Valgrind. 2016-12-31 16:05:47 +00:00
James Coglan ede6490add Refer to error messages as 'reasons' so as not to confuse them with WebSocket message structs. 2016-12-31 15:48:47 +00:00
James Coglan 99a6e459fe The parser should keep reading as long as the read length is the same as the required length; sometimes this is zero. 2016-12-29 11:28:18 +00:00
James Coglan cee5700a02 Catch errors with close frames with invalid UTF-8. 2016-12-29 02:10:51 +00:00
James Coglan 21bfd23f1a Implement basic RSV checking for the case when no extensions are active. 2016-12-29 01:55:23 +00:00
James Coglan 6ffb801dd1 Remove a redundant check for continuation frames when there's no initialised message. 2016-12-29 01:54:54 +00:00
James Coglan fb8fcfa5f1 Run the Hybi specs against both the pure-Ruby and the native versions of the driver. 2016-12-29 01:09:12 +00:00
James Coglan 97b497a520 Drop the old native extension and replace it with the new all-C parser. Replace the old masking code with a Ruby version, so that the Hybi class is pure Ruby. 2016-12-29 01:09:12 +00:00
James Coglan 0eb64913ca Capture errors raise by emit() and re-raise them after the parser has finished running. 2016-12-29 00:56:55 +00:00
James Coglan 524aa3f356 Add handling of close frames. 2016-12-29 00:34:36 +00:00
James Coglan 8eaae3a149 Implement hooks for ping/pong. 2016-12-28 18:04:27 +00:00
James Coglan 78c5aea489 Check for valid UTF-8 after the message has gone through extensions, e.g. a deflate-encoded payload will not be valid UTF-8. 2016-12-28 16:35:45 +00:00
James Coglan ce21d26e48 Check the length of incoming frames, including checking what they would add to the total message size. 2016-12-28 16:35:05 +00:00
James Coglan 721644495b Implement the require_masking flag properly. 2016-12-28 16:14:52 +00:00
James Coglan d6ddd6eedc Implement some error handling: checking for non-final and too-long control frames, unmasked data, and continuation violations. 2016-12-28 15:59:25 +00:00
James Coglan ae62fc6322 Begin emitting native parser errors back to the driver, starting by handling invalid opcodes. 2016-12-28 15:25:44 +00:00
James Coglan fbd22b99aa Make wsd_Queue_destroy() for-loop simpler and remove an unused variable warning. 2016-12-27 14:54:18 +00:00
James Coglan 8366d2790a Move declarations to the top of WebSocketParser callbacks. 2016-12-27 14:50:22 +00:00
James Coglan 01e8bd904d Wrap calls out to the Ruby driver and user callbacks in rb_protect. 2016-12-27 14:39:01 +00:00
James Coglan 4e747733a3 Begin wiring the C parser up to a Ruby driver. Driver::Native is currently a hollowed-out copy of Driver::Hybi with the parsing code removed. 2016-12-27 12:26:59 +00:00
James Coglan d5b2af3782 Make the Observer and Parser structs opaque. 2016-12-26 16:38:37 +00:00
James Coglan abd0a9372c Make the Queue structs opaque. 2016-12-26 15:59:31 +00:00
James Coglan 94317d4461 Make the ReadBuffer structs opaque. 2016-12-26 15:17:05 +00:00
James Coglan 4a79ae4eea Remove a couple of demeter violations: the parser accessing buffer->capacity, and buffer reaching into its queue via queue->head->value. 2016-12-26 12:55:46 +00:00
James Coglan 10f180e9f1 Use a macro for freeing then nulling a pointer, and make sure all destructors null out pointers where appropriate. 2016-12-26 12:14:51 +00:00
James Coglan fd4bbb0c12 Don't check if pointers are not NULL before freeing them.
Freeing a null pointer is a no-op and doesn't stop you double-freeing
things. What actually stops that is nulling out pointers after you've
freed what they point at.
2016-12-24 12:02:10 +00:00
James Coglan 5f1a789e3b Null out member pointers after freeing them in destroy() functions. 2016-12-24 11:02:00 +00:00
James Coglan 75ccaa2e2a Make the benchmark frame generator work on 1.9. 2016-12-24 02:03:03 +00:00
James Coglan 29321d3867 The 'masking' field of wsd_Parser is not needed; it's a serialisation setting not a parsing one. 2016-12-24 00:34:16 +00:00
James Coglan 67de925527 Define _GNU_SOURCE in parser.c rather than parser.h to fix asprintf() warning (thanks @mjg59). 2016-12-23 23:25:20 +00:00
James Coglan 285a14d4cc Put the on_frame callback at the end of websocket_parser.c. 2016-12-23 23:22:52 +00:00
James Coglan 430ae06161 Use PRIu64 to print uint64_t. 2016-12-23 23:05:02 +00:00
James Coglan 87f93d2d6a define _GNU_SOURCE to silence warnings about asprintf. 2016-12-23 22:56:56 +00:00
James Coglan a269b58d09 Wrap wsd_Queue_each in braces to prevent 'C90 forbids mixed declarations and code' warnings. 2016-12-23 22:34:42 +00:00
James Coglan 51da1913ac Deal with most of the C90 'forbids mixed declarations and code' warnings. 2016-12-23 22:24:29 +00:00
James Coglan a6db9856b1 Include stdint.h to see if it fixes the build on Travis. 2016-12-23 21:58:50 +00:00
James Coglan 8d1792941f Introduce the Observer type for adding callbacks into the parser. 2016-12-23 21:54:55 +00:00
James Coglan 5e23116c6e Split the C parser up into multiple files, one per 'class'. 2016-12-23 21:22:21 +00:00
James Coglan 4772f71114 Put in more checks to the C parser to make sure each bit of the parser works, and begin putting in parser error handling. 2016-12-23 20:58:24 +00:00
James Coglan 11349c56b7 Queue.tail should be set to NULL if the current count is 1; count is not decremented until the end of the function. 2016-12-23 08:49:00 +00:00
James Coglan a4ed6af167 Align names of forward declarations; it makes them easier for me to read. 2016-12-23 08:46:45 +00:00
James Coglan 2e6d2b070d Begin a minimum-viable parser in C. 2016-12-22 21:10:33 +00:00