]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
app-layer: update all protocols to accept NULL+EOF
authorVictor Julien <victor@inliniac.net>
Thu, 11 Jun 2015 14:54:52 +0000 (16:54 +0200)
committerVictor Julien <victor@inliniac.net>
Thu, 18 Jun 2015 15:19:44 +0000 (17:19 +0200)
Update all non-HTTP protocol parsers to accept a NULL+EOF input.

src/app-layer-dcerpc-udp.c
src/app-layer-dcerpc.c
src/app-layer-dns-tcp.c
src/app-layer-dns-udp.c
src/app-layer-ftp.c
src/app-layer-modbus.c
src/app-layer-smb.c
src/app-layer-smb2.c
src/app-layer-smtp.c
src/app-layer-ssh.c
src/app-layer-ssl.c

index 9dedeee59e2e4430b9bdaa693ff78938767d2721..e42c96804e4e5153746b8ee68b4554ef3c4f7bbd 100644 (file)
@@ -714,6 +714,10 @@ static int DCERPCUDPParse(Flow *f, void *dcerpc_state,
        int hdrretval = 0;
        SCEnter();
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
        DCERPCUDPState *sstate = (DCERPCUDPState *) dcerpc_state;
        while (sstate->bytesprocessed < DCERPC_UDP_HDR_LEN && input_len) {
                hdrretval = DCERPCUDPParseHeader(f, dcerpc_state, pstate, input,
index d7198ba586d1205c21c31d22c0f9f32c565baba2..bbfb33006790810bdf46329ece3d5a5f34baaa17 100644 (file)
@@ -1911,6 +1911,10 @@ static int DCERPCParse(Flow *f, void *dcerpc_state,
     int32_t retval = 0;
     DCERPCState *sstate = (DCERPCState *) dcerpc_state;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     if (sstate->dcerpc.bytesprocessed != 0 && sstate->data_needed_for_dir != dir) {
         SCReturnInt(-1);
     }
index 840a0f8086e51f14aefa43c22420076f460bc78e..80a48507ee4dd0fc66186e80907bf62ad345afdc 100644 (file)
@@ -280,12 +280,16 @@ static int DNSTCPRequestParse(Flow *f, void *dstate,
     DNSState *dns_state = (DNSState *)dstate;
     SCLogDebug("starting %u", input_len);
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     /** \todo remove this when PP is fixed to enforce ipproto */
     if (f != NULL && f->proto != IPPROTO_TCP)
         SCReturnInt(-1);
 
     /* probably a rst/fin sending an eof */
-    if (input_len == 0) {
+    if (input == NULL || input_len == 0) {
         goto insufficient_data;
     }
 
@@ -490,6 +494,10 @@ static int DNSTCPResponseParse(Flow *f, void *dstate,
 {
     DNSState *dns_state = (DNSState *)dstate;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     /** \todo remove this when PP is fixed to enforce ipproto */
     if (f != NULL && f->proto != IPPROTO_TCP)
         SCReturnInt(-1);
index eb87849c5211d10df3b39cf38ba13888ba6fc5a1..e3ee01ffab43de51acff662ace5195d00847af70 100644 (file)
@@ -62,11 +62,15 @@ static int DNSUDPRequestParse(Flow *f, void *dstate,
 
     SCLogDebug("starting %u", input_len);
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     /** \todo remove this when PP is fixed to enforce ipproto */
     if (f != NULL && f->proto != IPPROTO_UDP)
         SCReturnInt(-1);
 
-    if (input_len == 0 || input_len < sizeof(DNSHeader)) {
+    if (input == NULL || input_len == 0 || input_len < sizeof(DNSHeader)) {
         SCLogDebug("ilen too small, hoped for at least %"PRIuMAX, (uintmax_t)sizeof(DNSHeader));
         goto insufficient_data;
     }
@@ -168,11 +172,15 @@ static int DNSUDPResponseParse(Flow *f, void *dstate,
 
     SCLogDebug("starting %u", input_len);
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     /** \todo remove this when PP is fixed to enforce ipproto */
     if (f != NULL && f->proto != IPPROTO_UDP)
         SCReturnInt(-1);
 
-    if (input_len == 0 || input_len < sizeof(DNSHeader)) {
+    if (input == NULL || input_len == 0 || input_len < sizeof(DNSHeader)) {
         SCLogDebug("ilen too small, hoped for at least %"PRIuMAX, (uintmax_t)sizeof(DNSHeader));
         goto insufficient_data;
     }
index b4a4d6f8e8bd6de47c3317ddf4601f3660d827ff..1ba1844615375c022ae47a97c2aafe2759be7f1a 100644 (file)
@@ -219,6 +219,10 @@ static int FTPParseRequest(Flow *f, void *ftp_state,
     FtpState *state = (FtpState *)ftp_state;
     void *ptmp;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     state->input = input;
     state->input_len = input_len;
     /* toserver stream */
index 16ab40d0b0dc89b2795ec1db56fa604562ebe022..9e9ba03741bed6e59a129f51ae04460e6c06ef56 100644 (file)
@@ -1227,6 +1227,10 @@ static int ModbusParseRequest(Flow                  *f,
     ModbusTransaction   *tx;
     ModbusHeader        header;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     while (input_len > 0) {
         uint32_t    adu_len = input_len;
         uint8_t     *adu = input;
@@ -1284,6 +1288,10 @@ static int ModbusParseResponse(Flow                 *f,
     ModbusState         *modbus = (ModbusState *) state;
     ModbusTransaction   *tx;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     while (input_len > 0) {
         uint32_t    adu_len = input_len;
         uint8_t     *adu = input;
index b7ae55d3d19650600c51d9a80b4540496dd72cd3..c5021031525c3c118a61c7c83c2563fbed6de32e 100644 (file)
@@ -1172,6 +1172,10 @@ static int SMBParse(Flow *f, void *smb_state, AppLayerParserState *pstate,
         SCReturnInt(0);
     }
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     if (sstate->bytesprocessed != 0 && sstate->data_needed_for_dir != dir) {
         SCReturnInt(-1);
     }
index 6a49bd751c1d2e713e53f60ba99e19ce1a763975..3c591e913a2c38f317ac38d84eec8d90ca1748c5 100644 (file)
@@ -532,6 +532,10 @@ static int SMB2Parse(Flow *f, void *smb2_state, AppLayerParserState *pstate,
     if (pstate == NULL)
         return -1;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     while (sstate->bytesprocessed <  NBSS_HDR_LEN && input_len) {
         retval = NBSSParseHeader(smb2_state, pstate, input, input_len);
         if (retval <= input_len) {
index bbfa7ae932026dfd42f5face48901d51624b61f8..7f398a6e7d65a02e59b5e0b65fa7335127b2cd4a 100644 (file)
@@ -1065,6 +1065,10 @@ static int SMTPParse(int direction, Flow *f, SMTPState *state,
 {
     SCEnter();
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     state->input = input;
     state->input_len = input_len;
     state->direction = direction;
index 9d610b8c6b8e878323bc9a9611a52a8e5f17cc34..fda60c1cf50b7986cc4c741ec5c1d009d983075f 100644 (file)
@@ -422,6 +422,10 @@ static int SSHParseRequest(Flow *f, void *state, AppLayerParserState *pstate,
     SshState *ssh_state = (SshState *)state;
     SshHeader *ssh_header = &ssh_state->cli_hdr;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     int r = SSHParseData(ssh_state, ssh_header, input, input_len);
 
     if (ssh_state->cli_hdr.flags & SSH_FLAG_PARSER_DONE &&
@@ -440,6 +444,10 @@ static int SSHParseResponse(Flow *f, void *state, AppLayerParserState *pstate,
     SshState *ssh_state = (SshState *)state;
     SshHeader *ssh_header = &ssh_state->srv_hdr;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     int r = SSHParseData(ssh_state, ssh_header, input, input_len);
 
     if (ssh_state->cli_hdr.flags & SSH_FLAG_PARSER_DONE &&
index d980b00abd67b0e1b3408270802439897057e234..0800c1db3d80c5f1af256db0a55885fdd2338e0f 100644 (file)
@@ -974,6 +974,10 @@ static int SSLDecode(Flow *f, uint8_t direction, void *alstate, AppLayerParserSt
 
     ssl_state->f = f;
 
+    if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) {
+        SCReturnInt(1);
+    }
+
     if (direction == 0)
         ssl_state->curr_connp = &ssl_state->client_connp;
     else