http: more consistent return values for HTPFileOpenWithRange

pull/6409/head
Philippe Antoine 4 years ago
parent bb7cc6f5e3
commit 7819f3262f

@ -258,8 +258,6 @@ static int HTPParseAndCheckContentRange(
* *
* \retval 0 ok * \retval 0 ok
* \retval -1 error * \retval -1 error
* \retval -2 error parsing
* \retval -3 error negative end in range
*/ */
int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filename, int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filename,
uint16_t filename_len, const uint8_t *data, uint32_t data_len, uint64_t txid, uint16_t filename_len, const uint8_t *data, uint32_t data_len, uint64_t txid,
@ -268,13 +266,12 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
SCEnter(); SCEnter();
uint16_t flags; uint16_t flags;
if (s == NULL) { DEBUG_VALIDATE_BUG_ON(s == NULL);
SCReturnInt(-1);
}
// This function is only called STREAM_TOCLIENT from HtpResponseBodyHandle // This function is only called STREAM_TOCLIENT from HtpResponseBodyHandle
HtpContentRange crparsed; HtpContentRange crparsed;
if (HTPParseAndCheckContentRange(rawvalue, &crparsed, s, htud) != 0) { if (HTPParseAndCheckContentRange(rawvalue, &crparsed, s, htud) != 0) {
// range is invalid, fall back to classic open
return HTPFileOpen( return HTPFileOpen(
s, txud, filename, (uint32_t)filename_len, data, data_len, txid, STREAM_TOCLIENT); s, txud, filename, (uint32_t)filename_len, data, data_len, txid, STREAM_TOCLIENT);
} }
@ -291,11 +288,13 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
if (files == NULL) { if (files == NULL) {
s->files_tc = FileContainerAlloc(); s->files_tc = FileContainerAlloc();
if (s->files_tc == NULL) { if (s->files_tc == NULL) {
// no need to fall back to classic open if we cannot allocate the file container
SCReturnInt(-1); SCReturnInt(-1);
} }
files = s->files_tc; files = s->files_tc;
} }
// we open a file for this specific range
if (FileOpenFileWithId(files, &s->cfg->response.sbcfg, s->file_track_id++, filename, if (FileOpenFileWithId(files, &s->cfg->response.sbcfg, s->file_track_id++, filename,
filename_len, data, data_len, flags) != 0) { filename_len, data, data_len, flags) != 0) {
SCReturnInt(-1); SCReturnInt(-1);
@ -306,6 +305,8 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
if (FileSetRange(files, crparsed.start, crparsed.end) < 0) { if (FileSetRange(files, crparsed.start, crparsed.end) < 0) {
SCLogDebug("set range failed"); SCLogDebug("set range failed");
} }
// Then, we will try to handle reassembly of different ranges of the same file
htp_tx_t *tx = htp_list_get(s->conn->transactions, txid); htp_tx_t *tx = htp_list_get(s->conn->transactions, txid);
if (!tx) { if (!tx) {
SCReturnInt(-1); SCReturnInt(-1);
@ -323,16 +324,14 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
keyurl[keylen - 1] = 0; keyurl[keylen - 1] = 0;
} else { } else {
// do not reassemble file without host info // do not reassemble file without host info
return HTPFileOpen( SCReturnInt(0);
s, txud, filename, (uint32_t)filename_len, data, data_len, txid, STREAM_TOCLIENT);
} }
HttpRangeContainerFile *file_range_container = HttpRangeContainerFile *file_range_container =
HttpRangeContainerUrlGet(keyurl, keylen, &s->f->lastts); HttpRangeContainerUrlGet(keyurl, keylen, &s->f->lastts);
SCFree(keyurl); SCFree(keyurl);
if (file_range_container == NULL) { if (file_range_container == NULL) {
// probably reached memcap // probably reached memcap
return HTPFileOpen( SCReturnInt(-1);
s, txud, filename, (uint32_t)filename_len, data, data_len, txid, STREAM_TOCLIENT);
} }
DEBUG_VALIDATE_BUG_ON(s->file_range); DEBUG_VALIDATE_BUG_ON(s->file_range);
s->file_range = HttpRangeOpenFile(file_range_container, crparsed.start, crparsed.end, s->file_range = HttpRangeOpenFile(file_range_container, crparsed.start, crparsed.end,
@ -346,8 +345,7 @@ int HTPFileOpenWithRange(HtpState *s, HtpTxUserData *txud, const uint8_t *filena
THashDataUnlock(file_range_container->hdata); THashDataUnlock(file_range_container->hdata);
// probably reached memcap // probably reached memcap
return HTPFileOpen( SCReturnInt(-1);
s, txud, filename, (uint32_t)filename_len, data, data_len, txid, STREAM_TOCLIENT);
/* in some cases we don't take a reference, so decr use cnt */ /* in some cases we don't take a reference, so decr use cnt */
} else if (s->file_range->container == NULL) { } else if (s->file_range->container == NULL) {
THashDecrUsecnt(file_range_container->hdata); THashDecrUsecnt(file_range_container->hdata);

Loading…
Cancel
Save