32 #include "safeclib_private.h" 33 #include "safe_str_constraint.h" 34 #include "safe_str_lib.h" 90 strncat_s (
char * restrict dest, rsize_t dmax,
const char * restrict src, rsize_t slen)
94 const char *overlap_bumper;
99 return RCNEGATE(ESNULLP);
105 return RCNEGATE(ESNULLP);
108 if (slen > RSIZE_MAX_STR) {
111 return RCNEGATE(ESLEMAX);
117 return RCNEGATE(ESZEROL);
120 if (dmax > RSIZE_MAX_STR) {
123 return RCNEGATE(ESLEMAX);
131 overlap_bumper = src;
134 while (*dest !=
'\0') {
136 if (dest == overlap_bumper) {
137 handle_error(orig_dest, orig_dmax,
"strncat_s: " 138 "overlapping objects",
140 return RCNEGATE(ESOVRLP);
146 handle_error(orig_dest, orig_dmax,
"strncat_s: " 149 return RCNEGATE(ESUNTERM);
154 if (dest == overlap_bumper) {
155 handle_error(orig_dest, orig_dmax,
"strncat_s: " 156 "overlapping objects",
158 return RCNEGATE(ESOVRLP);
165 #ifdef SAFECLIB_STR_NULL_SLACK 167 while (dmax) { *dest =
'\0'; dmax--; dest++; }
171 return RCNEGATE(EOK);
176 #ifdef SAFECLIB_STR_NULL_SLACK 178 while (dmax) { *dest =
'\0'; dmax--; dest++; }
180 return RCNEGATE(EOK);
190 overlap_bumper = dest;
193 while (*dest !=
'\0') {
202 handle_error(orig_dest, orig_dmax,
"strncat_s: " 205 return RCNEGATE(ESUNTERM);
210 if (src == overlap_bumper) {
211 handle_error(orig_dest, orig_dmax,
"strncat_s: " 212 "overlapping objects",
214 return RCNEGATE(ESOVRLP);
221 #ifdef SAFECLIB_STR_NULL_SLACK 223 while (dmax) { *dest =
'\0'; dmax--; dest++; }
227 return RCNEGATE(EOK);
232 #ifdef SAFECLIB_STR_NULL_SLACK 234 while (dmax) { *dest =
'\0'; dmax--; dest++; }
236 return RCNEGATE(EOK);
249 handle_error(orig_dest, orig_dmax,
"strncat_s: not enough " 252 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 strncat_s(char *restrict dest, rsize_t dmax, const char *restrict src, rsize_t slen)
The strncat_s function appends a copy of the string pointed to by src (including the terminating null...