32 #include "safeclib_private.h" 33 #include "safe_str_constraint.h" 34 #include "safe_str_lib.h" 88 strncpy_s (
char * restrict dest, rsize_t dmax,
const char * restrict src, rsize_t slen)
92 const char *overlap_bumper;
97 return RCNEGATE(ESNULLP);
103 return RCNEGATE(ESZEROL);
106 if (dmax > RSIZE_MAX_STR) {
109 return RCNEGATE(ESLEMAX);
117 handle_error(orig_dest, orig_dmax,
"strncpy_s: " 120 return RCNEGATE(ESNULLP);
124 handle_error(orig_dest, orig_dmax,
"strncpy_s: " 127 return RCNEGATE(ESZEROL);
130 if (slen > RSIZE_MAX_STR) {
131 handle_error(orig_dest, orig_dmax,
"strncpy_s: " 134 return RCNEGATE(ESLEMAX);
139 overlap_bumper = src;
142 if (dest == overlap_bumper) {
143 handle_error(orig_dest, orig_dmax,
"strncpy_s: " 144 "overlapping objects",
146 return RCNEGATE(ESOVRLP);
154 #ifdef SAFECLIB_STR_NULL_SLACK 155 while (dmax) { *dest =
'\0'; dmax--; dest++; }
159 return RCNEGATE(EOK);
164 #ifdef SAFECLIB_STR_NULL_SLACK 166 while (dmax) { *dest =
'\0'; dmax--; dest++; }
168 return RCNEGATE(EOK);
178 overlap_bumper = dest;
181 if (src == overlap_bumper) {
182 handle_error(orig_dest, orig_dmax,
"strncpy_s: " 183 "overlapping objects",
185 return RCNEGATE(ESOVRLP);
193 #ifdef SAFECLIB_STR_NULL_SLACK 194 while (dmax) { *dest =
'\0'; dmax--; dest++; }
198 return RCNEGATE(EOK);
203 #ifdef SAFECLIB_STR_NULL_SLACK 205 while (dmax) { *dest =
'\0'; dmax--; dest++; }
207 return RCNEGATE(EOK);
220 handle_error(orig_dest, orig_dmax,
"strncpy_s: not enough " 223 return RCNEGATE(ESNOSPC);
void invoke_safe_str_constraint_handler(const char *msg, void *ptr, errno_t error)
Invokes the currently set constraint handler or the default.
errno_t strncpy_s(char *restrict dest, rsize_t dmax, const char *restrict src, rsize_t slen)
The strncpy_s function copies not more than slen successive characters (characters that follow a null...