Merge "libc: cleanup strchr"
This commit is contained in:
commit
e4ac8feb58
@ -66,7 +66,6 @@ libc_common_src_files := \
|
|||||||
string/index.c \
|
string/index.c \
|
||||||
string/strcasecmp.c \
|
string/strcasecmp.c \
|
||||||
string/strcat.c \
|
string/strcat.c \
|
||||||
string/strchr.c \
|
|
||||||
string/strcspn.c \
|
string/strcspn.c \
|
||||||
string/strdup.c \
|
string/strdup.c \
|
||||||
string/strlcat.c \
|
string/strlcat.c \
|
||||||
@ -238,6 +237,7 @@ libc_bionic_src_files := \
|
|||||||
bionic/signalfd.cpp \
|
bionic/signalfd.cpp \
|
||||||
bionic/sigwait.cpp \
|
bionic/sigwait.cpp \
|
||||||
bionic/__strcat_chk.cpp \
|
bionic/__strcat_chk.cpp \
|
||||||
|
bionic/strchr.cpp \
|
||||||
bionic/__strcpy_chk.cpp \
|
bionic/__strcpy_chk.cpp \
|
||||||
bionic/strerror.cpp \
|
bionic/strerror.cpp \
|
||||||
bionic/strerror_r.cpp \
|
bionic/strerror_r.cpp \
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* $OpenBSD: index.c,v 1.5 2005/08/08 08:05:37 espie Exp $ */
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1990 The Regents of the University of California.
|
* Copyright (c) 1990 The Regents of the University of California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@ -31,21 +30,21 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "libc_logging.h"
|
#include "libc_logging.h"
|
||||||
|
|
||||||
char *
|
extern "C" char* __strchr_chk(const char* p, int ch, size_t s_len) {
|
||||||
__strchr_chk(const char *p, int ch, size_t s_len)
|
for (;; ++p, s_len--) {
|
||||||
{
|
if (__predict_false(s_len == 0)) {
|
||||||
for (;; ++p, s_len--) {
|
__fortify_chk_fail("read beyond buffer", 0);
|
||||||
if (s_len == 0)
|
}
|
||||||
__fortify_chk_fail("strchr read beyond buffer", 0);
|
if (*p == static_cast<char>(ch)) {
|
||||||
if (*p == (char) ch)
|
return const_cast<char*>(p);
|
||||||
return((char *)p);
|
}
|
||||||
if (!*p)
|
if (*p == '\0') {
|
||||||
return((char *)NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
/* NOTREACHED */
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
extern "C" char* strchr(const char* p, int ch) {
|
||||||
strchr(const char *p, int ch) {
|
return __strchr_chk(p, ch, __BIONIC_FORTIFY_UNKNOWN_SIZE);
|
||||||
return __strchr_chk(p, ch, __BIONIC_FORTIFY_UNKNOWN_SIZE);
|
|
||||||
}
|
}
|
@ -45,6 +45,15 @@ TEST(Fortify2_DeathTest, sprintf_fortified2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if __BIONIC__
|
#if __BIONIC__
|
||||||
|
TEST(Fortify2_DeathTest, strchr_fortified2) {
|
||||||
|
::testing::FLAGS_gtest_death_test_style = "threadsafe";
|
||||||
|
foo myfoo;
|
||||||
|
memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
|
||||||
|
myfoo.b[0] = '\0';
|
||||||
|
ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
|
||||||
|
testing::KilledBySignal(SIGSEGV), "");
|
||||||
|
}
|
||||||
|
|
||||||
TEST(Fortify2_DeathTest, strrchr_fortified2) {
|
TEST(Fortify2_DeathTest, strrchr_fortified2) {
|
||||||
::testing::FLAGS_gtest_death_test_style = "threadsafe";
|
::testing::FLAGS_gtest_death_test_style = "threadsafe";
|
||||||
foo myfoo;
|
foo myfoo;
|
||||||
|
@ -209,6 +209,13 @@ TEST(string, strcat) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(string, strchr_with_0) {
|
||||||
|
char buf[10];
|
||||||
|
const char* s = "01234";
|
||||||
|
memcpy(buf, s, strlen(s) + 1);
|
||||||
|
EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s)));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(string, strchr) {
|
TEST(string, strchr) {
|
||||||
int seek_char = random() & 255;
|
int seek_char = random() & 255;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user