GitHub PullRequestReviewCommentEvent at 2014-08-20 11:22:52
Repository: suricata
Actor: inliniac
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/inliniac/suricata/pulls/comments/16470113","id":16470113,"diff_hunk":"@@ -0,0 +1,1159 @@\n+/*\n+ * Copyright (C) 2014 ANSSI\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions\n+ * are met:\n+ * 1. Redistributions of source code must retain the above copyright\n+ *    notice, this list of conditions and the following disclaimer.\n+ * 2. Redistributions in binary form must reproduce the above copyright\n+ *    notice, this list of conditions and the following disclaimer in the\n+ *    documentation and/or other materials provided with the distribution.\n+ * 3. The name of the author may not be used to endorse or promote products\n+ *    derived from this software without specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL\n+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+/** \\file\n+ *\n+ *  \\author David DIALLO <diallo@et.esiea.fr>\n+ *\n+ *  Based on detect-engine-dns.c\n+ */\n+\n+#include \"suricata-common.h\"\n+\n+#include \"app-layer.h\"\n+#include \"app-layer-modbus.h\"\n+\n+#include \"detect.h\"\n+#include \"detect-modbus.h\"\n+\n+#include \"detect-engine-modbus.h\"\n+\n+#include \"flow.h\"\n+\n+#include \"util-debug.h\"\n+\n+/** \\internal\n+ *\n+ * \\brief Value match detection code\n+ *\n+ *  \\param  value   Modbus value context (min, max and mode)\n+ *  \\param  min     Minimum value to compare\n+ *  \\param  inter   Interval or maximum (min + inter) value to compare\n+ *\n+ *  \\retval 1 match or 0 no match\n+ */\n+static int DetectEngineInspectModbusValueMatch(DetectModbusValue    *value,\n+                                               uint16_t             min,\n+                                               uint16_t             inter)\n+{\n+    SCEnter();\n+    uint16_t max = min + inter;\n+\n+    int ret = 0;\n+\n+    switch (value->mode) {\n+        case DETECT_MODBUS_EQ:\n+            if ((value->min >= min) && (value->min <= max))\n+                ret = 1;\n+            break;\n+\n+        case DETECT_MODBUS_LT:\n+            if (value->min > min)\n+                ret = 1;\n+            break;\n+\n+        case DETECT_MODBUS_GT:\n+            if (value->min < max)\n+                ret = 1;\n+            break;\n+\n+        case DETECT_MODBUS_RA:\n+            if ((value->max > min) && (value->min < max))\n+                ret = 1;\n+            break;\n+    }\n+\n+    SCReturnInt(ret);\n+}\n+\n+/** \\internal\n+ *\n+ * \\brief Do data (and address) inspection & validation for a signature\n+ *\n+ *  \\param tx       Pointer to Modbus Transaction\n+ *  \\param address  Address inspection\n+ *  \\param data     Pointer to data signature structure to match\n+ *\n+ *  \\retval 0 no match or 1 match\n+ */\n+static int DetectEngineInspectModbusData(ModbusTransaction  *tx,\n+                                         uint16_t           address,\n+                                         DetectModbusValue  *data)\n+{\n+    SCEnter();\n+    uint16_t offset, value, type = tx->type;\n+\n+    if (type & MODBUS_TYP_SINGLE) {\n+        /* Output/Register(s) Value */\n+        if (type & MODBUS_TYP_COILS)\n+            value = (tx->data[0])? 1 : 0;\n+        else\n+            value = tx->data[0];\n+    } else if (type & MODBUS_TYP_MULTIPLE) {\n+        int i, size = (int) sizeof(tx->data);\n+\n+        offset = address - (tx->write.address + 1);\n+\n+        /* In case of Coils, offset is in bit (convert in byte) */\n+        if (type & MODBUS_TYP_COILS)\n+            offset >>= 3;\n+\n+        for (i=0; i< size; i++) {\n+            /* Select the correct register/coils amongst the output value */\n+            if (!(offset--)) {\n+                value = tx->data[i];\n+                break;\n+            }\n+        }\n+\n+        /* In case of Coils,  offset is now in the bit is the rest of previous convert */\n+        if (type & MODBUS_TYP_COILS) {\n+            offset  = (address - (tx->write.address + 1)) & 0x7;\n+            value   = (value >> offset) & 0x1;\n+        }\n+    } else {\n+        /* It is not possible to define the value that is writing for Mask      */\n+        /* Write Register function because the current content is not available.*/\n+        SCReturnInt(0);\n+    }\n+\n+    SCReturnInt(DetectEngineInspectModbusValueMatch(data, value, 0));\n+}\n+\n+/** \\internal\n+ *\n+ * \\brief Do address inspection & validation for a signature\n+ *\n+ *  \\param tx       Pointer to Modbus Transaction\n+ *  \\param address  Pointer to address signature structure to match\n+ *  \\param access   Access mode (READ or WRITE)\n+ *\n+ *  \\retval 0 no match or 1 match\n+ */\n+static int DetectEngineInspectModbusAddress(ModbusTransaction   *tx,\n+                                            DetectModbusValue   *address,\n+                                            uint8_t             access)\n+{\n+    SCEnter();\n+    int ret = 0;\n+\n+    /* Check if read/write address of request is at/in the address range of signature */\n+    if (access == MODBUS_TYP_READ) {\n+        ret = DetectEngineInspectModbusValueMatch(address,\n+                                                  tx->read.address + 1,\n+                                                  tx->read.quantity);\n+    } else {\n+        if (tx->type & MODBUS_TYP_SINGLE)\n+            ret = DetectEngineInspectModbusValueMatch(address,\n+                                                      tx->write.address + 1,\n+                                                      0);\n+        else\n+            ret = DetectEngineInspectModbusValueMatch(address,\n+                                                      tx->write.address + 1,\n+                                                      tx->write.quantity);\n+    }\n+\n+    SCReturnInt(ret);\n+}\n+\n+/** \\brief Do the content inspection & validation for a signature\n+ *\n+ *  \\param de_ctx   Detection engine context\n+ *  \\param det_ctx  Detection engine thread context\n+ *  \\param s        Signature to inspect ( and sm: SigMatch to inspect)\n+ *  \\param f        Flow\n+ *  \\param flags    App layer flags\n+ *  \\param alstate  App layer state\n+ *  \\param txv      Pointer to Modbus Transaction structure\n+ *\n+ *  \\retval 0 no match or 1 match\n+ */\n+int DetectEngineInspectModbus(ThreadVars            *tv,","path":"src/detect-engine-modbus.c","position":195,"original_position":195,"commit_id":"1b7596403bdfedd912f8d893721a38bf283070bd","original_commit_id":"1b7596403bdfedd912f8d893721a38bf283070bd","user":{"login":"inliniac","id":719366,"avatar_url":"https://avatars.githubusercontent.com/u/719366?v=2","gravatar_id":"cc8333b48592316430132a9f18618f68","url":"https://api.github.com/users/inliniac","html_url":"https://github.com/inliniac","followers_url":"https://api.github.com/users/inliniac/followers","following_url":"https://api.github.com/users/inliniac/following{/other_user}","gists_url":"https://api.github.com/users/inliniac/gists{/gist_id}","starred_url":"https://api.github.com/users/inliniac/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inliniac/subscriptions","organizations_url":"https://api.github.com/users/inliniac/orgs","repos_url":"https://api.github.com/users/inliniac/repos","events_url":"https://api.github.com/users/inliniac/events{/privacy}","received_events_url":"https://api.github.com/users/inliniac/received_events","type":"User","site_admin":false},"body":"If I'm reading the code correctly, it seems that this 'inspection engine' only considers the first 'SigMatch' from the sm_list DETECT_SM_LIST_MODBUS_MATCH. This means that we're having a one modbus keyword per rule limit. This is not how the rule language is intended to work. Is this an deliberate choice?","created_at":"2014-08-20T11:22:52Z","updated_at":"2014-08-20T11:22:52Z","html_url":"https://github.com/inliniac/suricata/pull/1113#discussion_r16470113","pull_request_url":"https://api.github.com/repos/inliniac/suricata/pulls/1113","_links":{"self":{"href":"https://api.github.com/repos/inliniac/suricata/pulls/comments/16470113"},"html":{"href":"https://github.com/inliniac/suricata/pull/1113#discussion_r16470113"},"pull_request":{"href":"https://api.github.com/repos/inliniac/suricata/pulls/1113"}}},"pull_request":{"url":"https://api.github.com/repos/inliniac/suricata/pulls/1113","id":19977343,"html_url":"https://github.com/inliniac/suricata/pull/1113","diff_url":"https://github.com/inliniac/suricata/pull/1113.diff","patch_url":"https://github.com/inliniac/suricata/pull/1113.patch","issue_url":"https://api.github.com/repos/inliniac/suricata/issues/1113","number":1113,"state":"open","locked":false,"title":"Modbus feature 639 v1.3","user":{"login":"diallo-esiea","id":8361537,"avatar_url":"https://avatars.githubusercontent.com/u/8361537?v=2","gravatar_id":"25c0b54f4017c9a1cff17e8663033e2c","url":"https://api.github.com/users/diallo-esiea","html_url":"https://github.com/diallo-esiea","followers_url":"https://api.github.com/users/diallo-esiea/followers","following_url":"https://api.github.com/users/diallo-esiea/following{/other_user}","gists_url":"https://api.github.com/users/diallo-esiea/gists{/gist_id}","starred_url":"https://api.github.com/users/diallo-esiea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diallo-esiea/subscriptions","organizations_url":"https://api.github.com/users/diallo-esiea/orgs","repos_url":"https://api.github.com/users/diallo-esiea/repos","events_url":"https://api.github.com/users/diallo-esiea/events{/privacy}","received_events_url":"https://api.github.com/users/diallo-esiea/received_events","type":"User","site_admin":false},"body":"This pull request adds support for Modbus protocol.\r\n\r\n2 new keywords : modbus.function and modbus.access.","created_at":"2014-08-19T12:37:23Z","updated_at":"2014-08-20T11:22:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f1340b1190a5d34038c82ce63d71a5f68edaa2e6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/inliniac/suricata/pulls/1113/commits","review_comments_url":"https://api.github.com/repos/inliniac/suricata/pulls/1113/comments","review_comment_url":"https://api.github.com/repos/inliniac/suricata/pulls/comments/{number}","comments_url":"https://api.github.com/repos/inliniac/suricata/issues/1113/comments","statuses_url":"https://api.github.com/repos/inliniac/suricata/statuses/1b7596403bdfedd912f8d893721a38bf283070bd","head":{"label":"diallo-esiea:modbus-feature-639-v1.3","ref":"modbus-feature-639-v1.3","sha":"1b7596403bdfedd912f8d893721a38bf283070bd","user":{"login":"diallo-esiea","id":8361537,"avatar_url":"https://avatars.githubusercontent.com/u/8361537?v=2","gravatar_id":"25c0b54f4017c9a1cff17e8663033e2c","url":"https://api.github.com/users/diallo-esiea","html_url":"https://github.com/diallo-esiea","followers_url":"https://api.github.com/users/diallo-esiea/followers","following_url":"https://api.github.com/users/diallo-esiea/following{/other_user}","gists_url":"https://api.github.com/users/diallo-esiea/gists{/gist_id}","starred_url":"https://api.github.com/users/diallo-esiea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diallo-esiea/subscriptions","organizations_url":"https://api.github.com/users/diallo-esiea/orgs","repos_url":"https://api.github.com/users/diallo-esiea/repos","events_url":"https://api.github.com/users/diallo-esiea/events{/privacy}","received_events_url":"https://api.github.com/users/diallo-esiea/received_events","type":"User","site_admin":false},"repo":{"id":22638913,"name":"suricata","full_name":"diallo-esiea/suricata","owner":{"login":"diallo-esiea","id":8361537,"avatar_url":"https://avatars.githubusercontent.com/u/8361537?v=2","gravatar_id":"25c0b54f4017c9a1cff17e8663033e2c","url":"https://api.github.com/users/diallo-esiea","html_url":"https://github.com/diallo-esiea","followers_url":"https://api.github.com/users/diallo-esiea/followers","following_url":"https://api.github.com/users/diallo-esiea/following{/other_user}","gists_url":"https://api.github.com/users/diallo-esiea/gists{/gist_id}","starred_url":"https://api.github.com/users/diallo-esiea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diallo-esiea/subscriptions","organizations_url":"https://api.github.com/users/diallo-esiea/orgs","repos_url":"https://api.github.com/users/diallo-esiea/repos","events_url":"https://api.github.com/users/diallo-esiea/events{/privacy}","received_events_url":"https://api.github.com/users/diallo-esiea/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/diallo-esiea/suricata","description":"Mirror of the official OISF Suricata git repository","fork":true,"url":"https://api.github.com/repos/diallo-esiea/suricata","forks_url":"https://api.github.com/repos/diallo-esiea/suricata/forks","keys_url":"https://api.github.com/repos/diallo-esiea/suricata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/diallo-esiea/suricata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/diallo-esiea/suricata/teams","hooks_url":"https://api.github.com/repos/diallo-esiea/suricata/hooks","issue_events_url":"https://api.github.com/repos/diallo-esiea/suricata/issues/events{/number}","events_url":"https://api.github.com/repos/diallo-esiea/suricata/events","assignees_url":"https://api.github.com/repos/diallo-esiea/suricata/assignees{/user}","branches_url":"https://api.github.com/repos/diallo-esiea/suricata/branches{/branch}","tags_url":"https://api.github.com/repos/diallo-esiea/suricata/tags","blobs_url":"https://api.github.com/repos/diallo-esiea/suricata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/diallo-esiea/suricata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/diallo-esiea/suricata/git/refs{/sha}","trees_url":"https://api.github.com/repos/diallo-esiea/suricata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/diallo-esiea/suricata/statuses/{sha}","languages_url":"https://api.github.com/repos/diallo-esiea/suricata/languages","stargazers_url":"https://api.github.com/repos/diallo-esiea/suricata/stargazers","contributors_url":"https://api.github.com/repos/diallo-esiea/suricata/contributors","subscribers_url":"https://api.github.com/repos/diallo-esiea/suricata/subscribers","subscription_url":"https://api.github.com/repos/diallo-esiea/suricata/subscription","commits_url":"https://api.github.com/repos/diallo-esiea/suricata/commits{/sha}","git_commits_url":"https://api.github.com/repos/diallo-esiea/suricata/git/commits{/sha}","comments_url":"https://api.github.com/repos/diallo-esiea/suricata/comments{/number}","issue_comment_url":"https://api.github.com/repos/diallo-esiea/suricata/issues/comments/{number}","contents_url":"https://api.github.com/repos/diallo-esiea/suricata/contents/{+path}","compare_url":"https://api.github.com/repos/diallo-esiea/suricata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/diallo-esiea/suricata/merges","archive_url":"https://api.github.com/repos/diallo-esiea/suricata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/diallo-esiea/suricata/downloads","issues_url":"https://api.github.com/repos/diallo-esiea/suricata/issues{/number}","pulls_url":"https://api.github.com/repos/diallo-esiea/suricata/pulls{/number}","milestones_url":"https://api.github.com/repos/diallo-esiea/suricata/milestones{/number}","notifications_url":"https://api.github.com/repos/diallo-esiea/suricata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/diallo-esiea/suricata/labels{/name}","releases_url":"https://api.github.com/repos/diallo-esiea/suricata/releases{/id}","created_at":"2014-08-05T09:56:56Z","updated_at":"2014-08-03T19:40:26Z","pushed_at":"2014-08-19T12:34:04Z","git_url":"git://github.com/diallo-esiea/suricata.git","ssh_url":"git@github.com:diallo-esiea/suricata.git","clone_url":"https://github.com/diallo-esiea/suricata.git","svn_url":"https://github.com/diallo-esiea/suricata","homepage":"http://suricata-ids.org/","size":37296,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"inliniac:master","ref":"master","sha":"fdcc7d18e7d9eea2ccf89f5b0b7a8b69321ef466","user":{"login":"inliniac","id":719366,"avatar_url":"https://avatars.githubusercontent.com/u/719366?v=2","gravatar_id":"cc8333b48592316430132a9f18618f68","url":"https://api.github.com/users/inliniac","html_url":"https://github.com/inliniac","followers_url":"https://api.github.com/users/inliniac/followers","following_url":"https://api.github.com/users/inliniac/following{/other_user}","gists_url":"https://api.github.com/users/inliniac/gists{/gist_id}","starred_url":"https://api.github.com/users/inliniac/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inliniac/subscriptions","organizations_url":"https://api.github.com/users/inliniac/orgs","repos_url":"https://api.github.com/users/inliniac/repos","events_url":"https://api.github.com/users/inliniac/events{/privacy}","received_events_url":"https://api.github.com/users/inliniac/received_events","type":"User","site_admin":false},"repo":{"id":5410234,"name":"suricata","full_name":"inliniac/suricata","owner":{"login":"inliniac","id":719366,"avatar_url":"https://avatars.githubusercontent.com/u/719366?v=2","gravatar_id":"cc8333b48592316430132a9f18618f68","url":"https://api.github.com/users/inliniac","html_url":"https://github.com/inliniac","followers_url":"https://api.github.com/users/inliniac/followers","following_url":"https://api.github.com/users/inliniac/following{/other_user}","gists_url":"https://api.github.com/users/inliniac/gists{/gist_id}","starred_url":"https://api.github.com/users/inliniac/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inliniac/subscriptions","organizations_url":"https://api.github.com/users/inliniac/orgs","repos_url":"https://api.github.com/users/inliniac/repos","events_url":"https://api.github.com/users/inliniac/events{/privacy}","received_events_url":"https://api.github.com/users/inliniac/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/inliniac/suricata","description":"Mirror of the official OISF Suricata git repository","fork":false,"url":"https://api.github.com/repos/inliniac/suricata","forks_url":"https://api.github.com/repos/inliniac/suricata/forks","keys_url":"https://api.github.com/repos/inliniac/suricata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/inliniac/suricata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/inliniac/suricata/teams","hooks_url":"https://api.github.com/repos/inliniac/suricata/hooks","issue_events_url":"https://api.github.com/repos/inliniac/suricata/issues/events{/number}","events_url":"https://api.github.com/repos/inliniac/suricata/events","assignees_url":"https://api.github.com/repos/inliniac/suricata/assignees{/user}","branches_url":"https://api.github.com/repos/inliniac/suricata/branches{/branch}","tags_url":"https://api.github.com/repos/inliniac/suricata/tags","blobs_url":"https://api.github.com/repos/inliniac/suricata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/inliniac/suricata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/inliniac/suricata/git/refs{/sha}","trees_url":"https://api.github.com/repos/inliniac/suricata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/inliniac/suricata/statuses/{sha}","languages_url":"https://api.github.com/repos/inliniac/suricata/languages","stargazers_url":"https://api.github.com/repos/inliniac/suricata/stargazers","contributors_url":"https://api.github.com/repos/inliniac/suricata/contributors","subscribers_url":"https://api.github.com/repos/inliniac/suricata/subscribers","subscription_url":"https://api.github.com/repos/inliniac/suricata/subscription","commits_url":"https://api.github.com/repos/inliniac/suricata/commits{/sha}","git_commits_url":"https://api.github.com/repos/inliniac/suricata/git/commits{/sha}","comments_url":"https://api.github.com/repos/inliniac/suricata/comments{/number}","issue_comment_url":"https://api.github.com/repos/inliniac/suricata/issues/comments/{number}","contents_url":"https://api.github.com/repos/inliniac/suricata/contents/{+path}","compare_url":"https://api.github.com/repos/inliniac/suricata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/inliniac/suricata/merges","archive_url":"https://api.github.com/repos/inliniac/suricata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/inliniac/suricata/downloads","issues_url":"https://api.github.com/repos/inliniac/suricata/issues{/number}","pulls_url":"https://api.github.com/repos/inliniac/suricata/pulls{/number}","milestones_url":"https://api.github.com/repos/inliniac/suricata/milestones{/number}","notifications_url":"https://api.github.com/repos/inliniac/suricata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/inliniac/suricata/labels{/name}","releases_url":"https://api.github.com/repos/inliniac/suricata/releases{/id}","created_at":"2012-08-14T08:30:06Z","updated_at":"2014-08-17T06:35:44Z","pushed_at":"2014-08-19T15:58:57Z","git_url":"git://github.com/inliniac/suricata.git","ssh_url":"git@github.com:inliniac/suricata.git","clone_url":"https://github.com/inliniac/suricata.git","svn_url":"https://github.com/inliniac/suricata","homepage":"http://suricata-ids.org/","size":56552,"stargazers_count":92,"watchers_count":92,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":116,"mirror_url":null,"open_issues_count":17,"forks":116,"open_issues":17,"watchers":92,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/inliniac/suricata/pulls/1113"},"html":{"href":"https://github.com/inliniac/suricata/pull/1113"},"issue":{"href":"https://api.github.com/repos/inliniac/suricata/issues/1113"},"comments":{"href":"https://api.github.com/repos/inliniac/suricata/issues/1113/comments"},"review_comments":{"href":"https://api.github.com/repos/inliniac/suricata/pulls/1113/comments"},"review_comment":{"href":"https://api.github.com/repos/inliniac/suricata/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/inliniac/suricata/pulls/1113/commits"},"statuses":{"href":"https://api.github.com/repos/inliniac/suricata/statuses/1b7596403bdfedd912f8d893721a38bf283070bd"}}}}