1570af302Sopenharmony_ci/* 2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4570af302Sopenharmony_ci * you may not use this file except in compliance with the License. 5570af302Sopenharmony_ci * You may obtain a copy of the License at 6570af302Sopenharmony_ci * 7570af302Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8570af302Sopenharmony_ci * 9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12570af302Sopenharmony_ci * See the License for the specific language governing permissions and 13570af302Sopenharmony_ci * limitations under the License. 14570af302Sopenharmony_ci */ 15570af302Sopenharmony_ci 16570af302Sopenharmony_ci#include <stdio.h> 17570af302Sopenharmony_ci#include <string.h> 18570af302Sopenharmony_ci#include <signal.h> 19570af302Sopenharmony_ci#include <sys/wait.h> 20570af302Sopenharmony_ci#include <sigchain.h> 21570af302Sopenharmony_ci#include "fortify_test.h" 22570af302Sopenharmony_ci#include "test.h" 23570af302Sopenharmony_ci 24570af302Sopenharmony_ci#define EXPECT_EQ(a, b) \ 25570af302Sopenharmony_ci do { \ 26570af302Sopenharmony_ci if ((a) != (b)) \ 27570af302Sopenharmony_ci t_error("failed!\n"); \ 28570af302Sopenharmony_ci } while (0) 29570af302Sopenharmony_ci 30570af302Sopenharmony_ci#define EXPECT_STREQ(a, b) \ 31570af302Sopenharmony_ci do { \ 32570af302Sopenharmony_ci size_t minlen = strlen(a) >= strlen(b) ? strlen(b) : strlen(a); \ 33570af302Sopenharmony_ci if (strncmp(a, b, minlen) != 0) \ 34570af302Sopenharmony_ci t_error("failed\n"); \ 35570af302Sopenharmony_ci } while (0) 36570af302Sopenharmony_ci 37570af302Sopenharmony_ci#define EXPECT_TRUE(c) \ 38570af302Sopenharmony_ci do { \ 39570af302Sopenharmony_ci if (!(c)) \ 40570af302Sopenharmony_ci t_error("failed!\n"); \ 41570af302Sopenharmony_ci } while (0) 42570af302Sopenharmony_ci 43570af302Sopenharmony_ci/** 44570af302Sopenharmony_ci * @tc.name : fread 45570af302Sopenharmony_ci * @tc.desc : normal use 46570af302Sopenharmony_ci * @tc.level : Level 0 47570af302Sopenharmony_ci */ 48570af302Sopenharmony_cistatic void stdio_dynamic_chk_001(void) 49570af302Sopenharmony_ci{ 50570af302Sopenharmony_ci char hello_world[] = "hello world!"; 51570af302Sopenharmony_ci FILE *fp = fmemopen(hello_world, sizeof(hello_world), "r"); 52570af302Sopenharmony_ci EXPECT_TRUE(fp); 53570af302Sopenharmony_ci 54570af302Sopenharmony_ci const int bufferSize = 14; 55570af302Sopenharmony_ci char buf[bufferSize]; // > sizeof(hello_world) 56570af302Sopenharmony_ci EXPECT_EQ(1u, fread(buf, sizeof(hello_world), 1, fp)); 57570af302Sopenharmony_ci EXPECT_STREQ(hello_world, buf); 58570af302Sopenharmony_ci 59570af302Sopenharmony_ci fclose(fp); 60570af302Sopenharmony_ci return; 61570af302Sopenharmony_ci} 62570af302Sopenharmony_ci 63570af302Sopenharmony_ci/** 64570af302Sopenharmony_ci * @tc.name : fread 65570af302Sopenharmony_ci * @tc.desc : normal use 66570af302Sopenharmony_ci * @tc.level : Level 0 67570af302Sopenharmony_ci */ 68570af302Sopenharmony_cistatic void stdio_dynamic_chk_002(void) 69570af302Sopenharmony_ci{ 70570af302Sopenharmony_ci FILE *fp = fopen("/dev/zero", "r"); 71570af302Sopenharmony_ci EXPECT_TRUE(fp); 72570af302Sopenharmony_ci 73570af302Sopenharmony_ci setvbuf(fp, NULL, _IONBF, 0); 74570af302Sopenharmony_ci 75570af302Sopenharmony_ci const int bufferSize = 65*1024; 76570af302Sopenharmony_ci char buf[bufferSize]; 77570af302Sopenharmony_ci memset(buf, 0xff, sizeof(buf)); 78570af302Sopenharmony_ci 79570af302Sopenharmony_ci size_t read_size = 64*1024; 80570af302Sopenharmony_ci size_t count_size = 1024; 81570af302Sopenharmony_ci for (size_t i = 0; i < count_size; ++i) { 82570af302Sopenharmony_ci EXPECT_EQ(1u, fread(buf, read_size, 1, fp)); 83570af302Sopenharmony_ci } 84570af302Sopenharmony_ci 85570af302Sopenharmony_ci // The first 64*1024 should be assigned 86570af302Sopenharmony_ci for (size_t i = 0; i < read_size; ++i) { 87570af302Sopenharmony_ci EXPECT_EQ('\0', buf[i]); 88570af302Sopenharmony_ci } 89570af302Sopenharmony_ci 90570af302Sopenharmony_ci // What's left is its original data 91570af302Sopenharmony_ci for (size_t i = read_size; i < bufferSize; ++i) { 92570af302Sopenharmony_ci EXPECT_EQ('\xff', buf[i]); 93570af302Sopenharmony_ci } 94570af302Sopenharmony_ci return; 95570af302Sopenharmony_ci} 96570af302Sopenharmony_ci 97570af302Sopenharmony_ci/** 98570af302Sopenharmony_ci * @tc.name : fread 99570af302Sopenharmony_ci * @tc.desc : Exceed the buffer range and reach dynamic monitoring conditions 100570af302Sopenharmony_ci * @tc.level : Level 2 101570af302Sopenharmony_ci */ 102570af302Sopenharmony_cistatic void stdio_dynamic_chk_003(void) 103570af302Sopenharmony_ci{ 104570af302Sopenharmony_ci struct sigaction sigabrt = { 105570af302Sopenharmony_ci .sa_handler = SignalHandler, 106570af302Sopenharmony_ci }; 107570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 108570af302Sopenharmony_ci 109570af302Sopenharmony_ci const int bufferSize = 1; 110570af302Sopenharmony_ci char buf[bufferSize]; 111570af302Sopenharmony_ci size_t ct = atoi("2"); 112570af302Sopenharmony_ci FILE* fp = fopen("/dev/null", "r"); 113570af302Sopenharmony_ci 114570af302Sopenharmony_ci int status; 115570af302Sopenharmony_ci int pid = fork(); 116570af302Sopenharmony_ci switch (pid) { 117570af302Sopenharmony_ci case -1: 118570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 119570af302Sopenharmony_ci break; 120570af302Sopenharmony_ci case 0: 121570af302Sopenharmony_ci fread(buf, 1, ct, fp); 122570af302Sopenharmony_ci exit(0); 123570af302Sopenharmony_ci default: 124570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 125570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 126570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 127570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 128570af302Sopenharmony_ci kill(pid, SIGCONT); 129570af302Sopenharmony_ci break; 130570af302Sopenharmony_ci } 131570af302Sopenharmony_ci fclose(fp); 132570af302Sopenharmony_ci return; 133570af302Sopenharmony_ci} 134570af302Sopenharmony_ci 135570af302Sopenharmony_ci/** 136570af302Sopenharmony_ci * @tc.name : fwrite 137570af302Sopenharmony_ci * @tc.desc : Exceed the buffer range and reach dynamic monitoring conditions 138570af302Sopenharmony_ci * @tc.level : Level 2 139570af302Sopenharmony_ci */ 140570af302Sopenharmony_cistatic void stdio_dynamic_chk_004(void) 141570af302Sopenharmony_ci{ 142570af302Sopenharmony_ci struct sigaction sigabrt = { 143570af302Sopenharmony_ci .sa_handler = SignalHandler, 144570af302Sopenharmony_ci }; 145570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 146570af302Sopenharmony_ci 147570af302Sopenharmony_ci size_t ct = atoi("2"); 148570af302Sopenharmony_ci FILE* fp = fopen("/dev/null", "w"); 149570af302Sopenharmony_ci 150570af302Sopenharmony_ci const int bufferSize = 1; 151570af302Sopenharmony_ci char buf[bufferSize]; 152570af302Sopenharmony_ci 153570af302Sopenharmony_ci int status; 154570af302Sopenharmony_ci int pid = fork(); 155570af302Sopenharmony_ci switch (pid) { 156570af302Sopenharmony_ci case -1: 157570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 158570af302Sopenharmony_ci break; 159570af302Sopenharmony_ci case 0: 160570af302Sopenharmony_ci fwrite(buf, 1, ct, fp); 161570af302Sopenharmony_ci exit(0); 162570af302Sopenharmony_ci default: 163570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 164570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 165570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 166570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 167570af302Sopenharmony_ci kill(pid, SIGCONT); 168570af302Sopenharmony_ci break; 169570af302Sopenharmony_ci } 170570af302Sopenharmony_ci fclose(fp); 171570af302Sopenharmony_ci return; 172570af302Sopenharmony_ci} 173570af302Sopenharmony_ci 174570af302Sopenharmony_ci/** 175570af302Sopenharmony_ci * @tc.name : fgets 176570af302Sopenharmony_ci * @tc.desc : Normal function 177570af302Sopenharmony_ci * @tc.level : Level 0 178570af302Sopenharmony_ci */ 179570af302Sopenharmony_cistatic void stdio_dynamic_chk_005(void) 180570af302Sopenharmony_ci{ 181570af302Sopenharmony_ci char hello_world[] = "hello world!"; 182570af302Sopenharmony_ci FILE *fp = fmemopen(hello_world, sizeof(hello_world), "r"); 183570af302Sopenharmony_ci EXPECT_TRUE(fp); 184570af302Sopenharmony_ci 185570af302Sopenharmony_ci const int bufferSize = 16; 186570af302Sopenharmony_ci char buf[bufferSize]; 187570af302Sopenharmony_ci char *get = fgets(buf, sizeof(buf), fp); 188570af302Sopenharmony_ci EXPECT_TRUE(get != NULL); 189570af302Sopenharmony_ci EXPECT_TRUE(strcmp(hello_world, get) == 0); 190570af302Sopenharmony_ci fclose(fp); 191570af302Sopenharmony_ci return; 192570af302Sopenharmony_ci} 193570af302Sopenharmony_ci 194570af302Sopenharmony_ci/** 195570af302Sopenharmony_ci * @tc.name : fgets 196570af302Sopenharmony_ci * @tc.desc : Get newline and end position as normal 197570af302Sopenharmony_ci * @tc.level : Level 0 198570af302Sopenharmony_ci */ 199570af302Sopenharmony_cistatic void stdio_dynamic_chk_006(void) 200570af302Sopenharmony_ci{ 201570af302Sopenharmony_ci char hello_world[] = "hello world!\nhello boy!\0"; 202570af302Sopenharmony_ci FILE *fp = fmemopen(hello_world, sizeof(hello_world), "r"); 203570af302Sopenharmony_ci EXPECT_TRUE(fp); 204570af302Sopenharmony_ci 205570af302Sopenharmony_ci const int bufferSize = 16; 206570af302Sopenharmony_ci char buf[bufferSize]; 207570af302Sopenharmony_ci char *get1 = fgets(buf, sizeof("hello"), fp); 208570af302Sopenharmony_ci EXPECT_TRUE(get1 != NULL); 209570af302Sopenharmony_ci EXPECT_TRUE(strcmp("hello", get1) == 0); 210570af302Sopenharmony_ci 211570af302Sopenharmony_ci memset(buf,0x00,sizeof(buf)); 212570af302Sopenharmony_ci char *get2 = fgets(buf, sizeof(buf), fp); 213570af302Sopenharmony_ci EXPECT_TRUE(get2 != NULL); 214570af302Sopenharmony_ci 215570af302Sopenharmony_ci memset(buf,0x00,sizeof(buf)); 216570af302Sopenharmony_ci char *get3 = fgets(buf, sizeof(buf), fp); 217570af302Sopenharmony_ci EXPECT_TRUE(get3 != NULL); 218570af302Sopenharmony_ci EXPECT_TRUE(strcmp("hello boy!", get3) == 0); 219570af302Sopenharmony_ci fclose(fp); 220570af302Sopenharmony_ci return; 221570af302Sopenharmony_ci} 222570af302Sopenharmony_ci 223570af302Sopenharmony_ci/** 224570af302Sopenharmony_ci * @tc.name : fgets 225570af302Sopenharmony_ci * @tc.desc : The size of reads is greater than the capacity of buf 226570af302Sopenharmony_ci * @tc.level : Level 2 227570af302Sopenharmony_ci */ 228570af302Sopenharmony_cistatic void stdio_dynamic_chk_007(void) 229570af302Sopenharmony_ci{ 230570af302Sopenharmony_ci struct sigaction sigabrt = { 231570af302Sopenharmony_ci .sa_handler = SignalHandler, 232570af302Sopenharmony_ci }; 233570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 234570af302Sopenharmony_ci 235570af302Sopenharmony_ci char hello_world[] = "hello world!"; 236570af302Sopenharmony_ci FILE *fp = fmemopen(hello_world, sizeof(hello_world), "r"); 237570af302Sopenharmony_ci 238570af302Sopenharmony_ci const int bufferSize = 16; 239570af302Sopenharmony_ci char buf[bufferSize]; 240570af302Sopenharmony_ci size_t n = atoi("18"); 241570af302Sopenharmony_ci int status; 242570af302Sopenharmony_ci int pid = fork(); 243570af302Sopenharmony_ci switch (pid) { 244570af302Sopenharmony_ci case -1: 245570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 246570af302Sopenharmony_ci break; 247570af302Sopenharmony_ci case 0: 248570af302Sopenharmony_ci fgets(buf, n, fp); 249570af302Sopenharmony_ci exit(0); 250570af302Sopenharmony_ci default: 251570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 252570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 253570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 254570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 255570af302Sopenharmony_ci kill(pid, SIGCONT); 256570af302Sopenharmony_ci break; 257570af302Sopenharmony_ci } 258570af302Sopenharmony_ci fclose(fp); 259570af302Sopenharmony_ci return; 260570af302Sopenharmony_ci} 261570af302Sopenharmony_ci 262570af302Sopenharmony_ci/** 263570af302Sopenharmony_ci * @tc.name : sprintf 264570af302Sopenharmony_ci * @tc.desc : Normal call test 265570af302Sopenharmony_ci * @tc.level : Level 0 266570af302Sopenharmony_ci */ 267570af302Sopenharmony_cistatic void stdio_dynamic_chk_008(void) 268570af302Sopenharmony_ci{ 269570af302Sopenharmony_ci char buf[] = "world"; 270570af302Sopenharmony_ci sprintf(buf, "hello"); 271570af302Sopenharmony_ci EXPECT_TRUE(strcmp(buf, "hello") == 0); 272570af302Sopenharmony_ci return; 273570af302Sopenharmony_ci} 274570af302Sopenharmony_ci 275570af302Sopenharmony_ci/** 276570af302Sopenharmony_ci * @tc.name : sprintf 277570af302Sopenharmony_ci * @tc.desc : Normal call test 278570af302Sopenharmony_ci * @tc.level : Level 0 279570af302Sopenharmony_ci */ 280570af302Sopenharmony_cistatic void stdio_dynamic_chk_009(void) 281570af302Sopenharmony_ci{ 282570af302Sopenharmony_ci const int bufferSize = 20; 283570af302Sopenharmony_ci char buf[bufferSize]; 284570af302Sopenharmony_ci sprintf(buf, "hello : %s", "world!"); 285570af302Sopenharmony_ci 286570af302Sopenharmony_ci char value[] = "hello : world!"; 287570af302Sopenharmony_ci EXPECT_TRUE(strcmp(buf, value) == 0); 288570af302Sopenharmony_ci return; 289570af302Sopenharmony_ci} 290570af302Sopenharmony_ci 291570af302Sopenharmony_ci 292570af302Sopenharmony_ci/** 293570af302Sopenharmony_ci * @tc.name : sprintf 294570af302Sopenharmony_ci * @tc.desc : sprintf beyond capacity 295570af302Sopenharmony_ci * @tc.level : Level 2 296570af302Sopenharmony_ci */ 297570af302Sopenharmony_cistatic void stdio_dynamic_chk_010(void) 298570af302Sopenharmony_ci{ 299570af302Sopenharmony_ci const int bufferSize = 6; 300570af302Sopenharmony_ci char buf[bufferSize]; 301570af302Sopenharmony_ci 302570af302Sopenharmony_ci struct sigaction sigabrt = { 303570af302Sopenharmony_ci .sa_handler = SignalHandler, 304570af302Sopenharmony_ci }; 305570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 306570af302Sopenharmony_ci 307570af302Sopenharmony_ci int status; 308570af302Sopenharmony_ci int pid = fork(); 309570af302Sopenharmony_ci switch (pid) { 310570af302Sopenharmony_ci case -1: 311570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 312570af302Sopenharmony_ci break; 313570af302Sopenharmony_ci case 0: 314570af302Sopenharmony_ci sprintf(buf, "hello : %s", "world!"); 315570af302Sopenharmony_ci exit(0); 316570af302Sopenharmony_ci default: 317570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 318570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 319570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 320570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 321570af302Sopenharmony_ci kill(pid, SIGCONT); 322570af302Sopenharmony_ci break; 323570af302Sopenharmony_ci } 324570af302Sopenharmony_ci return; 325570af302Sopenharmony_ci} 326570af302Sopenharmony_ci 327570af302Sopenharmony_ci/** 328570af302Sopenharmony_ci * @tc.name : snprintf 329570af302Sopenharmony_ci * @tc.desc : snprintf beyond capacity 330570af302Sopenharmony_ci * @tc.level : Level 2 331570af302Sopenharmony_ci */ 332570af302Sopenharmony_ci 333570af302Sopenharmony_cistatic void stdio_dynamic_chk_011(void) 334570af302Sopenharmony_ci{ 335570af302Sopenharmony_ci const int bufferSize = 6; 336570af302Sopenharmony_ci char buf[bufferSize]; 337570af302Sopenharmony_ci 338570af302Sopenharmony_ci struct sigaction sigabrt = { 339570af302Sopenharmony_ci .sa_handler = SignalHandler, 340570af302Sopenharmony_ci }; 341570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 342570af302Sopenharmony_ci 343570af302Sopenharmony_ci int printSize = 10; 344570af302Sopenharmony_ci int status; 345570af302Sopenharmony_ci int pid = fork(); 346570af302Sopenharmony_ci switch (pid) { 347570af302Sopenharmony_ci case -1: 348570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 349570af302Sopenharmony_ci break; 350570af302Sopenharmony_ci case 0: // 10 > sizeof buf 351570af302Sopenharmony_ci snprintf(buf, printSize, "hello : %s", "world!"); 352570af302Sopenharmony_ci exit(0); 353570af302Sopenharmony_ci default: 354570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 355570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 356570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 357570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 358570af302Sopenharmony_ci kill(pid, SIGCONT); 359570af302Sopenharmony_ci break; 360570af302Sopenharmony_ci } 361570af302Sopenharmony_ci return; 362570af302Sopenharmony_ci} 363570af302Sopenharmony_ci 364570af302Sopenharmony_ci 365570af302Sopenharmony_cistatic int vsnprintf_test(const char* format, ...) 366570af302Sopenharmony_ci{ 367570af302Sopenharmony_ci const int bufferSize = 6; 368570af302Sopenharmony_ci char buf[bufferSize]; 369570af302Sopenharmony_ci int printSize = 10; 370570af302Sopenharmony_ci va_list va; 371570af302Sopenharmony_ci va_start(va, format); 372570af302Sopenharmony_ci int result = vsnprintf(buf, printSize, format, va); 373570af302Sopenharmony_ci va_end(va); 374570af302Sopenharmony_ci return result; 375570af302Sopenharmony_ci} 376570af302Sopenharmony_ci 377570af302Sopenharmony_cistatic int vsprintf_test(const char* format, ...) 378570af302Sopenharmony_ci{ 379570af302Sopenharmony_ci const int bufferSize = 6; 380570af302Sopenharmony_ci char buf[bufferSize]; 381570af302Sopenharmony_ci va_list va; 382570af302Sopenharmony_ci va_start(va, format); 383570af302Sopenharmony_ci int result = vsprintf(buf, format, va); 384570af302Sopenharmony_ci va_end(va); 385570af302Sopenharmony_ci return result; 386570af302Sopenharmony_ci} 387570af302Sopenharmony_ci 388570af302Sopenharmony_ci/** 389570af302Sopenharmony_ci * @tc.name : vsnprintf 390570af302Sopenharmony_ci * @tc.desc : vsnprintf beyond capacity 391570af302Sopenharmony_ci * @tc.level : Level 2 392570af302Sopenharmony_ci */ 393570af302Sopenharmony_cistatic void stdio_dynamic_chk_012(void) 394570af302Sopenharmony_ci{ 395570af302Sopenharmony_ci struct sigaction sigabrt = { 396570af302Sopenharmony_ci .sa_handler = SignalHandler, 397570af302Sopenharmony_ci }; 398570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 399570af302Sopenharmony_ci 400570af302Sopenharmony_ci int status; 401570af302Sopenharmony_ci int pid = fork(); 402570af302Sopenharmony_ci switch (pid) { 403570af302Sopenharmony_ci case -1: 404570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 405570af302Sopenharmony_ci break; 406570af302Sopenharmony_ci case 0: 407570af302Sopenharmony_ci vsnprintf_test("hello : %s", "world!"); 408570af302Sopenharmony_ci exit(0); 409570af302Sopenharmony_ci default: 410570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 411570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 412570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 413570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 414570af302Sopenharmony_ci kill(pid, SIGCONT); 415570af302Sopenharmony_ci break; 416570af302Sopenharmony_ci } 417570af302Sopenharmony_ci return; 418570af302Sopenharmony_ci} 419570af302Sopenharmony_ci 420570af302Sopenharmony_ci/** 421570af302Sopenharmony_ci * @tc.name : vsprsintf 422570af302Sopenharmony_ci * @tc.desc : vsprintf beyond capacity 423570af302Sopenharmony_ci * @tc.level : Level 2 424570af302Sopenharmony_ci */ 425570af302Sopenharmony_cistatic void stdio_dynamic_chk_013(void) 426570af302Sopenharmony_ci{ 427570af302Sopenharmony_ci struct sigaction sigabrt = { 428570af302Sopenharmony_ci .sa_handler = SignalHandler, 429570af302Sopenharmony_ci }; 430570af302Sopenharmony_ci sigaction(SIGABRT, &sigabrt, NULL); 431570af302Sopenharmony_ci 432570af302Sopenharmony_ci int status; 433570af302Sopenharmony_ci int pid = fork(); 434570af302Sopenharmony_ci switch (pid) { 435570af302Sopenharmony_ci case -1: 436570af302Sopenharmony_ci t_error("fork failed: %d\n", __LINE__); 437570af302Sopenharmony_ci break; 438570af302Sopenharmony_ci case 0: 439570af302Sopenharmony_ci vsprintf_test("%s", "0123456789"); 440570af302Sopenharmony_ci exit(0); 441570af302Sopenharmony_ci default: 442570af302Sopenharmony_ci waitpid(pid, &status, WUNTRACED); 443570af302Sopenharmony_ci TEST(WIFEXITED(status) == 0); 444570af302Sopenharmony_ci TEST(WIFSTOPPED(status) == 1); 445570af302Sopenharmony_ci TEST(WSTOPSIG(status) == SIGSTOP); 446570af302Sopenharmony_ci kill(pid, SIGCONT); 447570af302Sopenharmony_ci break; 448570af302Sopenharmony_ci } 449570af302Sopenharmony_ci return; 450570af302Sopenharmony_ci} 451570af302Sopenharmony_ci 452570af302Sopenharmony_ciint main() 453570af302Sopenharmony_ci{ 454570af302Sopenharmony_ci remove_all_special_handler(SIGABRT); 455570af302Sopenharmony_ci stdio_dynamic_chk_001(); 456570af302Sopenharmony_ci stdio_dynamic_chk_002(); 457570af302Sopenharmony_ci stdio_dynamic_chk_003(); 458570af302Sopenharmony_ci stdio_dynamic_chk_004(); 459570af302Sopenharmony_ci stdio_dynamic_chk_005(); 460570af302Sopenharmony_ci stdio_dynamic_chk_006(); 461570af302Sopenharmony_ci stdio_dynamic_chk_007(); 462570af302Sopenharmony_ci stdio_dynamic_chk_008(); 463570af302Sopenharmony_ci stdio_dynamic_chk_009(); 464570af302Sopenharmony_ci stdio_dynamic_chk_010(); 465570af302Sopenharmony_ci stdio_dynamic_chk_011(); 466570af302Sopenharmony_ci stdio_dynamic_chk_012(); 467570af302Sopenharmony_ci stdio_dynamic_chk_013(); 468570af302Sopenharmony_ci 469570af302Sopenharmony_ci return t_status; 470570af302Sopenharmony_ci}