Lines 62-68
__xrealloc(void *ptr, size_t size, const
Link Here
|
62 |
char * |
62 |
char * |
63 |
__xstrdup(const char *str, const char *file, const char *func, size_t line) |
63 |
__xstrdup(const char *str, const char *file, const char *func, size_t line) |
64 |
{ |
64 |
{ |
65 |
char *ret = strdup(str); |
65 |
size_t len = strlen(str); |
|
|
66 |
char *ret = malloc(len + 1); |
66 |
|
67 |
|
67 |
if (ret == NULL) { |
68 |
if (ret == NULL) { |
68 |
SB_EERROR("strdup()", " %s:%s():%zu: strdup(%p) failed: %s\n", |
69 |
SB_EERROR("strdup()", " %s:%s():%zu: strdup(%p) failed: %s\n", |
Lines 70-82
__xstrdup(const char *str, const char *f
Link Here
|
70 |
abort(); |
71 |
abort(); |
71 |
} |
72 |
} |
72 |
|
73 |
|
73 |
return ret; |
74 |
return memcpy(ret, str, len + 1); |
74 |
} |
75 |
} |
75 |
|
76 |
|
76 |
char * |
77 |
char * |
77 |
__xstrndup(const char *str, size_t size, const char *file, const char *func, size_t line) |
78 |
__xstrndup(const char *str, size_t size, const char *file, const char *func, size_t line) |
78 |
{ |
79 |
{ |
79 |
char *ret = strndup(str, size); |
80 |
size_t len = MIN(strlen(str), size); |
|
|
81 |
char *ret = malloc(len + 1); |
80 |
|
82 |
|
81 |
if (ret == NULL) { |
83 |
if (ret == NULL) { |
82 |
SB_EERROR("strndup()", " %s:%s():%zu: strndup(%p, %zu) failed: %s\n", |
84 |
SB_EERROR("strndup()", " %s:%s():%zu: strndup(%p, %zu) failed: %s\n", |
Lines 84-88
__xstrndup(const char *str, size_t size,
Link Here
|
84 |
abort(); |
86 |
abort(); |
85 |
} |
87 |
} |
86 |
|
88 |
|
87 |
return ret; |
89 |
ret[len] = '\0'; |
|
|
90 |
return memcpy(ret, str, len); |
88 |
} |
91 |
} |