Skip to content

Commit

Permalink
rem/aufile: test and fix aufile_set_position nread (#1010)
Browse files Browse the repository at this point in the history
Also fix a bug: wav files can contain data after the data chunk. If we don't update nread in aufile_set_position, we can read invalid data.
  • Loading branch information
larsimmisch authored Nov 23, 2023
1 parent e097b7f commit 544b1db
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 0 deletions.
4 changes: 4 additions & 0 deletions rem/aufile/aufile.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,12 @@ int aufile_set_position(struct aufile *af, const struct aufile_prm *prm,
off_t pos = (off_t)(prm->srate * aufmt_sample_size(prm->fmt)
* prm->channels * pos_ms / 1000);

pos = min((off_t)datasize, pos);

if (fseek(af->f, pos, SEEK_CUR) < 0)
return errno;

af->nread = pos;

return 0;
}
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ set(SRCS
aubuf.c
aulength.c
aulevel.c
aupos.c
auresamp.c
av1.c
base64.c
Expand Down
61 changes: 61 additions & 0 deletions test/aupos.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* @file src/aupos.c audio file setposition test
*
* Copyright (C) 2023 Lars Immisch
*/

#include <re.h>
#include <rem.h>
#include "test.h"


#define DEBUG_MODULE "auposition"
#define DEBUG_LEVEL 5
#include <re_dbg.h>


int test_auposition(void)
{
struct aufile *af = NULL;
struct aufile_prm prm;
char path[256];
uint8_t buffer[512];

re_snprintf(path, sizeof(path), "%s/beep.wav", test_datapath());

int err = aufile_open(&af, &prm, path, AUFILE_READ);
TEST_ERR(err);

err = aufile_set_position(af, &prm, 67);
TEST_ERR(err);

/* That file is exactly 67 ms long, so we shouldn't read anything */
size_t size = sizeof(buffer);
err = aufile_read(af, buffer, &size);
TEST_ERR(err);

/* It's possible we read data up to a ms */
TEST_ASSERT(size < 16);

af = mem_deref(af);

err = aufile_open(&af, &prm, path, AUFILE_READ);
TEST_ERR(err);

err = aufile_set_position(af, &prm, 37);
TEST_ERR(err);

size = sizeof(buffer);
err = aufile_read(af, buffer, &size);
TEST_ERR(err);

/* 30 ms should be left, at 8000Hz/s, one channels and 16 bit samples
that's 480 bytes */
TEST_ASSERT(size - 480 < 16);


out:
mem_deref(af);

return err;
}
Binary file modified test/data/beep.wav
Binary file not shown.
1 change: 1 addition & 0 deletions test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ static const struct test tests[] = {
TEST(test_aubuf),
TEST(test_aulength),
TEST(test_aulevel),
TEST(test_auposition),
TEST(test_auresamp),
TEST(test_async),
TEST(test_av1),
Expand Down
1 change: 1 addition & 0 deletions test/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ int test_aes_gcm(void);
int test_aubuf(void);
int test_aulevel(void);
int test_aulength(void);
int test_auposition(void);
int test_auresamp(void);
int test_async(void);
int test_av1(void);
Expand Down

0 comments on commit 544b1db

Please sign in to comment.