From patchwork Fri Dec 1 18:48:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yaakov Selkowitz X-Patchwork-Id: 120370 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp1506988qgn; Fri, 1 Dec 2017 10:48:51 -0800 (PST) X-Google-Smtp-Source: AGs4zMazNdjQlOq4UI6djzo5DzPx4tJzFcIeWAyONDpzHqhbsJTuvuVO1OD9YOx4MHERxJuRxLsv X-Received: by 10.84.218.10 with SMTP id q10mr7339433pli.111.1512154131842; Fri, 01 Dec 2017 10:48:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512154131; cv=none; d=google.com; s=arc-20160816; b=iuFoYqVpP4eWTdAJGG21Jg63CFOej4nQvtv6W+dYqrckrH3r9u24AA3gEoWOzpI4JX j+hJqaBQzBQV3nNrcmHoo9yEKns8tqJHG1yNUc5gJaMZk9JOaLj748Y2ahkkEC/L6wBM QWpAa056jxNHATU9gEbJaj50jRtLpitHOs0goflHRp9T22efSoFggie5IMVRp88sK5kY nKNwAyiegNSIa77ta5OnBONBS5kGpfwk9NhnEhBTogyeviWZy1FJALLWv6wo1N3KU+6u MIIl5ieuqBm2xSfZZL3EESA1fy5XaPPSgryUyW6CaAGf+owhcr6aEXJHONiOEWHENBBS jyuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:to:from:delivered-to:sender:list-help :list-post:list-archive:list-subscribe:list-unsubscribe:list-id :precedence:mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=v95ADoo/26E9K8VLdtN8ZP9ZiM3vg4rxcdoeOJ0GG2Y=; b=cytZ71zWzfnktVQlQM6y0cCntXbJankALXK9cCX+kENziCzK897Y50jBOL9u/sCgqE SHPT+N1bZFgd2HUjyLi4RbzLUBbCrKcpG5TgmGR4Hx5Q69NDXFT/e83X+zFBsM2hDg2D 8i0H/EIpD8jY1qzOxPMM0oLscJi4aVNIlPX7kNCBhKL+SWo3sWaZPv1pnVpCCeqOit2g JdwSZKSqgrhiDg7PZ4DzzLfIUnuxpPSpwUTy2vylKG0M8RN2YBORzDrI488ADBqHzWBk 8GeKxwM7a5ylPSWbMtKsq5bZGwnsKGY+I7aF6/+g9ncf4vk0O6pFU5rFEP19r4M9PUtj kO4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=UAbvkxc+; spf=pass (google.com: domain of newlib-return-15454-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=newlib-return-15454-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id k91si5346049pld.294.2017.12.01.10.48.51 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Dec 2017 10:48:51 -0800 (PST) Received-SPF: pass (google.com: domain of newlib-return-15454-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=UAbvkxc+; spf=pass (google.com: domain of newlib-return-15454-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=newlib-return-15454-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; q=dns; s= default; b=gNVOtyuiHDzQc5seSmr7Kq0U6xYjpD77xUDHzZ1eYHdGsn7fvXv3A LHZ853M7RIwvW/F/SIbri1l/P/aQZfUM8sUcmxSfLNkT5osgVpUwiqo/mtTWWUkx ymuSlQj6VQeqJVXaGH4emxXfXaYzPwnfcMgq2sDLONA3tjpVz4pZT0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; s=default; bh=ShNaprobZvmAL6W4F+ke1DSRYQc=; b=UAbvkxc+17XGjoCDZyAtkvprAWgM +FmHj7R+PGLf7stSj75SK1As4cVAi0f8HJIwFDv2iSJnr5W94dB5YN3SVFHt/GT7 ajaqGdFQt5s3i+0pyUtLhhFoazeG0KuMQY75T4enwzZxMePV3YxvNFIsQ3d9Sf7o xwRPwFrzQfEa2jw= Received: (qmail 61157 invoked by alias); 1 Dec 2017 18:48:43 -0000 Mailing-List: contact newlib-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-owner@sourceware.org Delivered-To: mailing list newlib@sourceware.org Received: (qmail 61132 invoked by uid 89); 1 Dec 2017 18:48:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, KB_WAM_FROM_NAME_SINGLEWORD, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 01 Dec 2017 18:48:39 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DA53861D09 for ; Fri, 1 Dec 2017 18:48:37 +0000 (UTC) Received: from localhost.localdomain (ovpn-116-45.phx2.redhat.com [10.3.116.45]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8E34F6A03F for ; Fri, 1 Dec 2017 18:48:37 +0000 (UTC) From: Yaakov Selkowitz To: newlib@sourceware.org Subject: [PATCH] ssp: add Object Size Checking for wchar.h, part 1 Date: Fri, 1 Dec 2017 12:48:26 -0600 Message-Id: <20171201184826.1920-1-yselkowi@redhat.com> The following functions are also guarded in glibc: fwprintf, swprintf, wprintf, vfwprintf, vswprintf, vwprintf. Signed-off-by: Yaakov Selkowitz --- newlib/libc/include/ssp/wchar.h | 97 +++++++++++++++++++++++++++++++++++++++++ newlib/libc/include/wchar.h | 4 ++ 2 files changed, 101 insertions(+) create mode 100644 newlib/libc/include/ssp/wchar.h -- 2.15.0 diff --git a/newlib/libc/include/ssp/wchar.h b/newlib/libc/include/ssp/wchar.h new file mode 100644 index 000000000..39033cf39 --- /dev/null +++ b/newlib/libc/include/ssp/wchar.h @@ -0,0 +1,97 @@ +#ifndef _SSP_WCHAR_H_ +#define _SSP_WCHAR_H_ + +#include +#include + +#if __SSP_FORTIFY_LEVEL > 0 + +/* wide character variant, __wlen is number of wchar_t */ +#define __ssp_redirect_wc(rtype, fun, args, call, cond, bos) \ +__ssp_decl(rtype, fun, args) \ +{ \ + if (cond) \ + __ssp_check(__buf, __wlen * sizeof(wchar_t), bos); \ + return __ssp_real_(fun) call; \ +} + +#define __ssp_bos_wicheck3(fun) \ +__ssp_redirect_wc(wchar_t *, fun, \ + (wchar_t *__buf, const wchar_t *__src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +#define __ssp_bos_wicheck3_restrict(fun) \ +__ssp_redirect_wc(wchar_t *, fun, \ + (wchar_t *__restrict __buf, const wchar_t *__restrict __src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +#define __ssp_bos_wicheck2_restrict(fun) \ +__ssp_decl(wchar_t *, fun, (wchar_t *__restrict __buf, const wchar_t *__restrict __src)) \ +{ \ + __ssp_check(__buf, (wcslen(__src) + 1) * sizeof(wchar_t), __ssp_bos0); \ + return __ssp_real_(fun) (__buf, __src); \ +} + +__BEGIN_DECLS +#if __POSIX_VISIBLE >= 200809 +__ssp_bos_wicheck2_restrict(wcpcpy) +__ssp_bos_wicheck3_restrict(wcpncpy) +#endif +__ssp_bos_wicheck2_restrict(wcscpy) +__ssp_bos_wicheck2_restrict(wcscat) +__ssp_bos_wicheck3_restrict(wcsncpy) +__ssp_bos_wicheck3_restrict(wcsncat) +__ssp_bos_wicheck3_restrict(wmemcpy) +__ssp_bos_wicheck3(wmemmove) +#if __GNU_VISIBLE +__ssp_bos_wicheck3_restrict(wmempcpy) +#endif +__ssp_redirect_wc(wchar_t *, wmemset, \ + (wchar_t *__buf, wchar_t __src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +__ssp_decl(size_t, wcrtomb, (char *__buf, wchar_t __src, mbstate_t *__ps)) +{ + if (__buf != NULL && __src != L'\0') + __ssp_check(__buf, sizeof(wchar_t), __ssp_bos); + return __ssp_real_wcrtomb (__buf, __src, __ps); +} + +__ssp_redirect_wc(size_t, mbsrtowcs, \ + (wchar_t *__buf, const char **__src, size_t __wlen, mbstate_t *__ps), \ + (__buf, __src, __wlen, __ps), __buf != NULL, __ssp_bos) + +__ssp_redirect_raw(size_t, wcsrtombs, \ + (char *__buf, const wchar_t **__src, size_t __len, mbstate_t *__ps), \ + (__buf, __src, __len, __ps), __buf != NULL, __ssp_bos) + +#if __POSIX_VISIBLE >= 200809 +__ssp_redirect_wc(size_t, mbsnrtowcs, \ + (wchar_t *__buf, const char **__src, size_t __nms, size_t __wlen, mbstate_t *__ps), \ + (__buf, __src, __nms, __wlen, __ps), __buf != NULL, __ssp_bos) + +__ssp_redirect_raw(size_t, wcsnrtombs, \ + (char *__buf, const wchar_t **__src, size_t __nwc, size_t __len, mbstate_t *__ps), \ + (__buf, __src, __nwc, __len, __ps), __buf != NULL, __ssp_bos) +#endif + +__ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) +{ + if (__wlen > 0) + __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); + return __ssp_real_fgetws(__buf, __wlen, __fp); +} + +#if __GNU_VISIBLE +__ssp_decl(wchar_t *, fgetws_unlocked, (wchar_t *__buf, int __wlen, FILE *__fp)) +{ + if (__wlen > 0) + __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); + return __ssp_real_fgetws_unlocked(__buf, __wlen, __fp); +} +#endif /* __GNU_VISIBLE */ + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_WCHAR_H_ */ diff --git a/newlib/libc/include/wchar.h b/newlib/libc/include/wchar.h index 16e28f41d..dccc10627 100644 --- a/newlib/libc/include/wchar.h +++ b/newlib/libc/include/wchar.h @@ -332,4 +332,8 @@ int _EXFUN(_wscanf_r, (struct _reent *, const wchar_t *, ...)); _END_STD_C +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + #endif /* _WCHAR_H_ */