You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.8 KiB
202 lines
6.8 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Daniel Axtens <dja@axtens.net> |
|
Date: Fri, 1 May 2020 20:44:29 +1000 |
|
Subject: [PATCH] libtasn1: changes for grub compatibility |
|
|
|
Do a few things to make libtasn1 compile as part of grub: |
|
|
|
- replace strcat. grub removed strcat so replace it with the appropriate |
|
calls to memcpy and strlen. |
|
|
|
- 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 <dja@axtens.net> |
|
--- |
|
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/parser_aux.c | 7 ++++--- |
|
grub-core/lib/libtasn1/lib/int.h | 4 ++-- |
|
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 42f9a92b5d4..7856858b272 100644 |
|
--- a/grub-core/lib/libtasn1/lib/decoding.c |
|
+++ b/grub-core/lib/libtasn1/lib/decoding.c |
|
@@ -32,7 +32,8 @@ |
|
#include <element.h> |
|
#include <limits.h> |
|
#include <intprops.h> |
|
-#include <c-ctype.h> |
|
+ |
|
+#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); |
|
+ memcpy (name + strlen(name), ".", sizeof(" . ")); |
|
+ memcpy (name + strlen(name), p2->name, strlen(p2->name) + 1); |
|
|
|
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); |
|
+ memcpy (name + strlen(name), ".", sizeof(" . ")); |
|
+ memcpy (name + strlen(name), p2->name, strlen(p2->name) + 1); |
|
|
|
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 539008d8e94..ed761ff56bd 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 <gstr.h> |
|
#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 e91a3a151c0..e33875c2c7c 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); |
|
+ memcpy (dest + dest_size, src, str_size + 1); |
|
} |
|
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); |
|
dest[dest_tot_size - 1] = 0; |
|
} |
|
} |
|
diff --git a/grub-core/lib/libtasn1/lib/parser_aux.c b/grub-core/lib/libtasn1/lib/parser_aux.c |
|
index d5dbbf8765d..89c9be69dc2 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/grub-core/lib/libtasn1/lib/int.h b/grub-core/lib/libtasn1/lib/int.h |
|
index ea1625786c1..4a568efee9c 100644 |
|
--- a/grub-core/lib/libtasn1/lib/int.h |
|
+++ b/grub-core/lib/libtasn1/lib/int.h |
|
@@ -35,7 +35,7 @@ |
|
#include <sys/types.h> |
|
#endif |
|
|
|
-#include <libtasn1.h> |
|
+#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/include/grub/libtasn1.h b/include/grub/libtasn1.h |
|
index 785eda2ae3f..28dbf16c4e0 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 <sys/types.h> |
|
-#include <time.h> |
|
-#include <stdio.h> /* for FILE* */ |
|
+#include <grub/types.h> |
|
+#include <grub/time.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C"
|
|
|