Hi all, While reading the code, I find some code that make memory leak:
- src/port/quotes.c At line 38, at function "escape_single_quotes_ascii", here used "malloc" to get some memory and return the pointer returned by the "malloc". So, any caller used this function shoule free this memory. - /src/bin/initdb/initdb.c At line 327, at function "escape_quotes", which use function "escape_single_quotes_ascii" from above file. But at this file(/src/bin/initdb/initdb.c), there are many place used function "escape_quotes" but have not free the pointer returned by the function, thus cause memory leak. I have fixed this bug and made a patch here: diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 7303bbe..4e5429e 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -1010,6 +1010,7 @@ setup_config(void) char path[MAXPGPATH]; const char *default_timezone; char *autoconflines[3]; + char *escaped; fputs(_("creating configuration files ... "), stdout); fflush(stdout); @@ -1043,20 +1044,28 @@ setup_config(void) conflines = replace_token(conflines, "#port = 5432", repltok); #endif + escaped = escape_quotes(lc_messages); snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", - escape_quotes(lc_messages)); + escaped); + free(escaped); conflines = replace_token(conflines, "#lc_messages = 'C'", repltok); + escaped = escape_quotes(lc_monetary); snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", - escape_quotes(lc_monetary)); + escaped); + free(escaped); conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok); + escaped = escape_quotes(lc_numeric); snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", - escape_quotes(lc_numeric)); + escaped); + free(escaped); conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok); + escaped = escape_quotes(lc_time); snprintf(repltok, sizeof(repltok), "lc_time = '%s'", - escape_quotes(lc_time)); + escaped); + free(escaped); conflines = replace_token(conflines, "#lc_time = 'C'", repltok); switch (locale_date_order(lc_time)) @@ -1074,9 +1083,11 @@ setup_config(void) } conflines = replace_token(conflines, "#datestyle = 'iso, mdy'", repltok); + escaped = escape_quotes(default_text_search_config); snprintf(repltok, sizeof(repltok), "default_text_search_config = 'pg_catalog.%s'", - escape_quotes(default_text_search_config)); + escaped); + free(escaped); conflines = replace_token(conflines, "#default_text_search_config = 'pg_catalog.simple'", repltok); @@ -1084,11 +1095,13 @@ setup_config(void) default_timezone = select_default_timezone(share_path); if (default_timezone) { + escaped = escape_quotes(default_timezone); snprintf(repltok, sizeof(repltok), "timezone = '%s'", - escape_quotes(default_timezone)); + escaped); conflines = replace_token(conflines, "#timezone = 'GMT'", repltok); snprintf(repltok, sizeof(repltok), "log_timezone = '%s'", - escape_quotes(default_timezone)); + escaped); + free(escaped); conflines = replace_token(conflines, "#log_timezone = 'GMT'", repltok); } @@ -1289,6 +1302,7 @@ bootstrap_template1(void) char **bki_lines; char headerline[MAXPGPATH]; char buf[64]; + char *escaped; printf(_("running bootstrap script ... ")); fflush(stdout); @@ -1330,13 +1344,19 @@ bootstrap_template1(void) bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL", FLOAT8PASSBYVAL ? "true" : "false"); - bki_lines = replace_token(bki_lines, "POSTGRES", escape_quotes(username)); + escaped = escape_quotes(username); + bki_lines = replace_token(bki_lines, "POSTGRES", escaped); + free(escaped); bki_lines = replace_token(bki_lines, "ENCODING", encodingid); - bki_lines = replace_token(bki_lines, "LC_COLLATE", escape_quotes(lc_collate)); + escaped = escape_quotes(lc_collate); + bki_lines = replace_token(bki_lines, "LC_COLLATE", escaped); + free(escaped); - bki_lines = replace_token(bki_lines, "LC_CTYPE", escape_quotes(lc_ctype)); + escaped = escape_quotes(lc_ctype); + bki_lines = replace_token(bki_lines, "LC_CTYPE", escaped); + free(escaped); /* * Pass correct LC_xxx environment to bootstrap. @@ -1391,13 +1411,16 @@ setup_auth(FILE *cmdfd) "REVOKE ALL on pg_authid FROM public;\n\n", NULL }; + char *escaped; for (line = pg_authid_setup; *line != NULL; line++) PG_CMD_PUTS(*line); + escaped = escape_quotes(superuser_password); if (superuser_password) PG_CMD_PRINTF2("ALTER USER \"%s\" WITH PASSWORD E'%s';\n\n", - username, escape_quotes(superuser_password)); + username, escaped); + free(escaped); } /* @@ -1582,14 +1605,18 @@ setup_sysviews(FILE *cmdfd) static void setup_description(FILE *cmdfd) { + char *escaped; + PG_CMD_PUTS("CREATE TEMP TABLE tmp_pg_description ( " " objoid oid, " " classname name, " " objsubid int4, " " description text) WITHOUT OIDS;\n\n"); + escaped = escape_quotes(desc_file); PG_CMD_PRINTF1("COPY tmp_pg_description FROM E'%s';\n\n", - escape_quotes(desc_file)); + escaped); + free(escaped); PG_CMD_PUTS("INSERT INTO pg_description " " SELECT t.objoid, c.oid, t.objsubid, t.description " @@ -1601,8 +1628,10 @@ setup_description(FILE *cmdfd) " classname name, " " description text) WITHOUT OIDS;\n\n"); + escaped = escape_quotes(shdesc_file); PG_CMD_PRINTF1("COPY tmp_pg_shdescription FROM E'%s';\n\n", - escape_quotes(shdesc_file)); + escaped); + free(escaped); PG_CMD_PUTS("INSERT INTO pg_shdescription " " SELECT t.objoid, c.oid, t.description " @@ -1846,9 +1875,13 @@ setup_privileges(FILE *cmdfd) " srvacl IS NOT NULL;", NULL }; + char *escaped; + escaped = escape_quotes(username); priv_lines = replace_token(privileges_setup, "$POSTGRES_SUPERUSERNAME", - escape_quotes(username)); + escaped); + free(escaped); + for (line = priv_lines; *line != NULL; line++) PG_CMD_PUTS(*line); } @@ -1889,6 +1922,7 @@ setup_schema(FILE *cmdfd) { char **line; char **lines; + char *escaped; lines = readfile(info_schema_file); @@ -1905,11 +1939,13 @@ setup_schema(FILE *cmdfd) " WHERE implementation_info_name = 'DBMS VERSION';\n\n", infoversion); + escaped = escape_quotes(features_file); PG_CMD_PRINTF1("COPY information_schema.sql_features " " (feature_id, feature_name, sub_feature_id, " " sub_feature_name, is_supported, comments) " " FROM E'%s';\n\n", - escape_quotes(features_file)); + escaped); + free(escaped); } /* Hope this patch can fix this problem. -- Yang Fan