[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