Skip to content

Commit dea35af

Browse files
[libc] Fix readlink tests on 32-bit systems
This patch changes the call sizeof(<Cstring>) to call malloc with the actual lenght of the string to allocate space for buf. The test case worked in 64-bit systems because the sizeof(CString) was big enough (19 bytes) to hold the contents of FILENAME, but in 32-bit systems sizeof(CString) is only 12 bytes long, causing a truncation of FILENAME when placing it in buf. I also changed the vla to a malloc instead to silence a "variable length arrays are a C99 feature [-Wvla-extension]" warning.
1 parent 997e5e8 commit dea35af

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

libc/test/src/unistd/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ add_libc_unittest(
262262
libc.include.unistd
263263
libc.src.errno.errno
264264
libc.src.unistd.readlink
265+
libc.src.string.string_utils
265266
libc.src.unistd.symlink
266267
libc.src.unistd.unlink
267268
libc.src.__support.CPP.string_view
@@ -279,6 +280,7 @@ add_libc_unittest(
279280
libc.include.unistd
280281
libc.src.errno.errno
281282
libc.src.unistd.readlinkat
283+
libc.src.string.string_utils
282284
libc.src.unistd.symlink
283285
libc.src.unistd.unlink
284286
libc.src.__support.CPP.string_view

libc/test/src/unistd/readlink_test.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "src/__support/CPP/string_view.h"
1010
#include "src/errno/libc_errno.h"
11+
#include "src/string/string_utils.h"
1112
#include "src/unistd/readlink.h"
1213
#include "src/unistd/symlink.h"
1314
#include "src/unistd/unlink.h"
@@ -30,17 +31,20 @@ TEST(LlvmLibcReadlinkTest, CreateAndUnlink) {
3031
// 3. Cleanup the symlink created in step #1.
3132
ASSERT_THAT(LIBC_NAMESPACE::symlink(LINK_VAL, LINK), Succeeds(0));
3233

33-
char buf[sizeof(LINK_VAL)];
34-
ssize_t len = LIBC_NAMESPACE::readlink(LINK, buf, sizeof(buf));
34+
size_t buf_len = LIBC_NAMESPACE::internal::string_length(FILENAME);
35+
char *buf = static_cast<char *>(malloc(buf_len));
36+
ssize_t len = LIBC_NAMESPACE::readlink(LINK, buf, buf_len);
3537
ASSERT_ERRNO_SUCCESS();
3638
ASSERT_EQ(cpp::string_view(buf, len), cpp::string_view(LINK_VAL));
3739

3840
ASSERT_THAT(LIBC_NAMESPACE::unlink(LINK), Succeeds(0));
41+
free(buf);
3942
}
4043

4144
TEST(LlvmLibcReadlinkTest, ReadlinkInNonExistentPath) {
4245
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
43-
char buf[8];
44-
ASSERT_THAT(LIBC_NAMESPACE::readlink("non-existent-link", buf, sizeof(buf)),
46+
constexpr auto len = 8;
47+
char buf[len];
48+
ASSERT_THAT(LIBC_NAMESPACE::readlink("non-existent-link", buf, len),
4549
Fails(ENOENT));
4650
}

libc/test/src/unistd/readlinkat_test.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "src/__support/CPP/string_view.h"
1010
#include "src/errno/libc_errno.h"
11+
#include "src/string/string_utils.h"
1112
#include "src/unistd/readlinkat.h"
1213
#include "src/unistd/symlink.h"
1314
#include "src/unistd/unlink.h"
@@ -32,18 +33,21 @@ TEST(LlvmLibcReadlinkatTest, CreateAndUnlink) {
3233
// 3. Cleanup the symlink created in step #1.
3334
ASSERT_THAT(LIBC_NAMESPACE::symlink(LINK_VAL, LINK), Succeeds(0));
3435

35-
char buf[sizeof(LINK_VAL)];
36-
ssize_t len = LIBC_NAMESPACE::readlinkat(AT_FDCWD, LINK, buf, sizeof(buf));
36+
size_t buf_len = LIBC_NAMESPACE::internal::string_length(FILENAME);
37+
char *buf = static_cast<char *>(malloc(buf_len));
38+
ssize_t len = LIBC_NAMESPACE::readlinkat(AT_FDCWD, LINK, buf, buf_len);
3739
ASSERT_ERRNO_SUCCESS();
3840
ASSERT_EQ(cpp::string_view(buf, len), cpp::string_view(LINK_VAL));
3941

4042
ASSERT_THAT(LIBC_NAMESPACE::unlink(LINK), Succeeds(0));
43+
free(buf);
4144
}
4245

4346
TEST(LlvmLibcReadlinkatTest, ReadlinkInNonExistentPath) {
4447
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
45-
char buf[8];
46-
ASSERT_THAT(LIBC_NAMESPACE::readlinkat(AT_FDCWD, "non-existent-link", buf,
47-
sizeof(buf)),
48-
Fails(ENOENT));
48+
constexpr auto len = 8;
49+
char buf[len];
50+
ASSERT_THAT(
51+
LIBC_NAMESPACE::readlinkat(AT_FDCWD, "non-existent-link", buf, len),
52+
Fails(ENOENT));
4953
}

0 commit comments

Comments
 (0)