-/* Copyright (C) 1991, 1997, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
char *
-__strncpy_chk (s1, s2, n, s1len)
- char *s1;
- const char *s2;
- size_t n;
- size_t s1len;
+__strncpy_chk (char *s1, const char *s2, size_t n, size_t s1len)
{
- reg_char c;
- char *s = s1;
-
if (__builtin_expect (s1len < n, 0))
__chk_fail ();
- --s1;
-
- if (n >= 4)
- {
- size_t n4 = n >> 2;
-
- for (;;)
- {
- c = *s2++;
- *++s1 = c;
- if (c == '\0')
- break;
- c = *s2++;
- *++s1 = c;
- if (c == '\0')
- break;
- c = *s2++;
- *++s1 = c;
- if (c == '\0')
- break;
- c = *s2++;
- *++s1 = c;
- if (c == '\0')
- break;
- if (--n4 == 0)
- goto last_chars;
- }
- n = n - (s1 - s) - 1;
- if (n == 0)
- return s;
- goto zero_fill;
- }
-
- last_chars:
- n &= 3;
- if (n == 0)
- return s;
-
- do
- {
- c = *s2++;
- *++s1 = c;
- if (--n == 0)
- return s;
- }
- while (c != '\0');
-
- zero_fill:
- do
- *++s1 = '\0';
- while (--n > 0);
-
- return s;
+ return strncpy (s1, s2, n);
}