"Fossies" - the Fresh Open Source Software Archive 
Member "passwdqc-2.0.3/concat.c" (23 Jun 2023, 1410 Bytes) of package /linux/privat/passwdqc-2.0.3.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "concat.c" see the
Fossies "Dox" file reference documentation.
1 /*
2 * concat() - allocate memory and safely concatenate strings in portable C
3 * (and C++ if you like).
4 *
5 * This code deals gracefully with potential integer overflows (perhaps when
6 * input strings are maliciously long), as well as with input strings changing
7 * from under it (perhaps because of misbehavior of another thread). It does
8 * not depend on non-portable functions such as snprintf() and asprintf().
9 *
10 * Written by Solar Designer <solar at openwall.com> and placed in the
11 * public domain.
12 */
13
14 #include <string.h>
15 #include <stdarg.h>
16 #include <stdlib.h>
17 #include <limits.h>
18 #include "concat.h"
19
20 char *concat(const char *s1, ...)
21 {
22 va_list args;
23 const char *s;
24 char *p, *result;
25 size_t l, m, n;
26
27 m = n = strlen(s1);
28 va_start(args, s1);
29 while ((s = va_arg(args, char *))) {
30 l = strlen(s);
31 if ((m += l) < l)
32 break;
33 }
34 va_end(args);
35 if (s || m >= INT_MAX)
36 return NULL;
37
38 result = (char *)malloc(m + 1);
39 if (!result)
40 return NULL;
41
42 memcpy(p = result, s1, n);
43 p += n;
44 va_start(args, s1);
45 while ((s = va_arg(args, char *))) {
46 l = strlen(s);
47 if ((n += l) < l || n > m)
48 break;
49 memcpy(p, s, l);
50 p += l;
51 }
52 va_end(args);
53 if (s || m != n || p != result + n) {
54 free(result);
55 return NULL;
56 }
57
58 *p = 0;
59 return result;
60 }
61
62 #ifdef TEST
63 #include <stdio.h>
64
65 int main(int argc, char **argv)
66 {
67 puts(concat(argv[0], argv[1], argv[2], argv[3], NULL));
68 return 0;
69 }
70 #endif