os0file.c, fil0fil.c:

  Align file i/o buffers for DIRECT_IO; fix mem_alloc()/mem_free() crash bugs that came from Marko's latest cleanup
parent 73a4598c
...@@ -1409,6 +1409,7 @@ fil_read_flushed_lsn_and_arch_log_no( ...@@ -1409,6 +1409,7 @@ fil_read_flushed_lsn_and_arch_log_no(
byte* buf; byte* buf;
byte* buf2; byte* buf2;
dulint flushed_lsn; dulint flushed_lsn;
buf2 = ut_malloc(2 * UNIV_PAGE_SIZE); buf2 = ut_malloc(2 * UNIV_PAGE_SIZE);
/* Align the memory for a possible read from a raw device */ /* Align the memory for a possible read from a raw device */
buf = ut_align(buf2, UNIV_PAGE_SIZE); buf = ut_align(buf2, UNIV_PAGE_SIZE);
...@@ -1852,8 +1853,6 @@ try_again: ...@@ -1852,8 +1853,6 @@ try_again:
success = os_file_delete(path); success = os_file_delete(path);
} }
mem_free(path);
if (success) { if (success) {
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/* Write a log record about the deletion of the .ibd /* Write a log record about the deletion of the .ibd
...@@ -1869,9 +1868,13 @@ try_again: ...@@ -1869,9 +1868,13 @@ try_again:
fil_op_write_log(MLOG_FILE_DELETE, id, path, NULL, &mtr); fil_op_write_log(MLOG_FILE_DELETE, id, path, NULL, &mtr);
mtr_commit(&mtr); mtr_commit(&mtr);
#endif #endif
mem_free(path);
return(TRUE); return(TRUE);
} }
mem_free(path);
return(FALSE); return(FALSE);
} }
...@@ -2148,6 +2151,7 @@ fil_create_new_single_table_tablespace( ...@@ -2148,6 +2151,7 @@ fil_create_new_single_table_tablespace(
os_file_t file; os_file_t file;
ibool ret; ibool ret;
ulint err; ulint err;
byte* buf2;
byte* page; byte* page;
ibool success; ibool success;
char* path; char* path;
...@@ -2191,12 +2195,14 @@ fil_create_new_single_table_tablespace( ...@@ -2191,12 +2195,14 @@ fil_create_new_single_table_tablespace(
return(DB_ERROR); return(DB_ERROR);
} }
page = ut_malloc(UNIV_PAGE_SIZE); buf2 = ut_malloc(2 * UNIV_PAGE_SIZE);
/* Align the memory for file i/o if we might have O_DIRECT set */
page = ut_align(buf2, UNIV_PAGE_SIZE);
ret = os_file_set_size(path, file, size * UNIV_PAGE_SIZE, 0); ret = os_file_set_size(path, file, size * UNIV_PAGE_SIZE, 0);
if (!ret) { if (!ret) {
ut_free(page); ut_free(buf2);
os_file_close(file); os_file_close(file);
os_file_delete(path); os_file_delete(path);
...@@ -2211,7 +2217,7 @@ fil_create_new_single_table_tablespace( ...@@ -2211,7 +2217,7 @@ fil_create_new_single_table_tablespace(
/* printf("Creating tablespace %s id %lu\n", path, *space_id); */ /* printf("Creating tablespace %s id %lu\n", path, *space_id); */
if (*space_id == ULINT_UNDEFINED) { if (*space_id == ULINT_UNDEFINED) {
ut_free(page); ut_free(buf2);
error_exit: error_exit:
os_file_close(file); os_file_close(file);
os_file_delete(path); os_file_delete(path);
...@@ -2237,7 +2243,7 @@ fil_create_new_single_table_tablespace( ...@@ -2237,7 +2243,7 @@ fil_create_new_single_table_tablespace(
ret = os_file_write(path, file, page, 0, 0, UNIV_PAGE_SIZE); ret = os_file_write(path, file, page, 0, 0, UNIV_PAGE_SIZE);
ut_free(page); ut_free(buf2);
if (!ret) { if (!ret) {
fprintf(stderr, fprintf(stderr,
...@@ -2308,6 +2314,7 @@ fil_reset_too_high_lsns( ...@@ -2308,6 +2314,7 @@ fil_reset_too_high_lsns(
os_file_t file; os_file_t file;
char* filepath; char* filepath;
byte* page; byte* page;
byte* buf2;
dulint flush_lsn; dulint flush_lsn;
ulint space_id; ulint space_id;
ib_longlong file_size; ib_longlong file_size;
...@@ -2320,14 +2327,16 @@ fil_reset_too_high_lsns( ...@@ -2320,14 +2327,16 @@ fil_reset_too_high_lsns(
file = os_file_create_simple_no_error_handling(filepath, OS_FILE_OPEN, file = os_file_create_simple_no_error_handling(filepath, OS_FILE_OPEN,
OS_FILE_READ_WRITE, &success); OS_FILE_READ_WRITE, &success);
if (!success) { if (!success) {
ut_free(filepath); mem_free(filepath);
return(FALSE); return(FALSE);
} }
/* Read the first page of the tablespace */ /* Read the first page of the tablespace */
page = ut_malloc(UNIV_PAGE_SIZE); buf2 = ut_malloc(2 * UNIV_PAGE_SIZE);
/* Align the memory for file i/o if we might have O_DIRECT set */
page = ut_align(buf2, UNIV_PAGE_SIZE);
success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE); success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE);
if (!success) { if (!success) {
...@@ -2414,8 +2423,8 @@ fil_reset_too_high_lsns( ...@@ -2414,8 +2423,8 @@ fil_reset_too_high_lsns(
success = os_file_flush(file); success = os_file_flush(file);
func_exit: func_exit:
os_file_close(file); os_file_close(file);
ut_free(page); ut_free(buf2);
ut_free(filepath); mem_free(filepath);
return(success); return(success);
} }
...@@ -2440,6 +2449,7 @@ fil_open_single_table_tablespace( ...@@ -2440,6 +2449,7 @@ fil_open_single_table_tablespace(
os_file_t file; os_file_t file;
char* filepath; char* filepath;
ibool success; ibool success;
byte* buf2;
byte* page; byte* page;
ulint space_id; ulint space_id;
ibool ret = TRUE; ibool ret = TRUE;
...@@ -2463,14 +2473,16 @@ fil_open_single_table_tablespace( ...@@ -2463,14 +2473,16 @@ fil_open_single_table_tablespace(
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html\n" "InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html\n"
"InnoDB: how to resolve the issue.\n"); "InnoDB: how to resolve the issue.\n");
ut_free(filepath); mem_free(filepath);
return(FALSE); return(FALSE);
} }
/* Read the first page of the tablespace */ /* Read the first page of the tablespace */
page = ut_malloc(UNIV_PAGE_SIZE); buf2 = ut_malloc(2 * UNIV_PAGE_SIZE);
/* Align the memory for file i/o if we might have O_DIRECT set */
page = ut_align(buf2, UNIV_PAGE_SIZE);
success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE); success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE);
...@@ -2507,8 +2519,8 @@ fil_open_single_table_tablespace( ...@@ -2507,8 +2519,8 @@ fil_open_single_table_tablespace(
fil_node_create(filepath, 0, space_id, FALSE); fil_node_create(filepath, 0, space_id, FALSE);
func_exit: func_exit:
os_file_close(file); os_file_close(file);
ut_free(page); ut_free(buf2);
ut_free(filepath); mem_free(filepath);
return(ret); return(ret);
} }
...@@ -2516,7 +2528,7 @@ func_exit: ...@@ -2516,7 +2528,7 @@ func_exit:
#ifdef UNIV_HOTBACKUP #ifdef UNIV_HOTBACKUP
/*********************************************************************** /***********************************************************************
Allocates a file name for an old version of a single-table tablespace. Allocates a file name for an old version of a single-table tablespace.
The string must be freed by caller with mem_free(). */ The string must be freed by caller with ut_free(), NOT with mem_free()! */
static static
char* char*
fil_make_ibbackup_old_name( fil_make_ibbackup_old_name(
...@@ -2549,6 +2561,7 @@ fil_load_single_table_tablespace( ...@@ -2549,6 +2561,7 @@ fil_load_single_table_tablespace(
os_file_t file; os_file_t file;
char* filepath; char* filepath;
ibool success; ibool success;
byte* buf2;
byte* page; byte* page;
ulint space_id; ulint space_id;
ulint size_low; ulint size_low;
...@@ -2655,7 +2668,9 @@ fil_load_single_table_tablespace( ...@@ -2655,7 +2668,9 @@ fil_load_single_table_tablespace(
#endif #endif
/* Read the first page of the tablespace if the size big enough */ /* Read the first page of the tablespace if the size big enough */
page = ut_malloc(UNIV_PAGE_SIZE); buf2 = ut_malloc(2 * UNIV_PAGE_SIZE);
/* Align the memory for file i/o if we might have O_DIRECT set */
page = ut_align(buf2, UNIV_PAGE_SIZE);
if (size >= FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE) { if (size >= FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE) {
success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE); success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE);
...@@ -2691,7 +2706,7 @@ fil_load_single_table_tablespace( ...@@ -2691,7 +2706,7 @@ fil_load_single_table_tablespace(
new_path = fil_make_ibbackup_old_name(filepath); new_path = fil_make_ibbackup_old_name(filepath);
ut_a(os_file_rename(filepath, new_path)); ut_a(os_file_rename(filepath, new_path));
ut_free(page); ut_free(buf2);
ut_free(filepath); ut_free(filepath);
ut_free(new_path); ut_free(new_path);
...@@ -2727,7 +2742,7 @@ fil_load_single_table_tablespace( ...@@ -2727,7 +2742,7 @@ fil_load_single_table_tablespace(
ut_a(os_file_rename(filepath, new_path)); ut_a(os_file_rename(filepath, new_path));
ut_free(page); ut_free(buf2);
ut_free(filepath); ut_free(filepath);
ut_free(new_path); ut_free(new_path);
...@@ -2748,7 +2763,7 @@ fil_load_single_table_tablespace( ...@@ -2748,7 +2763,7 @@ fil_load_single_table_tablespace(
fil_node_create(filepath, 0, space_id, FALSE); fil_node_create(filepath, 0, space_id, FALSE);
func_exit: func_exit:
os_file_close(file); os_file_close(file);
ut_free(page); ut_free(buf2);
ut_free(filepath); ut_free(filepath);
} }
...@@ -2767,7 +2782,7 @@ fil_load_single_table_tablespaces(void) ...@@ -2767,7 +2782,7 @@ fil_load_single_table_tablespaces(void)
{ {
int ret; int ret;
char* dbpath = NULL; char* dbpath = NULL;
ulint dbpath_len = 0; ulint dbpath_len = 100;
os_file_dir_t dir; os_file_dir_t dir;
os_file_dir_t dbdir; os_file_dir_t dbdir;
os_file_stat_t dbinfo; os_file_stat_t dbinfo;
...@@ -2782,7 +2797,7 @@ fil_load_single_table_tablespaces(void) ...@@ -2782,7 +2797,7 @@ fil_load_single_table_tablespaces(void)
return(DB_ERROR); return(DB_ERROR);
} }
dbpath = ut_malloc(dbpath_len); dbpath = mem_alloc(dbpath_len);
/* Scan all directories under the datadir. They are the database /* Scan all directories under the datadir. They are the database
directories of MySQL. */ directories of MySQL. */
...@@ -2806,10 +2821,10 @@ fil_load_single_table_tablespaces(void) ...@@ -2806,10 +2821,10 @@ fil_load_single_table_tablespaces(void)
+ strlen (dbinfo.name) + 2; + strlen (dbinfo.name) + 2;
if (len > dbpath_len) { if (len > dbpath_len) {
dbpath_len = len; dbpath_len = len;
if (!dbpath) { if (!dbpath) {
dbpath = mem_alloc(dbpath_len); dbpath = mem_alloc(dbpath_len);
} } else {
else {
dbpath = mem_realloc(dbpath, dbpath_len, dbpath = mem_realloc(dbpath, dbpath_len,
__FILE__, __LINE__); __FILE__, __LINE__);
} }
...@@ -2863,9 +2878,7 @@ next_datadir_item: ...@@ -2863,9 +2878,7 @@ next_datadir_item:
dir, &dbinfo); dir, &dbinfo);
} }
if (dbpath) { mem_free(dbpath);
ut_free(dbpath);
}
/* At the end of directory we should get 1 as the return value, -1 /* At the end of directory we should get 1 as the return value, -1
if there was an error */ if there was an error */
...@@ -3280,7 +3293,7 @@ fil_extend_space_to_desired_size( ...@@ -3280,7 +3293,7 @@ fil_extend_space_to_desired_size(
/************************************************************************ /************************************************************************
Extends all tablespaces to the size stored in the space header. During the Extends all tablespaces to the size stored in the space header. During the
ibbackup --apply-log phase we extended the spaces on-demand so that log records ibbackup --apply-log phase we extended the spaces on-demand so that log records
could be appllied, but that may have left spaces still too small compared to could be applied, but that may have left spaces still too small compared to
the size stored in the space header. */ the size stored in the space header. */
void void
......
...@@ -2341,21 +2341,24 @@ os_file_dirname( ...@@ -2341,21 +2341,24 @@ os_file_dirname(
pathname */ pathname */
const char* path) /* in: pathname */ const char* path) /* in: pathname */
{ {
/* find the offset of the last slash */ /* Find the offset of the last slash */
const char* last_slash = strrchr(path, OS_FILE_PATH_SEPARATOR); const char* last_slash = strrchr(path, OS_FILE_PATH_SEPARATOR);
if (!last_slash) { if (!last_slash) {
/* no slash in the path, return "." */ /* No slash in the path, return "." */
return(mem_strdup(".")); return(mem_strdup("."));
} }
/* ok, there is a slash */ /* Ok, there is a slash */
if (last_slash == path) { if (last_slash == path) {
/* last slash is the first char of the path */ /* last slash is the first char of the path */
return(mem_strdup("/")); return(mem_strdup("/"));
} }
/* non-trivial directory component */ /* Non-trivial directory component */
return(mem_strdupl(path, last_slash - path)); return(mem_strdupl(path, last_slash - path));
} }
...@@ -2377,23 +2380,26 @@ os_file_create_subdirs_if_needed( ...@@ -2377,23 +2380,26 @@ os_file_create_subdirs_if_needed(
if (strlen(subdir) == 1 if (strlen(subdir) == 1
&& (*subdir == OS_FILE_PATH_SEPARATOR || *subdir == '.')) { && (*subdir == OS_FILE_PATH_SEPARATOR || *subdir == '.')) {
/* subdir is root or cwd, nothing to do */ /* subdir is root or cwd, nothing to do */
ut_free(subdir); mem_free(subdir);
return(TRUE); return(TRUE);
} }
/* test if subdir exists */ /* Test if subdir exists */
success = os_file_status(subdir, &subdir_exists, &type); success = os_file_status(subdir, &subdir_exists, &type);
if (success && !subdir_exists) { if (success && !subdir_exists) {
/* subdir does not exist, create it */ /* subdir does not exist, create it */
success = os_file_create_subdirs_if_needed(subdir); success = os_file_create_subdirs_if_needed(subdir);
if (!success) { if (!success) {
ut_free(subdir); mem_free(subdir);
return(FALSE); return(FALSE);
} }
success = os_file_create_directory(subdir, FALSE); success = os_file_create_directory(subdir, FALSE);
} }
ut_free(subdir); mem_free(subdir);
return(success); return(success);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment