Skip to content

Commit b11596d

Browse files
committed
Use strlcpy() instead of strncpy() (CID 246564)
..making sure dest buffer is always nul-terminated.
1 parent e405196 commit b11596d

8 files changed

+44
-27
lines changed

configure.self

+10
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,16 @@ int foo (void) {
204204
return strndup(\"hi\", 2) ? 0 : 1;
205205
}"
206206

207+
# Check if strlcpy() is available
208+
mkl_compile_check "strlcpy" "HAVE_STRLCPY" disable CC "" \
209+
"
210+
#define _DARWIN_C_SOURCE
211+
#include <string.h>
212+
int foo (void) {
213+
char dest[4];
214+
return strlcpy(dest, \"something\", sizeof(dest));
215+
}"
216+
207217
# Check if strerror_r() is available.
208218
# The check for GNU vs XSI is done in rdposix.h since
209219
# we can't rely on all defines to be set here (_GNU_SOURCE).

src/rd.h

+5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
#ifndef _GNU_SOURCE
3535
#define _GNU_SOURCE /* for strndup() */
3636
#endif
37+
38+
#if defined(__APPLE__) && !defined(_DARWIN_C_SOURCE)
39+
#define _DARWIN_C_SOURCE /* for strlcpy, pthread_setname_np, etc */
40+
#endif
41+
3742
#define __need_IOV_MAX
3843
#ifndef _POSIX_C_SOURCE
3944
#define _POSIX_C_SOURCE 200809L /* for timespec on solaris */

src/rdkafka.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,7 @@ static void rd_kafka_log_buf (const rd_kafka_conf_t *conf,
238238
rko = rd_kafka_op_new(RD_KAFKA_OP_LOG);
239239
rd_kafka_op_set_prio(rko, RD_KAFKA_PRIO_MEDIUM);
240240
rko->rko_u.log.level = level;
241-
strncpy(rko->rko_u.log.fac, fac,
242-
sizeof(rko->rko_u.log.fac) - 1);
241+
rd_strlcpy(rko->rko_u.log.fac, fac, sizeof(rko->rko_u.log.fac));
243242
rko->rko_u.log.str = rd_strdup(buf);
244243
rd_kafka_q_enq(rk->rk_logq, rko);
245244

src/rdkafka_broker.c

+11-11
Original file line numberDiff line numberDiff line change
@@ -1812,7 +1812,7 @@ static int rd_kafka_broker_connect (rd_kafka_broker_t *rkb) {
18121812
rd_atomic32_add(&rkb->rkb_c.connects, 1);
18131813

18141814
rd_kafka_broker_lock(rkb);
1815-
strncpy(nodename, rkb->rkb_nodename, sizeof(nodename));
1815+
rd_strlcpy(nodename, rkb->rkb_nodename, sizeof(nodename));
18161816
rkb->rkb_connect_epoch = rkb->rkb_nodename_epoch;
18171817
/* Logical brokers might not have a hostname set, in which case
18181818
* we should not try to connect. */
@@ -2618,9 +2618,9 @@ static int rd_kafka_broker_op_serve (rd_kafka_broker_t *rkb,
26182618
"Nodename changed from %s to %s",
26192619
rkb->rkb_nodename,
26202620
rko->rko_u.node.nodename);
2621-
strncpy(rkb->rkb_nodename,
2622-
rko->rko_u.node.nodename,
2623-
sizeof(rkb->rkb_nodename)-1);
2621+
rd_strlcpy(rkb->rkb_nodename,
2622+
rko->rko_u.node.nodename,
2623+
sizeof(rkb->rkb_nodename));
26242624
rkb->rkb_nodename_epoch++;
26252625
updated |= _UPD_NAME;
26262626
}
@@ -2659,8 +2659,8 @@ static int rd_kafka_broker_op_serve (rd_kafka_broker_t *rkb,
26592659
rd_rkb_dbg(rkb, BROKER, "UPDATE",
26602660
"Name changed from %s to %s",
26612661
rkb->rkb_name, brokername);
2662-
strncpy(rkb->rkb_name, brokername,
2663-
sizeof(rkb->rkb_name)-1);
2662+
rd_strlcpy(rkb->rkb_name, brokername,
2663+
sizeof(rkb->rkb_name));
26642664
}
26652665
rd_kafka_broker_unlock(rkb);
26662666
rd_kafka_wrunlock(rkb->rkb_rk);
@@ -4954,7 +4954,7 @@ void rd_kafka_broker_set_nodename (rd_kafka_broker_t *rkb,
49544954
/* Get nodename from from_rkb */
49554955
if (from_rkb) {
49564956
rd_kafka_broker_lock(from_rkb);
4957-
strncpy(nodename, from_rkb->rkb_nodename, sizeof(nodename));
4957+
rd_strlcpy(nodename, from_rkb->rkb_nodename, sizeof(nodename));
49584958
nodeid = from_rkb->rkb_nodeid;
49594959
rd_kafka_broker_unlock(from_rkb);
49604960
} else {
@@ -4968,8 +4968,8 @@ void rd_kafka_broker_set_nodename (rd_kafka_broker_t *rkb,
49684968
rd_rkb_dbg(rkb, BROKER, "NODENAME",
49694969
"Broker nodename changed from \"%s\" to \"%s\"",
49704970
rkb->rkb_nodename, nodename);
4971-
strncpy(rkb->rkb_nodename, nodename,
4972-
sizeof(rkb->rkb_nodename));
4971+
rd_strlcpy(rkb->rkb_nodename, nodename,
4972+
sizeof(rkb->rkb_nodename));
49734973
rkb->rkb_nodename_epoch++;
49744974
changed = rd_true;
49754975
}
@@ -5296,8 +5296,8 @@ void rd_kafka_broker_update (rd_kafka_t *rk, rd_kafka_secproto_t proto,
52965296
rd_kafka_op_t *rko;
52975297

52985298
rko = rd_kafka_op_new(RD_KAFKA_OP_NODE_UPDATE);
5299-
strncpy(rko->rko_u.node.nodename, nodename,
5300-
sizeof(rko->rko_u.node.nodename)-1);
5299+
rd_strlcpy(rko->rko_u.node.nodename, nodename,
5300+
sizeof(rko->rko_u.node.nodename));
53015301
rko->rko_u.node.nodeid = mdb->id;
53025302
rd_kafka_q_enq(rkb->rkb_ops, rko);
53035303
}

src/rdkafka_int.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,7 @@ void rd_kafka_log0(const rd_kafka_conf_t *conf,
595595
#define rd_rkb_log(rkb,level,fac,...) do { \
596596
char _logname[RD_KAFKA_NODENAME_SIZE]; \
597597
mtx_lock(&(rkb)->rkb_logname_lock); \
598-
strncpy(_logname, rkb->rkb_logname, sizeof(_logname)-1); \
599-
_logname[RD_KAFKA_NODENAME_SIZE-1] = '\0'; \
598+
rd_strlcpy(_logname, rkb->rkb_logname, sizeof(_logname)); \
600599
mtx_unlock(&(rkb)->rkb_logname_lock); \
601600
rd_kafka_log0(&(rkb)->rkb_rk->rk_conf, \
602601
(rkb)->rkb_rk, _logname, \

src/rdregex.c

+5-8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929

3030
#include "rd.h"
31+
#include "rdstring.h"
3132
#include "rdregex.h"
3233

3334
#if HAVE_REGEX
@@ -80,10 +81,8 @@ rd_regex_comp (const char *pattern, char *errstr, size_t errstr_size) {
8081

8182
re->re = re_regcomp(pattern, 0, &errstr2);
8283
if (!re->re) {
83-
if (errstr) {
84-
strncpy(errstr, errstr2, errstr_size-1);
85-
errstr[errstr_size-1] = '\0';
86-
}
84+
if (errstr)
85+
rd_strlcpy(errstr, errstr2, errstr_size);
8786
rd_free(re);
8887
return NULL;
8988
}
@@ -141,10 +140,8 @@ int rd_regex_match (const char *pattern, const char *str,
141140
/* FIXME: cache compiled regex */
142141
re = re_regcomp(pattern, 0, &errstr2);
143142
if (!re) {
144-
if (errstr) {
145-
strncpy(errstr, errstr2, errstr_size-1);
146-
errstr[errstr_size-1] = '\0';
147-
}
143+
if (errstr)
144+
rd_strlcpy(errstr, errstr2, errstr_size);
148145
return -1;
149146
}
150147

src/rdstring.h

+11
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@
3030
#ifndef _RDSTRING_H_
3131
#define _RDSTRING_H_
3232

33+
static RD_INLINE RD_UNUSED
34+
void rd_strlcpy (char *dst, const char *src, size_t dstsize) {
35+
#if HAVE_STRLCPY
36+
(void)strlcpy(dst, src, dstsize);
37+
#else
38+
if (likely(dstsize > 0))
39+
strncpy(dst, src, dstsize-1);
40+
dst[dstsize] = '\0';
41+
#endif
42+
}
43+
3344

3445

3546
char *rd_string_render (const char *templ,

src/tinycthread_extra.c

-4
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@
3131
* @brief Extra methods added to tinycthread/c11threads
3232
*/
3333

34-
#if defined(__APPLE__) && !defined(_DARWIN_C_SOURCE)
35-
#define _DARWIN_C_SOURCE /* for pthread_setname_np() on macOS */
36-
#endif
37-
3834
#include "rd.h"
3935
#include "rdtime.h"
4036
#include "tinycthread.h"

0 commit comments

Comments
 (0)