diff --git a/src/box/alter.cc b/src/box/alter.cc index 343ff1dd7e3e54cfa9bdca696d0e1e69a7991990..c713226de761fc2bdad1481446402d49771d02fb 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -368,6 +368,7 @@ space_def_new_from_tuple(struct tuple *tuple, uint32_t errcode) if (def == NULL) tnt_raise(OutOfMemory, size, "malloc", "def"); auto def_guard = make_scoped_guard([=] { space_def_delete(def); }); + def->opts.sql = NULL; memcpy(def->name, name, name_len); def->name[name_len] = 0; identifier_check_xc(def->name); diff --git a/src/box/space_def.c b/src/box/space_def.c index 5c84f20ef456a042798012c2c9ff87ce9a1f1d64..389ef3fd3d68e8d5f08c64d1ded906dcfe5f6f3d 100644 --- a/src/box/space_def.c +++ b/src/box/space_def.c @@ -53,6 +53,15 @@ space_def_dup(const struct space_def *src) return NULL; } memcpy(ret, src, size); + if (src->opts.sql != NULL) { + ret->opts.sql = strdup(src->opts.sql); + if (ret->opts.sql == NULL) { + diag_set(OutOfMemory, strlen(src->opts.sql) + 1, + "strdup", "ret->opts.sql"); + free(ret); + return NULL; + } + } return ret; } @@ -78,5 +87,14 @@ space_def_new(uint32_t id, uint32_t uid, uint32_t exact_field_count, memcpy(def->engine_name, engine_name, engine_len); def->engine_name[engine_len] = 0; def->opts = *opts; + if (opts->sql != NULL) { + def->opts.sql = strdup(opts->sql); + if (def->opts.sql == NULL) { + diag_set(OutOfMemory, strlen(opts->sql) + 1, "strdup", + "def->opts.sql"); + free(def); + return NULL; + } + } return def; } diff --git a/src/box/space_def.h b/src/box/space_def.h index dde3f46352bb23665da4657d322ab1acd563ad16..0b5e4a8e18f809215c6bdf03d11ca6e181fd8e68 100644 --- a/src/box/space_def.h +++ b/src/box/space_def.h @@ -51,7 +51,7 @@ struct space_opts { /** * SQL statement that produced this space. */ - const char *sql; + char *sql; }; extern const struct space_opts space_opts_default; @@ -93,6 +93,7 @@ space_def_sizeof(uint32_t name_len) static inline void space_def_delete(struct space_def *def) { + free(def->opts.sql); free(def); }