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}