[Interdiff v2~v1] erofs-utils: lib: support AWS SigV4 for S3 backend

Yifan Zhao zhaoyifan28 at huawei.com
Mon Nov 24 23:36:06 AEDT 2025


Yifan Zhao (1):
  erofs-utils: lib: support AWS SigV4 for S3 backend

 lib/liberofs_s3.h |   1 +
 lib/remotes/s3.c  | 581 +++++++++++++++++++++++++++++++++++++---------
 mkfs/main.c       |  14 +-
 3 files changed, 485 insertions(+), 111 deletions(-)

Interdiff against v1:
diff --git a/lib/remotes/s3.c b/lib/remotes/s3.c
index 3263dd7..cc37880 100644
--- a/lib/remotes/s3.c
+++ b/lib/remotes/s3.c
@@ -23,7 +23,7 @@
 #define S3EROFS_PATH_MAX		1024
 #define S3EROFS_MAX_QUERY_PARAMS	16
 #define S3EROFS_URL_LEN			8192
-#define S3EROFS_CANONICAL_URI_LEN	1024
+#define S3EROFS_CANONICAL_URI_LEN	2048
 #define S3EROFS_CANONICAL_QUERY_LEN	S3EROFS_URL_LEN
 
 #define BASE64_ENCODE_LEN(len)	(((len + 2) / 3) * 4)
@@ -40,7 +40,8 @@ struct s3erofs_curl_request {
 	char canonical_query[S3EROFS_CANONICAL_QUERY_LEN];
 };
 
-static const char *s3erofs_parse_host(const char *endpoint, const char **schema) {
+static const char *s3erofs_parse_host(const char *endpoint, const char **schema)
+{
 	const char *tmp = strstr(endpoint, "://");
 	const char *host;
 
@@ -60,17 +61,17 @@ static const char *s3erofs_parse_host(const char *endpoint, const char **schema)
 	return host;
 }
 
-static int s3erofs_urlencode(const char *input, char **output)
+static void* s3erofs_urlencode(const char *input)
 {
 	static const char hex[] = "0123456789ABCDEF";
 	int i;
-	char c, *p;
+	char c, *p, *ret;
 
-	*output = malloc(strlen(input) * 3 + 1);
-	if (!*output)
-		return -ENOMEM;
+	ret = malloc(strlen(input) * 3 + 1);
+	if (!ret)
+		return ERR_PTR(-ENOMEM);
 
-	p = *output;
+	p = ret;
 	for (i = 0; i < strlen(input); ++i) {
 		c = (unsigned char)input[i];
 
@@ -87,7 +88,7 @@ static int s3erofs_urlencode(const char *input, char **output)
 	}
 	*p = '\0';
 
-	return 0;
+	return ret;
 }
 
 struct kv_pair {
@@ -106,17 +107,23 @@ static int s3erofs_prepare_canonical_query(struct s3erofs_curl_request *req,
 	struct kv_pair *pairs;
 	int i, pos = 0, ret = 0;
 
-	if (params->num == 0)
+	if (!params->num)
 		return 0;
 
-	pairs = malloc(sizeof(struct kv_pair) * params->num);
+	pairs = calloc(1, sizeof(struct kv_pair) * params->num);
 	for (i = 0; i < params->num; i++) {
-		ret = s3erofs_urlencode(params->key[i], &pairs[i].key);
-		if (ret < 0)
+		pairs[i].key = s3erofs_urlencode(params->key[i]);
+		if (IS_ERR(pairs[i].key)) {
+			ret = PTR_ERR(pairs[i].key);
+			pairs[i].key = NULL;
 			goto out;
-		ret = s3erofs_urlencode(params->value[i], &pairs[i].value);
-		if (ret < 0)
+		}
+		pairs[i].value = s3erofs_urlencode(params->value[i]);
+		if (IS_ERR(pairs[i].value)) {
+			ret = PTR_ERR(pairs[i].value);
+			pairs[i].value = NULL;
 			goto out;
+		}
 	}
 
 	qsort(pairs, params->num, sizeof(struct kv_pair), compare_kv_pair);
@@ -126,7 +133,14 @@ static int s3erofs_prepare_canonical_query(struct s3erofs_curl_request *req,
 				pairs[i].key, pairs[i].value,
 				(i == params->num - 1) ? "" : "&");
 	req->canonical_query[pos] = '\0';
+
 out:
+	for (i = 0; i < params->num; i++) {
+		if (pairs[i].key)
+			free(pairs[i].key);
+		if (pairs[i].value)
+			free(pairs[i].value);
+	}
 	free(pairs);
 	return ret;
 }
-- 
2.33.0



More information about the Linux-erofs mailing list