{"schema":"libjg2-1",
"vpath":"/git/",
"avatar":"/git/avatar/",
"alang":"",
"gen_ut":1749533326,
"reponame":"libwebsockets",
"desc":"libwebsockets lightweight C networking library",
"owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://libwebsockets.org/repo/libwebsockets",
"f":3,
"items": [
{"schema":"libjg2-1",
"cid":"dca4fbbeb491ee7216e14292ba1b6467",
"commit": {"type":"commit",
"time": 1615734318,
"time_ofs": 0,
"oid_tree": { "oid": "ee7fce9a80c59b0db5676a4cab554d16c02747d5", "alias": []},
"oid":{ "oid": "546c151555f69c0885074e0e57cc8349b4c833a9", "alias": []},
"msg": "ss: add set_metadata that takes a heap copy and make ss-h1 use it",
"sig_commit": { "git_time": { "time": 1615734318, "offset": 0 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },
"sig_author": { "git_time": { "time": 1615718681, "offset": 0 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }},
"body": "ss: add set_metadata that takes a heap copy and make ss-h1 use it\n\nUntil now we set metadata value pointers into the onward wsi ah data\narea... that's OK until we get a situation the wsi has gone away before we\nhave a chance to deliver the metadata over the proxy link.\n\nAdd a variant lws_ss_alloc_set_metadata() that allocates space on the heap\nand takes a copy of the input metadata. Change ss-h1 to alloc copies of\nits metadata so we no longer race the wsi ah lifetime.\n"
,
"diff": "diff --git a/include/libwebsockets/lws-secure-streams.h b/include/libwebsockets/lws-secure-streams.h\nindex f52ff1a..d00cc00 100644\n--- a/include/libwebsockets/lws-secure-streams.h\n+++ b/include/libwebsockets/lws-secure-streams.h\n@@ -630,6 +630,22 @@ lws_ss_set_metadata(struct lws_ss_handle *h, const char *name,\n \t\t const void *value, size_t len);\n \n /**\n+ * lws_ss_alloc_set_metadata() - copy data and bind to ss metadata\n+ *\n+ * \u005cparam h: secure streams handle\n+ * \u005cparam name: metadata name from the policy\n+ * \u005cparam value: pointer to user-managed data to bind to name\n+ * \u005cparam len: length of the user-managed data in value\n+ *\n+ * Same as lws_ss_set_metadata(), but allocates a heap buffer for the data\n+ * first and takes a copy of it, so the original can go out of scope\n+ * immediately after.\n+ */\n+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT\n+lws_ss_alloc_set_metadata(struct lws_ss_handle *h, const char *name,\n+\t\t\t const void *value, size_t len);\n+\n+/**\n * lws_ss_get_metadata() - get current value of stream metadata item\n *\n * \u005cparam h: secure streams handle\ndiff --git a/lib/secure-streams/policy-common.c b/lib/secure-streams/policy-common.c\nindex 18c05dd..9899b41 100644\n--- a/lib/secure-streams/policy-common.c\n+++ b/lib/secure-streams/policy-common.c\n@@ -94,6 +94,49 @@ lws_ss_set_metadata(struct lws_ss_handle *h, const char *name,\n }\n \n int\n+_lws_ss_alloc_set_metadata(lws_ss_metadata_t *omd, const char *name,\n+\t\t\t const void *value, size_t len)\n+{\n+\tuint8_t *p;\n+\tint n;\n+\n+\tif (omd-\u003evalue_on_lws_heap) {\n+\t\tlws_free_set_NULL(omd-\u003evalue__may_own_heap);\n+\t\tomd-\u003evalue_on_lws_heap \u003d 0;\n+\t}\n+\n+\tp \u003d lws_malloc(len, __func__);\n+\tif (!p)\n+\t\treturn 1;\n+\n+\tn \u003d _lws_ss_set_metadata(omd, name, p, len);\n+\tif (n) {\n+\t\tlws_free(p);\n+\t\treturn n;\n+\t}\n+\n+\tmemcpy(p, value, len);\n+\n+\tomd-\u003evalue_on_lws_heap \u003d 1;\n+\n+\treturn 0;\n+}\n+\n+int\n+lws_ss_alloc_set_metadata(struct lws_ss_handle *h, const char *name,\n+\t\t\t const void *value, size_t len)\n+{\n+\tlws_ss_metadata_t *omd \u003d lws_ss_get_handle_metadata(h, name);\n+\n+\tif (!omd) {\n+\t\tlwsl_info(\u0022%s: unknown metadata %s\u005cn\u0022, __func__, name);\n+\t\treturn 1;\n+\t}\n+\n+\treturn _lws_ss_alloc_set_metadata(omd, name, value, len);\n+}\n+\n+int\n lws_ss_get_metadata(struct lws_ss_handle *h, const char *name,\n \t\t const void **value, size_t *len)\n {\ndiff --git a/lib/secure-streams/private-lib-secure-streams.h b/lib/secure-streams/private-lib-secure-streams.h\nindex b386776..7fe4ff0 100644\n--- a/lib/secure-streams/private-lib-secure-streams.h\n+++ b/lib/secure-streams/private-lib-secure-streams.h\n@@ -468,6 +468,10 @@ int\n _lws_ss_set_metadata(lws_ss_metadata_t *omd, const char *name,\n \t\t const void *value, size_t len);\n \n+int\n+_lws_ss_alloc_set_metadata(lws_ss_metadata_t *omd, const char *name,\n+\t\t\t const void *value, size_t len);\n+\n lws_ss_state_return_t\n _lws_ss_client_connect(lws_ss_handle_t *h, int is_retry, void *conn_if_sspc_onw);\n \ndiff --git a/lib/secure-streams/protocols/ss-h1.c b/lib/secure-streams/protocols/ss-h1.c\nindex d2dd267..339c902 100644\n--- a/lib/secure-streams/protocols/ss-h1.c\n+++ b/lib/secure-streams/protocols/ss-h1.c\n@@ -303,7 +303,8 @@ lws_extract_metadata(lws_ss_handle_t *h, struct lws *wsi)\n \t\t\t\t * set the related metadata name to it then\n \t\t\t\t */\n \n-\t\t\t\t_lws_ss_set_metadata(omd, polmd-\u003ename, cp, (unsigned int)n);\n+\t\t\t\t_lws_ss_alloc_set_metadata(omd, polmd-\u003ename, cp,\n+\t\t\t\t\t\t\t (unsigned int)n);\n \n #if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n \t\t\t\t/*\n@@ -363,8 +364,8 @@ lws_extract_metadata(lws_ss_handle_t *h, struct lws *wsi)\n \t\t\t\t\tomd \u003d lws_ss_get_handle_metadata(h,\n \t\t\t\t\t\t\t\t polmd-\u003ename);\n \n-\t\t\t\t\t_lws_ss_set_metadata(omd, polmd-\u003ename,\n-\t\t\t\t\t\t\t p, (size_t)n);\n+\t\t\t\t\t_lws_ss_set_metadata(omd,\n+\t\t\t\t\t\tpolmd-\u003ename, p, (size_t)n);\n \t\t\t\t\tomd-\u003evalue_on_lws_heap \u003d 1;\n \n #if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n@@ -962,12 +963,12 @@ malformed:\n #if defined(LWS_ROLE_H2)\n \t\t\tm \u003d lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COLON_METHOD);\n \t\t\tif (m) {\n-\t\t\t\tif (lws_ss_set_metadata(h, \u0022method\u0022,\n+\t\t\t\tif (lws_ss_alloc_set_metadata(h, \u0022method\u0022,\n \t\t\t\t\t\t lws_hdr_simple_ptr(wsi,\n \t\t\t\t\t\t WSI_TOKEN_HTTP_COLON_METHOD), (unsigned int)m))\n \t\t\t\t\treturn -1;\n \t\t\t\tm \u003d lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COLON_PATH);\n-\t\t\t\tif (lws_ss_set_metadata(h, \u0022path\u0022,\n+\t\t\t\tif (lws_ss_alloc_set_metadata(h, \u0022path\u0022,\n \t\t\t\t\t\t lws_hdr_simple_ptr(wsi,\n \t\t\t\t\t\t WSI_TOKEN_HTTP_COLON_PATH), (unsigned int)m))\n \t\t\t\t\treturn -1;\n@@ -976,20 +977,20 @@ malformed:\n \t\t\t{\n \t\t\t\tm \u003d lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI);\n \t\t\t\tif (m) {\n-\t\t\t\t\tif (lws_ss_set_metadata(h, \u0022path\u0022,\n+\t\t\t\t\tif (lws_ss_alloc_set_metadata(h, \u0022path\u0022,\n \t\t\t\t\t\t\tlws_hdr_simple_ptr(wsi,\n \t\t\t\t\t\t\t\tWSI_TOKEN_GET_URI), (unsigned int)m))\n \t\t\t\t\t\treturn -1;\n-\t\t\t\t\tif (lws_ss_set_metadata(h, \u0022method\u0022, \u0022GET\u0022, 3))\n+\t\t\t\t\tif (lws_ss_alloc_set_metadata(h, \u0022method\u0022, \u0022GET\u0022, 3))\n \t\t\t\t\t\treturn -1;\n \t\t\t\t} else {\n \t\t\t\t\tm \u003d lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI);\n \t\t\t\t\tif (m) {\n-\t\t\t\t\t\tif (lws_ss_set_metadata(h, \u0022path\u0022,\n+\t\t\t\t\t\tif (lws_ss_alloc_set_metadata(h, \u0022path\u0022,\n \t\t\t\t\t\t\t\tlws_hdr_simple_ptr(wsi,\n \t\t\t\t\t\t\t\t\tWSI_TOKEN_POST_URI), (unsigned int)m))\n \t\t\t\t\t\t\treturn -1;\n-\t\t\t\t\t\tif (lws_ss_set_metadata(h, \u0022method\u0022, \u0022POST\u0022, 4))\n+\t\t\t\t\t\tif (lws_ss_alloc_set_metadata(h, \u0022method\u0022, \u0022POST\u0022, 4))\n \t\t\t\t\t\t\treturn -1;\n \t\t\t\t\t}\n \t\t\t\t}\ndiff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c b/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c\nindex c1f4692..a9cce26 100644\n--- a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c\n+++ b/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c\n@@ -146,34 +146,32 @@ ss_s3_state(void *userobj, void *sh, lws_ss_constate_t state,\n \n \tswitch (state) {\n \tcase LWSSSCS_CREATING:\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022s3bucket\u0022,\n-\t\t\t\t s3bucketName, strlen(s3bucketName));\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022s3Obj\u0022,\n-\t\t\t\t s3ObjName, strlen(s3ObjName));\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022,\n-\t\t\t\t \u0022text/plain\u0022, strlen(\u0022text/plain\u0022));\n \t\tcreate_payload(jpl, sizeof(jpl));\n \t\tm-\u003ebuf \u003d (uint8_t *)jpl;\n \t\tm-\u003etotal \u003d sizeof(jpl);\n \n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022region\u0022,\n-\t\t\t\t awsRegion, strlen(awsRegion));\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022service\u0022,\n-\t\t\t\t awsService, strlen(awsService));\n-\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022xacl\u0022,\n-\t\t\t\t \u0022bucket-owner-full-control\u0022,\n-\t\t\t\t strlen(\u0022bucket-owner-full-control\u0022));\n-\n \t\tsigv4_sha256hash_payload(m-\u003ebuf, m-\u003etotal, payload_hash);\n-\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022xcsha256\u0022,\n-\t\t\t\t payload_hash, strlen(payload_hash));\n-\n \t\tmemset(timestamp, 0, sizeof(timestamp));\n \t\tset_time(timestamp);\n-\t\tlws_ss_set_metadata(m-\u003ess, \u0022xdate\u0022,\n-\t\t\t\t timestamp, strlen(timestamp));\n+\n+\t\tif (lws_ss_set_metadata(m-\u003ess, \u0022s3bucket\u0022,\n+\t\t\t\t s3bucketName, strlen(s3bucketName)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022s3Obj\u0022,\n+\t\t\t\t s3ObjName, strlen(s3ObjName)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022ctype\u0022,\n+\t\t\t\t \u0022text/plain\u0022, strlen(\u0022text/plain\u0022)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022region\u0022,\n+\t\t\t\t awsRegion, strlen(awsRegion)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022service\u0022,\n+\t\t\t\t awsService, strlen(awsService)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022xacl\u0022,\n+\t\t\t\t \u0022bucket-owner-full-control\u0022,\n+\t\t\t\t strlen(\u0022bucket-owner-full-control\u0022)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022xcsha256\u0022,\n+\t\t\t\t payload_hash, strlen(payload_hash)) ||\n+\t\t lws_ss_set_metadata(m-\u003ess, \u0022xdate\u0022,\n+\t\t\t\t timestamp, strlen(timestamp)))\n+\t\t\treturn LWSSSSRET_DESTROY_ME;\n \n \t\tlws_ss_request_tx_len(m-\u003ess, m-\u003etotal);\n \t\tbreak;\n","s":{"c":1749533326,"u": 5732}}
],"g": 7472,"chitpc": 0,"ehitpc": 0,"indexed":0
,
"ab": 0, "si": 0, "db":0, "di":0, "sat":0, "lfc": "0000"}