*/
size_t fr_sbuff_extend_file(fr_sbuff_t *sbuff, size_t extension)
{
+ fr_sbuff_t *sbuff_i;
size_t read, available, total_read;
fr_sbuff_uctx_file_t *fctx;
}
read = fread(sbuff->end, 1, available, fctx->file);
- sbuff->end += read; /* Advance end, which increases fr_sbuff_remaining() */
+ for (sbuff_i = sbuff; sbuff_i; sbuff_i = sbuff_i->parent) {
+ sbuff_i->end += read; /* Advance end, which increases fr_sbuff_remaining() */
+ }
/** Check for errors
*/
static void test_file_extend(void)
{
fr_sbuff_t sbuff;
+ fr_sbuff_t our_sbuff;
fr_sbuff_uctx_file_t fctx;
FILE *fp;
char buff[16];
+ char out[16 + 1];
char fbuff[] = " xyzzy";
char *post_ws;
+ ssize_t slen;
TEST_CASE("Initialization");
fp = fmemopen(fbuff, sizeof(fbuff) - 1, "r");
TEST_CHECK(fp != NULL);
TEST_CHECK(fr_sbuff_init_file(&sbuff, &fctx, buff, sizeof(buff), fp, 128) == &sbuff);
+ our_sbuff = FR_SBUFF_BIND_CURRENT(&sbuff);
TEST_CASE("Advance past whitespace, which will require shift/extend");
- TEST_CHECK_LEN(sizeof(fbuff) - 6, fr_sbuff_adv_past_whitespace(&sbuff, SIZE_MAX, NULL));
+ TEST_CHECK_LEN(fr_sbuff_adv_past_whitespace(&our_sbuff, SIZE_MAX, NULL), sizeof(fbuff) - 6);
TEST_CASE("Verify that we passed all and only whitespace");
- (void) fr_sbuff_out_abstrncpy(NULL, &post_ws, &sbuff, 24);
+ (void) fr_sbuff_out_abstrncpy(NULL, &post_ws, &our_sbuff, 24);
TEST_CHECK_STRCMP(post_ws, "xyzzy");
talloc_free(post_ws);
+ TEST_CASE("Verify parent buffer end");
+ TEST_CHECK(sbuff.end == our_sbuff.end);
+
+ TEST_CASE("Verify that we do not read shifted buffer past eof");
+ slen = fr_sbuff_out_bstrncpy(&FR_SBUFF_OUT(out, sizeof(out)), &our_sbuff, SIZE_MAX);
+ TEST_CHECK_SLEN(slen, 0);
+ slen = fr_sbuff_out_bstrncpy_exact(&FR_SBUFF_OUT(out, sizeof(out)), &our_sbuff, SIZE_MAX);
+ TEST_CHECK_SLEN(slen, 0);
+ slen = fr_sbuff_out_bstrncpy_until(&FR_SBUFF_OUT(out, sizeof(out)), &our_sbuff, SIZE_MAX, NULL, NULL);
+ TEST_CHECK_SLEN(slen, 0);
+ slen = fr_sbuff_out_bstrncpy_allowed(&FR_SBUFF_OUT(out, sizeof(out)), &our_sbuff, SIZE_MAX, allow_lowercase_and_space);
+ TEST_CHECK_SLEN(slen, 0);
+
fclose(fp);
}