From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by dpdk.org (Postfix) with ESMTP id A422F4C92 for ; Tue, 11 Sep 2018 12:04:43 +0200 (CEST) Received: by mail-wr1-f68.google.com with SMTP id z96-v6so25248422wrb.8 for ; Tue, 11 Sep 2018 03:04:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=r6cSlciV+XLM+ZvFngG/pNrKGupin5mnrjix92JU+Jc=; b=iJeog5qCGqNL7EXoKnkvM3VYQmm1m81diJBYd/c2WSD+y4VgzMC7qSx6TIW0WCooaa tuhNgzZl8pKaquZmEnYcJCjrnDM8IB0of4JdceN+bbqQph91kZeZMURk9oRTv/aMVX3M WOWyXjk8vxYzQraT6N26rFbPOIq7VoNN6L+eQVdCNfDE3EeyTtSVOt/4R/uDjVNunMa2 /z49E8Tw6xImohWRHh1yTNxONW+92KDfRzYDIGH1fbsxb28aYy3WGrNMjTpRJNueZD74 B0Jukq8Cs9MYhXSxJGC9KnO71hDC6wMRPiCvCVQxQj6RogOSKUMidnQNQbZ9faPZFHpZ xJ+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=r6cSlciV+XLM+ZvFngG/pNrKGupin5mnrjix92JU+Jc=; b=a7QB+bilHr/dopdg9dfBrIiRbGuxOjR5ICh5XHpOetxgDtZU9w43fbVXec7ZHm6h/r V8DJ5ueJmnKJ/QCBemQn6OISNypwfLKlls4Eda+SnzEc1WBQGUBzosskwaRyX6W4u7xz lKabR2pQ76xz0Hn2uvXvQiaj3i1dJ06QRZGk9GhjEwkOj15Q+X26vcdgxMcrJ7qpPuE3 36Ic0SqWT8kQdzyLpn9KGNGaVFMsiXUA6sZzqWNo1WcLCcTe7ySm8UkpBAFEr6uattPB GiUw3WRcD+EsF2LKC9C45d5J75y2w/pk9czL3z6s1D4GcSeDhGHGLOPP9LnV5OR1TxmU s+Jw== X-Gm-Message-State: APzg51BdXK/7etMswjub1wtL3s1EoPCpUAZQPWACeJEv8CJlLhY01itL 9b24f+YJqOJ1zOVK3glBnxGTH7IYG08= X-Google-Smtp-Source: ANB0VdbcrcWiMurg1QkJDotqwM0EDkjtoWo74k2xq3p+567bH3s7GilDmoU3azZFlV+gC82PgGiDdA== X-Received: by 2002:a5d:5685:: with SMTP id f5-v6mr19206548wrv.58.1536660282749; Tue, 11 Sep 2018 03:04:42 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id o19-v6sm18382754wro.50.2018.09.11.03.04.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Sep 2018 03:04:41 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Tue, 11 Sep 2018 12:04:19 +0200 Message-Id: <20180911100419.19168-1-gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v1] eal: add strscpy function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Sep 2018 10:04:43 -0000 The strncpy function has long been deemed unsafe for use, in favor of strlcpy or snprintf. While snprintf is standard and strlcpy is still largely available, they both have issues regarding error checking and performance. Both will force reading the source buffer past the requested size if the input is not a proper c-string, and will return the expected number of bytes copied, meaning that error checking needs to verify that the number of bytes copied is not superior to the destination size. This contributes to awkward code flow, unclear error checking and potential issues with malformed input. The function strscpy has been discussed for some time already and has been made available in the linux kernel[1]. Propose this new function as a safe alternative. [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=30c44659f4a3e7e1f9f47e895591b4b40bf62671 Signed-off-by: Gaetan Rivet --- I agree with the original email, here is a proposed implementation. I have added the function as part of 18.11 API proper, because this API is definitely not meant to change. This is not meant to be enforced on existing code, or even on new code. But I think it is better to have it available. lib/librte_eal/common/eal_common_string_fns.c | 30 +++++++++++++++++++ .../common/include/rte_string_fns.h | 23 ++++++++++++++ lib/librte_eal/rte_eal_version.map | 7 +++++ 3 files changed, 60 insertions(+) diff --git a/lib/librte_eal/common/eal_common_string_fns.c b/lib/librte_eal/common/eal_common_string_fns.c index 6ac5f8289..8a34d2422 100644 --- a/lib/librte_eal/common/eal_common_string_fns.c +++ b/lib/librte_eal/common/eal_common_string_fns.c @@ -38,3 +38,33 @@ rte_strsplit(char *string, int stringlen, errno = EINVAL; return -1; } + +/* Copy src string into dst. + * + * Return negative value and NUL-terminate if dst is too short, + * Otherwise return number of bytes copied. + */ +ssize_t +strscpy(char *dst, const char *src, size_t dsize) +{ + const char *osrc = src; + size_t nleft = dsize; + + /* Copy as many bytes as will fit. */ + if (nleft != 0) { + while (--nleft != 0) { + if ((*dst++ = *src++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and return error. */ + if (nleft == 0) { + if (dsize != 0) + *dst = '\0'; + return -E2BIG; + } + + /* count does not include NUL */ + return (src - osrc - 1); +} diff --git a/lib/librte_eal/common/include/rte_string_fns.h b/lib/librte_eal/common/include/rte_string_fns.h index 97597a148..46dd919b4 100644 --- a/lib/librte_eal/common/include/rte_string_fns.h +++ b/lib/librte_eal/common/include/rte_string_fns.h @@ -76,6 +76,29 @@ rte_strlcpy(char *dst, const char *src, size_t size) #endif /* RTE_USE_LIBBSD */ #endif /* BSDAPP */ +/** + * Copy string src to buffer dst of size dsize. + * At most dsize-1 chars will be copied. + * Always NUL-terminates, unless (dsize == 0). + * Returns number of bytes copied (terminating NUL-byte excluded) on success. + * Negative errno on error. + * + * @param dst + * The destination string. + * + * @param src + * The input string to be copied. + * + * @param dsize + * Length in bytes of the destination buffer. + * + * @return + * The number of bytes copied on success + * -E2BIG if the destination buffer is too small. + */ +ssize_t +strscpy(char *dst, const char *src, size_t dsize); + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 344a43d32..fc7b50669 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -262,6 +262,13 @@ DPDK_18.08 { } DPDK_18.05; +DPDK_18.11 { + global: + + strscpy; + +} DPDK_18.08; + EXPERIMENTAL { global: -- 2.18.0