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


Reply via email to