1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <string.h>
20:
21: #include <memcopy.h>
22:
23:
24: char *
25: __strncat_chk (s1, s2, n, s1len)
26: char *s1;
27: const char *s2;
28: size_t n;
29: size_t s1len;
30: {
31: reg_char c;
32: char *s = s1;
33:
34:
35: do
36: {
37: if (__builtin_expect (s1len-- == 0, 0))
38: __chk_fail ();
39: c = *s1++;
40: }
41: while (c != '\0');
42:
43:
44:
45: ++s1len;
46: s1 -= 2;
47:
48: if (n >= 4)
49: {
50: size_t n4 = n >> 2;
51: do
52: {
53: if (__builtin_expect (s1len-- == 0, 0))
54: __chk_fail ();
55: c = *s2++;
56: *++s1 = c;
57: if (c == '\0')
58: return s;
59: if (__builtin_expect (s1len-- == 0, 0))
60: __chk_fail ();
61: c = *s2++;
62: *++s1 = c;
63: if (c == '\0')
64: return s;
65: if (__builtin_expect (s1len-- == 0, 0))
66: __chk_fail ();
67: c = *s2++;
68: *++s1 = c;
69: if (c == '\0')
70: return s;
71: if (__builtin_expect (s1len-- == 0, 0))
72: __chk_fail ();
73: c = *s2++;
74: *++s1 = c;
75: if (c == '\0')
76: return s;
77: } while (--n4 > 0);
78: n &= 3;
79: }
80:
81: while (n > 0)
82: {
83: if (__builtin_expect (s1len-- == 0, 0))
84: __chk_fail ();
85: c = *s2++;
86: *++s1 = c;
87: if (c == '\0')
88: return s;
89: n--;
90: }
91:
92: if (c != '\0')
93: {
94: if (__builtin_expect (s1len-- == 0, 0))
95: __chk_fail ();
96: *++s1 = '\0';
97: }
98:
99: return s;
100: }