From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1nhQ7A-000635-Cy for mharc-grub-devel@gnu.org; Thu, 21 Apr 2022 02:16:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50606) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nhQ70-0005vg-0L for grub-devel@gnu.org; Thu, 21 Apr 2022 02:16:18 -0400 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]:36833) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nhQ6s-0004nY-W6 for grub-devel@gnu.org; Thu, 21 Apr 2022 02:16:12 -0400 Received: by mail-pg1-x52f.google.com with SMTP id g3so3181468pgg.3 for ; Wed, 20 Apr 2022 23:16:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:in-reply-to:references:date:message-id :mime-version; bh=+ze1dyV6ATfhhZFLSd8/xN5bUvCrnXrbmBmm5o+0tm4=; b=GMJeLzUsRwBgqPb9TSNmQkeY14rXmKdvD4e4lrxUAlg09eDn8+ghU3sa1gbmqzYp0W GX+toacmfc1yhYVkOD/yi4qse044ukSkyrA/MJvjzHH3VH8oKRSGy8esPDddUIFGkH+6 YEBRNrhiShw1juvT8wYqgXsFRTijx3rRNBfC0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=+ze1dyV6ATfhhZFLSd8/xN5bUvCrnXrbmBmm5o+0tm4=; b=qNPDXkm8wO91/OnaJvB55ruld4CkiCQOO3xnwIuz8q1/3APWbj/jiVcjMnUtC4ErO2 mkLPXywhYALBWLf55RlzjsxhNV6WtNWaF4bxFJQy+DyDKx4R8EPd6PfnuZgAfxf2vZXp DQStVClIGYaBUTDTyEWJG2FNDaEceNGRHAOpRIPBKxAzpaezEmSDJCZxhFUQ5htDKGaS 6jTs0qXz0Q7EZ+KYUOq+ghWOLQCdSgYiFXXlddxSoBiv9+mqyURfatdQdh+h1VoJ0Zqs MurpoyU1Tey4up1IPCRWO44dGgPnA3zCp3FsYK4On6q1T6kC9byVK5Qof1dYxnwk8OcA kz6w== X-Gm-Message-State: AOAM530B2sjd23rsrnpHsqfDsKX1X1G4gHvHVwN1Sms3FoLiwUX36HiS PkD1C4s+x8Tt6lo8fABO7Q+Pcw== X-Google-Smtp-Source: ABdhPJxVVldpi5/ul9AjuLjVonJsp/NoyG2/204dtj6jNlnEn4KbhO5JmPigbzv3M1KqpEgRjEAHVA== X-Received: by 2002:a63:9253:0:b0:3aa:55f3:346d with SMTP id s19-20020a639253000000b003aa55f3346dmr7915120pgn.210.1650521765872; Wed, 20 Apr 2022 23:16:05 -0700 (PDT) Received: from localhost ([2001:4479:e000:e400:4260:be14:52a8:8c94]) by smtp.gmail.com with ESMTPSA id h136-20020a62838e000000b0050ad56bf6c8sm1578699pfe.18.2022.04.20.23.16.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Apr 2022 23:16:05 -0700 (PDT) From: Daniel Axtens To: Stefan Berger , The development of GNU GRUB Cc: rashmica.g@gmail.com, alastair@d-silva.org, nayna@linux.ibm.com Subject: Re: [PATCH v2 13/22] libtasn1: changes for grub compatibility In-Reply-To: <1343acd9-f663-c883-9fc6-3f552103fb62@linux.ibm.com> References: <20210630084031.2663622-1-dja@axtens.net> <20210630084031.2663622-14-dja@axtens.net> <1343acd9-f663-c883-9fc6-3f552103fb62@linux.ibm.com> Date: Thu, 21 Apr 2022 16:16:02 +1000 Message-ID: <87levzdkrh.fsf@dja-thinkpad.axtens.net> MIME-Version: 1.0 Content-Type: text/plain Received-SPF: pass client-ip=2607:f8b0:4864:20::52f; envelope-from=dja@axtens.net; helo=mail-pg1-x52f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Apr 2022 06:16:18 -0000 Stefan Berger writes: > On 6/30/21 4:40 AM, Daniel Axtens wrote: >> Do a few things to make libtasn1 compile as part of grub: >> >> - redefine _asn1_strcat. grub removed strcat so replace it with the >> appropriate calls to memcpy and strlen. Use this internally where >> strcat was used. >> >> - replace c_isdigit with grub_isdigit (and don't import c-ctype from >> gnulib) grub_isdigit provides the same functionality as c_isdigit: it >> determines if the input is an ASCII digit without regard for locale. >> >> - replace GL_ATTRIBUTE_PURE with __attribute__((pure)) which been >> supported since gcc-2.96. This avoids messing around with gnulib. >> >> - adjust libtasn1.h: drop the ASN1_API logic, it's not needed for our >> modules. Unconditionally support const and pure attributes and adjust >> header paths. >> >> - adjust header paths to "grub/libtasn1.h". >> >> - replace a 64 bit division with a call to grub_divmod64, preventing >> creation of __udivdi3 calls on 32 bit platforms. >> >> Signed-off-by: Daniel Axtens >> >> --- >> >> v2: Clean up strcat handling, thanks Stefan Berger. >> --- >> grub-core/lib/libtasn1/lib/decoding.c | 11 ++++++----- >> grub-core/lib/libtasn1/lib/element.c | 3 ++- >> grub-core/lib/libtasn1/lib/gstr.c | 4 ++-- >> grub-core/lib/libtasn1/lib/int.h | 4 ++-- >> grub-core/lib/libtasn1/lib/parser_aux.c | 7 ++++--- >> include/grub/libtasn1.h | 26 ++++++------------------- >> 6 files changed, 22 insertions(+), 33 deletions(-) >> >> diff --git a/grub-core/lib/libtasn1/lib/decoding.c b/grub-core/lib/libtasn1/lib/decoding.c >> index 42f9a92b5d44..3406e1832746 100644 >> --- a/grub-core/lib/libtasn1/lib/decoding.c >> +++ b/grub-core/lib/libtasn1/lib/decoding.c >> @@ -32,7 +32,8 @@ >> #include >> #include >> #include >> -#include >> + >> +#define c_isdigit grub_isdigit >> >> #ifdef DEBUG >> # define warn() fprintf(stderr, "%s: %d\n", __func__, __LINE__) >> @@ -2008,8 +2009,8 @@ asn1_expand_octet_string (asn1_node_const definitions, asn1_node * element, >> (p2->type & CONST_ASSIGN)) >> { >> strcpy (name, definitions->name); >> - strcat (name, "."); >> - strcat (name, p2->name); >> + _asn1_strcat (name, "."); >> + _asn1_strcat (name, p2->name); >> >> len = sizeof (value); >> result = asn1_read_value (definitions, name, value, &len); >> @@ -2026,8 +2027,8 @@ asn1_expand_octet_string (asn1_node_const definitions, asn1_node * element, >> if (p2) >> { >> strcpy (name, definitions->name); >> - strcat (name, "."); >> - strcat (name, p2->name); >> + _asn1_strcat (name, "."); >> + _asn1_strcat (name, p2->name); >> >> result = asn1_create_element (definitions, name, &aux); >> if (result == ASN1_SUCCESS) >> diff --git a/grub-core/lib/libtasn1/lib/element.c b/grub-core/lib/libtasn1/lib/element.c >> index 539008d8e949..ed761ff56bd9 100644 >> --- a/grub-core/lib/libtasn1/lib/element.c >> +++ b/grub-core/lib/libtasn1/lib/element.c >> @@ -30,9 +30,10 @@ >> #include "parser_aux.h" >> #include >> #include "structure.h" >> -#include "c-ctype.h" >> #include "element.h" >> >> +#define c_isdigit grub_isdigit >> + >> void >> _asn1_hierarchical_name (asn1_node_const node, char *name, int name_size) >> { >> diff --git a/grub-core/lib/libtasn1/lib/gstr.c b/grub-core/lib/libtasn1/lib/gstr.c >> index e91a3a151c0d..a092c9a5a24b 100644 >> --- a/grub-core/lib/libtasn1/lib/gstr.c >> +++ b/grub-core/lib/libtasn1/lib/gstr.c >> @@ -36,13 +36,13 @@ _asn1_str_cat (char *dest, size_t dest_tot_size, const char *src) >> >> if (dest_tot_size - dest_size > str_size) >> { >> - strcat (dest, src); >> + _asn1_strcat (dest, src); >> } >> else >> { >> if (dest_tot_size - dest_size > 0) >> { >> - strncat (dest, src, (dest_tot_size - dest_size) - 1); >> + memcpy (dest + dest_size, src, (dest_tot_size - dest_size) - 1); > > > With dest_size = strlen(dest) this is following the 'pattern' of the > #define below. Hmm, is it? #define _asn1_strcat(a,b) memcpy((char *)a + strlen((const char *)a), (const char *)b, strlen((const char *)b) + 1) so _asn1_strcat(dest, src) => memcpy(dest + dest_size, src, src_size + 1) I'm not sure that src_size + 1 = dest_tot_size - 1 ? I've left it as is for now but I'm happy to be convinced (or more accurately for my successor to be convinced) that I'm wrong... Kind regards, Daniel > > >> dest[dest_tot_size - 1] = 0; >> } >> } >> diff --git a/grub-core/lib/libtasn1/lib/int.h b/grub-core/lib/libtasn1/lib/int.h >> index ea1625786c1b..4a568efee9c1 100644 >> --- a/grub-core/lib/libtasn1/lib/int.h >> +++ b/grub-core/lib/libtasn1/lib/int.h >> @@ -35,7 +35,7 @@ >> #include >> #endif >> >> -#include >> +#include "grub/libtasn1.h" >> >> #define ASN1_SMALL_VALUE_SIZE 16 >> >> @@ -115,7 +115,7 @@ extern const tag_and_class_st _asn1_tags[]; >> #define _asn1_strtoul(n,e,b) strtoul((const char *) n, e, b) >> #define _asn1_strcmp(a,b) strcmp((const char *)a, (const char *)b) >> #define _asn1_strcpy(a,b) strcpy((char *)a, (const char *)b) >> -#define _asn1_strcat(a,b) strcat((char *)a, (const char *)b) >> +#define _asn1_strcat(a,b) memcpy((char *)a + strlen((const char *)a), (const char *)b, strlen((const char *)b) + 1) >> >> #if SIZEOF_UNSIGNED_LONG_INT == 8 >> # define _asn1_strtou64(n,e,b) strtoul((const char *) n, e, b) >> diff --git a/grub-core/lib/libtasn1/lib/parser_aux.c b/grub-core/lib/libtasn1/lib/parser_aux.c >> index d5dbbf8765da..89c9be69dc2a 100644 >> --- a/grub-core/lib/libtasn1/lib/parser_aux.c >> +++ b/grub-core/lib/libtasn1/lib/parser_aux.c >> @@ -26,7 +26,8 @@ >> #include "gstr.h" >> #include "structure.h" >> #include "element.h" >> -#include "c-ctype.h" >> + >> +#define c_isdigit grub_isdigit >> >> char _asn1_identifierMissing[ASN1_MAX_NAME_SIZE + 1]; /* identifier name not found */ >> >> @@ -40,7 +41,7 @@ char _asn1_identifierMissing[ASN1_MAX_NAME_SIZE + 1]; /* identifier name not fou >> #ifdef __clang__ >> __attribute__((no_sanitize("integer"))) >> #endif >> -_GL_ATTRIBUTE_PURE >> +__attribute__((__pure__)) >> static unsigned int >> _asn1_hash_name (const char *x) >> { >> @@ -634,7 +635,7 @@ _asn1_ltostr (int64_t v, char str[LTOSTR_MAX_SIZE]) >> count = 0; >> do >> { >> - d = val / 10; >> + d = grub_divmod64(val, 10, NULL); >> r = val - d * 10; >> temp[start + count] = '0' + (char) r; >> count++; >> diff --git a/include/grub/libtasn1.h b/include/grub/libtasn1.h >> index 785eda2ae3f8..28dbf16c4e0c 100644 >> --- a/include/grub/libtasn1.h >> +++ b/include/grub/libtasn1.h >> @@ -38,29 +38,15 @@ >> #ifndef LIBTASN1_H >> #define LIBTASN1_H >> >> -#ifndef ASN1_API >> -#if defined ASN1_BUILDING && defined HAVE_VISIBILITY && HAVE_VISIBILITY >> -#define ASN1_API __attribute__((__visibility__("default"))) >> -#elif defined ASN1_BUILDING && defined _MSC_VER && ! defined ASN1_STATIC >> -#define ASN1_API __declspec(dllexport) >> -#elif defined _MSC_VER && ! defined ASN1_STATIC >> -#define ASN1_API __declspec(dllimport) >> -#else >> +/* grub: ASN1_API is not used */ >> #define ASN1_API >> -#endif >> -#endif >> >> -#ifdef __GNUC__ >> -# define __LIBTASN1_CONST__ __attribute__((const)) >> -# define __LIBTASN1_PURE__ __attribute__((pure)) >> -#else >> -# define __LIBTASN1_CONST__ >> -# define __LIBTASN1_PURE__ >> -#endif >> +/* grub: all our supported compilers support these attributes */ >> +#define __LIBTASN1_CONST__ __attribute__((const)) >> +#define __LIBTASN1_PURE__ __attribute__((pure)) >> >> -#include >> -#include >> -#include /* for FILE* */ >> +#include >> +#include >> >> #ifdef __cplusplus >> extern "C" > > > Reviewed-by: Stefan Berger